@orchestr-sh/orchestr 1.11.0 → 1.11.2
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/CHANGELOG.md +20 -0
- package/CODE_OF_CONDUCT.md +43 -0
- package/CONTRIBUTING.md +274 -0
- package/dist/Cache/CacheManager.cjs +1 -1
- package/dist/Cache/CacheManager.mjs +1 -1
- package/dist/Cache/CacheManager.mjs.map +1 -1
- package/dist/Cache/Events/CacheFlushed.cjs +1 -1
- package/dist/Cache/Events/CacheFlushed.mjs +1 -1
- package/dist/Cache/Events/CacheFlushed.mjs.map +1 -1
- package/dist/Cache/Events/CacheHit.cjs +1 -1
- package/dist/Cache/Events/CacheHit.mjs +1 -1
- package/dist/Cache/Events/CacheHit.mjs.map +1 -1
- package/dist/Cache/Events/CacheMissed.cjs +1 -1
- package/dist/Cache/Events/CacheMissed.mjs +1 -1
- package/dist/Cache/Events/CacheMissed.mjs.map +1 -1
- package/dist/Cache/Events/KeyForgotten.cjs +1 -1
- package/dist/Cache/Events/KeyForgotten.mjs +1 -1
- package/dist/Cache/Events/KeyForgotten.mjs.map +1 -1
- package/dist/Cache/Events/KeyWritten.cjs +1 -1
- package/dist/Cache/Events/KeyWritten.mjs +1 -1
- package/dist/Cache/Events/KeyWritten.mjs.map +1 -1
- package/dist/Cache/Locks/CacheLock.cjs +1 -1
- package/dist/Cache/Locks/CacheLock.mjs +1 -1
- package/dist/Cache/Locks/CacheLock.mjs.map +1 -1
- package/dist/Cache/Locks/Lock.cjs +1 -1
- package/dist/Cache/Locks/Lock.mjs +1 -1
- package/dist/Cache/Locks/Lock.mjs.map +1 -1
- package/dist/Cache/Repository.cjs +1 -1
- package/dist/Cache/Repository.mjs +1 -1
- package/dist/Cache/Repository.mjs.map +1 -1
- package/dist/Cache/Stores/ArrayStore.cjs +1 -1
- package/dist/Cache/Stores/ArrayStore.mjs +1 -1
- package/dist/Cache/Stores/ArrayStore.mjs.map +1 -1
- package/dist/Cache/Stores/DatabaseStore.cjs +1 -1
- package/dist/Cache/Stores/DatabaseStore.mjs +1 -1
- package/dist/Cache/Stores/DatabaseStore.mjs.map +1 -1
- package/dist/Cache/Stores/FileStore.cjs +1 -1
- package/dist/Cache/Stores/FileStore.mjs +1 -1
- package/dist/Cache/Stores/FileStore.mjs.map +1 -1
- package/dist/Cache/Tags/TagSet.cjs +1 -1
- package/dist/Cache/Tags/TagSet.mjs +1 -1
- package/dist/Cache/Tags/TagSet.mjs.map +1 -1
- package/dist/Cache/Tags/TaggedCache.cjs +1 -1
- package/dist/Cache/Tags/TaggedCache.mjs +1 -1
- package/dist/Cache/Tags/TaggedCache.mjs.map +1 -1
- package/dist/Console/Commands/CacheClearCommand.cjs +1 -1
- package/dist/Console/Commands/CacheClearCommand.mjs +1 -1
- package/dist/Console/Commands/CacheClearCommand.mjs.map +1 -1
- package/dist/Console/Commands/CacheForgetCommand.cjs +1 -1
- package/dist/Console/Commands/CacheForgetCommand.mjs +1 -1
- package/dist/Console/Commands/CacheForgetCommand.mjs.map +1 -1
- package/dist/Console/Commands/CacheTableCommand.cjs +1 -1
- package/dist/Console/Commands/CacheTableCommand.mjs +1 -1
- package/dist/Console/Commands/CacheTableCommand.mjs.map +1 -1
- package/dist/Console/Commands/DeployCommand.mjs.map +1 -1
- package/dist/Console/Commands/DeployEnvCommand.mjs.map +1 -1
- package/dist/Console/Commands/DeployInitCommand.mjs.map +1 -1
- package/dist/Console/Commands/DeployProvisionCommand.mjs.map +1 -1
- package/dist/Console/Commands/DeployRollbackCommand.mjs.map +1 -1
- package/dist/Console/Commands/DeployServerCommand.mjs.map +1 -1
- package/dist/Console/Commands/DeployStatusCommand.mjs.map +1 -1
- package/dist/Console/Commands/EventCacheCommand.cjs +1 -1
- package/dist/Console/Commands/EventCacheCommand.mjs +1 -1
- package/dist/Console/Commands/EventCacheCommand.mjs.map +1 -1
- package/dist/Console/Commands/EventClearCommand.cjs +1 -1
- package/dist/Console/Commands/EventClearCommand.mjs +1 -1
- package/dist/Console/Commands/EventClearCommand.mjs.map +1 -1
- package/dist/Console/Commands/EventListCommand.cjs +1 -1
- package/dist/Console/Commands/EventListCommand.mjs +1 -1
- package/dist/Console/Commands/EventListCommand.mjs.map +1 -1
- package/dist/Console/Commands/MakeControllerCommand.cjs +1 -1
- package/dist/Console/Commands/MakeControllerCommand.mjs +1 -1
- package/dist/Console/Commands/MakeControllerCommand.mjs.map +1 -1
- package/dist/Console/Commands/MakeEventCommand.cjs +1 -1
- package/dist/Console/Commands/MakeEventCommand.mjs +1 -1
- package/dist/Console/Commands/MakeEventCommand.mjs.map +1 -1
- package/dist/Console/Commands/MakeJobCommand.cjs +1 -1
- package/dist/Console/Commands/MakeJobCommand.mjs +1 -1
- package/dist/Console/Commands/MakeJobCommand.mjs.map +1 -1
- package/dist/Console/Commands/MakeListenerCommand.cjs +1 -1
- package/dist/Console/Commands/MakeListenerCommand.mjs +1 -1
- package/dist/Console/Commands/MakeListenerCommand.mjs.map +1 -1
- package/dist/Console/Commands/MakeMigrationCommand.cjs +1 -1
- package/dist/Console/Commands/MakeMigrationCommand.mjs +1 -1
- package/dist/Console/Commands/MakeMigrationCommand.mjs.map +1 -1
- package/dist/Console/Commands/MakeSeederCommand.cjs +1 -1
- package/dist/Console/Commands/MakeSeederCommand.mjs +1 -1
- package/dist/Console/Commands/MakeSeederCommand.mjs.map +1 -1
- package/dist/Console/Commands/MakeViewCommand.cjs +1 -1
- package/dist/Console/Commands/MakeViewCommand.mjs +1 -1
- package/dist/Console/Commands/MakeViewCommand.mjs.map +1 -1
- package/dist/Console/Commands/MigrateCommand.cjs +1 -1
- package/dist/Console/Commands/MigrateCommand.mjs +1 -1
- package/dist/Console/Commands/MigrateCommand.mjs.map +1 -1
- package/dist/Console/Commands/MigrateFreshCommand.cjs +1 -1
- package/dist/Console/Commands/MigrateFreshCommand.mjs +1 -1
- package/dist/Console/Commands/MigrateFreshCommand.mjs.map +1 -1
- package/dist/Console/Commands/MigrateRefreshCommand.cjs +1 -1
- package/dist/Console/Commands/MigrateRefreshCommand.mjs +1 -1
- package/dist/Console/Commands/MigrateRefreshCommand.mjs.map +1 -1
- package/dist/Console/Commands/MigrateResetCommand.cjs +1 -1
- package/dist/Console/Commands/MigrateResetCommand.mjs +1 -1
- package/dist/Console/Commands/MigrateResetCommand.mjs.map +1 -1
- package/dist/Console/Commands/MigrateRollbackCommand.cjs +1 -1
- package/dist/Console/Commands/MigrateRollbackCommand.mjs +1 -1
- package/dist/Console/Commands/MigrateRollbackCommand.mjs.map +1 -1
- package/dist/Console/Commands/MigrateStatusCommand.cjs +1 -1
- package/dist/Console/Commands/MigrateStatusCommand.mjs +1 -1
- package/dist/Console/Commands/MigrateStatusCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueueBatchesTableCommand.cjs +1 -1
- package/dist/Console/Commands/QueueBatchesTableCommand.mjs +1 -1
- package/dist/Console/Commands/QueueBatchesTableCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueueClearCommand.cjs +1 -1
- package/dist/Console/Commands/QueueClearCommand.mjs +1 -1
- package/dist/Console/Commands/QueueClearCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueueFailedCommand.cjs +1 -1
- package/dist/Console/Commands/QueueFailedCommand.mjs +1 -1
- package/dist/Console/Commands/QueueFailedCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueueFailedTableCommand.cjs +1 -1
- package/dist/Console/Commands/QueueFailedTableCommand.mjs +1 -1
- package/dist/Console/Commands/QueueFailedTableCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueueFlushCommand.cjs +1 -1
- package/dist/Console/Commands/QueueFlushCommand.mjs +1 -1
- package/dist/Console/Commands/QueueFlushCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueueForgetCommand.cjs +1 -1
- package/dist/Console/Commands/QueueForgetCommand.mjs +1 -1
- package/dist/Console/Commands/QueueForgetCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueueMonitorCommand.cjs +1 -1
- package/dist/Console/Commands/QueueMonitorCommand.mjs +1 -1
- package/dist/Console/Commands/QueueMonitorCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueuePruneBatchesCommand.cjs +1 -1
- package/dist/Console/Commands/QueuePruneBatchesCommand.mjs +1 -1
- package/dist/Console/Commands/QueuePruneBatchesCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueuePruneFailedCommand.cjs +1 -1
- package/dist/Console/Commands/QueuePruneFailedCommand.mjs +1 -1
- package/dist/Console/Commands/QueuePruneFailedCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueueRestartCommand.cjs +1 -1
- package/dist/Console/Commands/QueueRestartCommand.mjs +1 -1
- package/dist/Console/Commands/QueueRestartCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueueRetryCommand.cjs +1 -1
- package/dist/Console/Commands/QueueRetryCommand.mjs +1 -1
- package/dist/Console/Commands/QueueRetryCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueueTableCommand.cjs +1 -1
- package/dist/Console/Commands/QueueTableCommand.mjs +1 -1
- package/dist/Console/Commands/QueueTableCommand.mjs.map +1 -1
- package/dist/Console/Commands/QueueWorkCommand.cjs +1 -1
- package/dist/Console/Commands/QueueWorkCommand.mjs +1 -1
- package/dist/Console/Commands/QueueWorkCommand.mjs.map +1 -1
- package/dist/Console/Commands/SeedCommand.cjs +1 -1
- package/dist/Console/Commands/SeedCommand.mjs +1 -1
- package/dist/Console/Commands/SeedCommand.mjs.map +1 -1
- package/dist/Console/ConsoleKernel.cjs +1 -1
- package/dist/Console/ConsoleKernel.mjs +1 -1
- package/dist/Console/ConsoleKernel.mjs.map +1 -1
- package/dist/Console/orchestr.cjs +2 -0
- package/dist/Console/orchestr.d.cts +1 -0
- package/dist/Console/orchestr.d.mts +1 -0
- package/dist/Console/orchestr.mjs +3 -0
- package/dist/Console/orchestr.mjs.map +1 -0
- package/dist/Container/Container.mjs.map +1 -1
- package/dist/Database/Adapters/DrizzleAdapter.cjs +1 -1
- package/dist/Database/Adapters/DrizzleAdapter.mjs +1 -1
- package/dist/Database/Adapters/DrizzleAdapter.mjs.map +1 -1
- package/dist/Database/Connection.cjs +1 -1
- package/dist/Database/Connection.mjs +1 -1
- package/dist/Database/Connection.mjs.map +1 -1
- package/dist/Database/DatabaseManager.cjs +1 -1
- package/dist/Database/DatabaseManager.mjs +1 -1
- package/dist/Database/DatabaseManager.mjs.map +1 -1
- package/dist/Database/Ensemble/Ensemble.mjs.map +1 -1
- package/dist/Database/Ensemble/EnsembleBuilder.mjs.map +1 -1
- package/dist/Database/Ensemble/EnsembleCollection.cjs +1 -1
- package/dist/Database/Ensemble/EnsembleCollection.mjs +1 -1
- package/dist/Database/Ensemble/EnsembleCollection.mjs.map +1 -1
- package/dist/Database/Ensemble/Relations/BelongsTo.mjs.map +1 -1
- package/dist/Database/Ensemble/Relations/BelongsToMany.cjs +1 -1
- package/dist/Database/Ensemble/Relations/BelongsToMany.mjs +1 -1
- package/dist/Database/Ensemble/Relations/BelongsToMany.mjs.map +1 -1
- package/dist/Database/Ensemble/Relations/HasMany.mjs.map +1 -1
- package/dist/Database/Ensemble/Relations/MorphTo.mjs.map +1 -1
- package/dist/Database/Ensemble/Relations/MorphToMany.mjs.map +1 -1
- package/dist/Database/Migrations/Blueprint.cjs +1 -1
- package/dist/Database/Migrations/Blueprint.mjs +1 -1
- package/dist/Database/Migrations/Blueprint.mjs.map +1 -1
- package/dist/Database/Migrations/MigrationCreator.cjs +1 -1
- package/dist/Database/Migrations/MigrationCreator.mjs +1 -1
- package/dist/Database/Migrations/MigrationCreator.mjs.map +1 -1
- package/dist/Database/Migrations/MigrationRepository.cjs +1 -1
- package/dist/Database/Migrations/MigrationRepository.mjs +1 -1
- package/dist/Database/Migrations/MigrationRepository.mjs.map +1 -1
- package/dist/Database/Migrations/Migrator.cjs +1 -1
- package/dist/Database/Migrations/Migrator.mjs +1 -1
- package/dist/Database/Migrations/Migrator.mjs.map +1 -1
- package/dist/Database/Migrations/SchemaBuilder.cjs +1 -1
- package/dist/Database/Migrations/SchemaBuilder.mjs +1 -1
- package/dist/Database/Migrations/SchemaBuilder.mjs.map +1 -1
- package/dist/Database/Query/Builder.cjs +1 -1
- package/dist/Database/Query/Builder.mjs +1 -1
- package/dist/Database/Query/Builder.mjs.map +1 -1
- package/dist/Database/Query/Expression.cjs +1 -1
- package/dist/Database/Query/Expression.mjs +1 -1
- package/dist/Database/Query/Expression.mjs.map +1 -1
- package/dist/Database/Seeders/SeederRunner.cjs +1 -1
- package/dist/Database/Seeders/SeederRunner.mjs +1 -1
- package/dist/Database/Seeders/SeederRunner.mjs.map +1 -1
- package/dist/Deploy/Deployer.cjs +1 -1
- package/dist/Deploy/Deployer.mjs +1 -1
- package/dist/Deploy/Deployer.mjs.map +1 -1
- package/dist/Deploy/ProjectConfig.mjs.map +1 -1
- package/dist/Deploy/Provisioner.cjs +1 -1
- package/dist/Deploy/Provisioner.mjs +1 -1
- package/dist/Deploy/Provisioner.mjs.map +1 -1
- package/dist/Deploy/SSHConnection.mjs.map +1 -1
- package/dist/Deploy/SymphonyClient.cjs +1 -1
- package/dist/Deploy/SymphonyClient.mjs +1 -1
- package/dist/Deploy/SymphonyClient.mjs.map +1 -1
- package/dist/Deploy/TarBuilder.mjs.map +1 -1
- package/dist/Deploy/prompt.mjs.map +1 -1
- package/dist/Events/Dispatcher.cjs +1 -1
- package/dist/Events/Dispatcher.d.cts +1 -1
- package/dist/Events/Dispatcher.d.mts +1 -1
- package/dist/Events/Dispatcher.mjs +1 -1
- package/dist/Events/Dispatcher.mjs.map +1 -1
- package/dist/Events/EventServiceProvider.cjs +1 -1
- package/dist/Events/EventServiceProvider.d.cts +1 -1
- package/dist/Events/EventServiceProvider.d.mts +1 -1
- package/dist/Events/EventServiceProvider.mjs.map +1 -1
- package/dist/Events/index.cjs +1 -0
- package/dist/Events/index.d.cts +7 -0
- package/dist/Events/index.d.mts +7 -0
- package/dist/Events/index.mjs +1 -0
- package/dist/Facades/Bus.mjs.map +1 -1
- package/dist/Facades/Cache.mjs.map +1 -1
- package/dist/Facades/Config.mjs.map +1 -1
- package/dist/Facades/DB.mjs.map +1 -1
- package/dist/Facades/Event.d.cts +1 -1
- package/dist/Facades/Event.d.mts +1 -1
- package/dist/Facades/Event.mjs.map +1 -1
- package/dist/Facades/Queue.mjs.map +1 -1
- package/dist/Facades/Route.d.cts +1 -1
- package/dist/Facades/Route.d.mts +1 -1
- package/dist/Facades/Route.mjs.map +1 -1
- package/dist/Facades/View.mjs.map +1 -1
- package/dist/Facades/index.cjs +1 -0
- package/dist/Facades/index.d.cts +9 -0
- package/dist/Facades/index.d.mts +9 -0
- package/dist/Facades/index.mjs +1 -0
- package/dist/Foundation/Application.mjs.map +1 -1
- package/dist/Foundation/Config/ConfigServiceProvider.d.cts +1 -1
- package/dist/Foundation/Config/ConfigServiceProvider.d.mts +1 -1
- package/dist/Foundation/Http/FormRequest.d.cts +1 -1
- package/dist/Foundation/Http/FormRequest.d.mts +1 -1
- package/dist/Foundation/Http/FormRequest.mjs.map +1 -1
- package/dist/Foundation/Http/Rules/AnyOfRule.mjs.map +1 -1
- package/dist/Foundation/Http/Rules/ImageFileRule.mjs.map +1 -1
- package/dist/Foundation/Http/Validator.mjs.map +1 -1
- package/dist/Queue/Batching/Batch.cjs +1 -1
- package/dist/Queue/Batching/Batch.mjs +1 -1
- package/dist/Queue/Batching/Batch.mjs.map +1 -1
- package/dist/Queue/Batching/PendingBatch.cjs +1 -1
- package/dist/Queue/Batching/PendingBatch.mjs +1 -1
- package/dist/Queue/Batching/PendingBatch.mjs.map +1 -1
- package/dist/Queue/Concerns/Dispatchable.mjs.map +1 -1
- package/dist/Queue/Drivers/DatabaseDriver.cjs +1 -1
- package/dist/Queue/Drivers/DatabaseDriver.mjs +1 -1
- package/dist/Queue/Drivers/DatabaseDriver.mjs.map +1 -1
- package/dist/Queue/Drivers/NullDriver.cjs +1 -1
- package/dist/Queue/Drivers/NullDriver.mjs +1 -1
- package/dist/Queue/Drivers/NullDriver.mjs.map +1 -1
- package/dist/Queue/Drivers/SyncDriver.cjs +1 -1
- package/dist/Queue/Drivers/SyncDriver.mjs +1 -1
- package/dist/Queue/Drivers/SyncDriver.mjs.map +1 -1
- package/dist/Queue/Events/JobExceptionOccurred.cjs +1 -1
- package/dist/Queue/Events/JobExceptionOccurred.mjs +1 -1
- package/dist/Queue/Events/JobExceptionOccurred.mjs.map +1 -1
- package/dist/Queue/Events/JobFailed.cjs +1 -1
- package/dist/Queue/Events/JobFailed.mjs +1 -1
- package/dist/Queue/Events/JobFailed.mjs.map +1 -1
- package/dist/Queue/Events/JobProcessed.cjs +1 -1
- package/dist/Queue/Events/JobProcessed.mjs +1 -1
- package/dist/Queue/Events/JobProcessed.mjs.map +1 -1
- package/dist/Queue/Events/JobProcessing.cjs +1 -1
- package/dist/Queue/Events/JobProcessing.mjs +1 -1
- package/dist/Queue/Events/JobProcessing.mjs.map +1 -1
- package/dist/Queue/Events/JobQueued.cjs +1 -1
- package/dist/Queue/Events/JobQueued.mjs +1 -1
- package/dist/Queue/Events/JobQueued.mjs.map +1 -1
- package/dist/Queue/Events/JobRetryRequested.cjs +1 -1
- package/dist/Queue/Events/JobRetryRequested.mjs +1 -1
- package/dist/Queue/Events/JobRetryRequested.mjs.map +1 -1
- package/dist/Queue/Events/WorkerStopping.cjs +1 -1
- package/dist/Queue/Events/WorkerStopping.mjs +1 -1
- package/dist/Queue/Events/WorkerStopping.mjs.map +1 -1
- package/dist/Queue/Failed/DatabaseFailedJobProvider.cjs +1 -1
- package/dist/Queue/Failed/DatabaseFailedJobProvider.mjs +1 -1
- package/dist/Queue/Failed/DatabaseFailedJobProvider.mjs.map +1 -1
- package/dist/Queue/Middleware/RateLimited.cjs +1 -1
- package/dist/Queue/Middleware/RateLimited.mjs +1 -1
- package/dist/Queue/Middleware/RateLimited.mjs.map +1 -1
- package/dist/Queue/Middleware/ThrottlesExceptions.cjs +1 -1
- package/dist/Queue/Middleware/ThrottlesExceptions.mjs +1 -1
- package/dist/Queue/Middleware/ThrottlesExceptions.mjs.map +1 -1
- package/dist/Queue/Middleware/WithoutOverlapping.cjs +1 -1
- package/dist/Queue/Middleware/WithoutOverlapping.mjs +1 -1
- package/dist/Queue/Middleware/WithoutOverlapping.mjs.map +1 -1
- package/dist/Queue/PendingChain.cjs +1 -1
- package/dist/Queue/PendingChain.mjs +1 -1
- package/dist/Queue/PendingChain.mjs.map +1 -1
- package/dist/Queue/PendingDispatch.cjs +1 -1
- package/dist/Queue/PendingDispatch.mjs +1 -1
- package/dist/Queue/PendingDispatch.mjs.map +1 -1
- package/dist/Queue/QueueManager.cjs +1 -1
- package/dist/Queue/QueueManager.mjs +1 -1
- package/dist/Queue/QueueManager.mjs.map +1 -1
- package/dist/Queue/QueueServiceProvider.mjs.map +1 -1
- package/dist/Queue/Workers/Worker.cjs +1 -1
- package/dist/Queue/Workers/Worker.mjs +1 -1
- package/dist/Queue/Workers/Worker.mjs.map +1 -1
- package/dist/Routing/Request.mjs.map +1 -1
- package/dist/Routing/Response.mjs.map +1 -1
- package/dist/Routing/Route.d.cts +1 -1
- package/dist/Routing/Route.d.mts +1 -1
- package/dist/Routing/Router.d.cts +1 -1
- package/dist/Routing/Router.d.mts +1 -1
- package/dist/Support/EventDiscovery.cjs +1 -1
- package/dist/Support/EventDiscovery.mjs +1 -1
- package/dist/Support/EventDiscovery.mjs.map +1 -1
- package/dist/Support/Testing/Fakes/EventFake.cjs +1 -1
- package/dist/Support/Testing/Fakes/EventFake.d.cts +1 -1
- package/dist/Support/Testing/Fakes/EventFake.d.mts +1 -1
- package/dist/Support/Testing/Fakes/EventFake.mjs +1 -1
- package/dist/Support/Testing/Fakes/EventFake.mjs.map +1 -1
- package/dist/Support/helpers.mjs.map +1 -1
- package/dist/View/Engines/TemplateEngine.mjs.map +1 -1
- package/dist/index.d.cts +19 -19
- package/dist/index.d.mts +19 -19
- package/docs/events-typescript-usage.md +126 -0
- package/docs/future-improvements.md +49 -0
- package/docs/validation.md +201 -0
- package/package.json +65 -31
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dispatcher.mjs","names":[],"sources":["../../src/Events/Dispatcher.ts"],"sourcesContent":["import type { Container } from '@/Container/Container';\nimport type { DispatcherContract } from './Contracts/Dispatcher';\nimport type { Event } from './Event';\nimport type { EventListener, EventSubscriber, ListenerInterface } from './types';\n\n/**\n * Event Dispatcher\n *\n * The core event dispatcher implementation. Manages event listeners,\n * handles wildcard patterns, and dispatches events to registered listeners.\n *\n * @example\n * ```typescript\n * const dispatcher = new Dispatcher(container);\n *\n * // Register listeners\n * dispatcher.listen('user.registered', SendWelcomeEmail);\n * dispatcher.listen('user.*', LogUserActivity);\n *\n * // Dispatch events\n * dispatcher.dispatch(new UserRegistered(user));\n * ```\n */\nexport class Dispatcher implements DispatcherContract {\n /**\n * Registered event listeners (direct event name matches)\n */\n protected listeners: Map<string, EventListener[]> = new Map();\n\n /**\n * Wildcard event listeners (patterns like 'user.*')\n */\n protected wildcards: Map<string, EventListener[]> = new Map();\n\n /**\n * Queued events waiting to be flushed\n */\n protected queuedEvents: Map<string, Array<{ payload: any[] }>> = new Map();\n\n /**\n * Create a new event dispatcher\n *\n * @param container - The service container for resolving listeners\n */\n constructor(protected container: Container) {}\n\n /**\n * Register an event listener\n *\n * Supports single events, multiple events, and wildcard patterns\n *\n * @param events - Event name(s) to listen for\n * @param listener - Listener to invoke when event is dispatched\n */\n listen(events: string | string[], listener: EventListener): void {\n const eventArray = Array.isArray(events) ? events : [events];\n\n for (const event of eventArray) {\n if (event.includes('*')) {\n this.setupWildcardListen(event, listener);\n } else {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event)!.push(listener);\n }\n }\n }\n\n /**\n * Check if an event has any listeners\n *\n * Checks both direct listeners and wildcard matches\n *\n * @param eventName - The event name to check\n * @returns True if the event has listeners\n */\n hasListeners(eventName: string): boolean {\n return this.getListeners(eventName).length > 0;\n }\n\n /**\n * Register an event subscriber\n *\n * Subscribers can register multiple event listeners at once\n *\n * @param subscriber - The subscriber instance\n */\n subscribe(subscriber: EventSubscriber): void {\n const result = subscriber.subscribe(this);\n\n // If the subscriber returns a mapping, register those listeners\n if (result && typeof result === 'object') {\n for (const [event, listeners] of Object.entries(result)) {\n const listenerArray = Array.isArray(listeners) ? listeners : [listeners];\n\n for (const listener of listenerArray) {\n this.listen(event, listener);\n }\n }\n }\n }\n\n /**\n * Dispatch an event to all listeners\n *\n * @param event - Event name or instance\n * @param payload - Additional arguments to pass to listeners\n * @param halt - Stop dispatching if a listener returns false\n * @returns Array of results from listeners\n */\n dispatch(event: string | Event, payload: any[] = [], halt: boolean = false): any[] {\n const [eventName, eventInstance] = this.parseEventAndPayload(event, payload);\n\n // Check if we should broadcast this event (for future broadcasting support)\n if (eventInstance) {\n this.shouldBroadcast(eventInstance, payload);\n }\n\n const listeners = this.getListeners(eventName);\n const responses: any[] = [];\n\n for (const listener of listeners) {\n const response = this.callListener(listener, eventInstance || eventName, payload);\n\n // If halting and response is false, stop propagation\n if (halt && response === false) {\n return responses;\n }\n\n // Collect non-null responses\n if (response !== null && response !== undefined) {\n responses.push(response);\n }\n }\n\n return responses;\n }\n\n /**\n * Dispatch an event until a listener returns a non-null response\n *\n * @param event - Event name or instance\n * @param payload - Additional arguments to pass to listeners\n * @returns The first non-null response from a listener\n */\n until(event: string | Event, payload: any[] = []): any {\n const [eventName, eventInstance] = this.parseEventAndPayload(event, payload);\n const listeners = this.getListeners(eventName);\n\n for (const listener of listeners) {\n const response = this.callListener(listener, eventInstance || eventName, payload);\n\n if (response !== null && response !== undefined) {\n return response;\n }\n }\n\n return null;\n }\n\n /**\n * Queue an event for later dispatch\n *\n * @param event - Event name\n * @param payload - Event payload\n */\n push(event: string, payload: any[] = []): void {\n if (!this.queuedEvents.has(event)) {\n this.queuedEvents.set(event, []);\n }\n\n this.queuedEvents.get(event)!.push({ payload });\n }\n\n /**\n * Flush (dispatch) all queued events for a specific event name\n *\n * @param event - Event name to flush\n */\n flush(event: string): void {\n const queued = this.queuedEvents.get(event);\n\n if (!queued || queued.length === 0) {\n return;\n }\n\n // Dispatch each queued event\n for (const { payload } of queued) {\n this.dispatch(event, payload);\n }\n\n // Clear the queue for this event\n this.queuedEvents.delete(event);\n }\n\n /**\n * Remove all listeners for an event\n *\n * @param event - Event name\n */\n forget(event: string): void {\n this.listeners.delete(event);\n this.wildcards.delete(event);\n }\n\n /**\n * Clear all queued events\n */\n forgetPushed(): void {\n this.queuedEvents.clear();\n }\n\n /**\n * Get raw listener mappings\n *\n * @returns Map of event names to their listeners\n */\n getRawListeners(): Map<string, EventListener[]> {\n return this.listeners;\n }\n\n /**\n * Get all listeners for an event (direct + wildcard matches)\n *\n * @param eventName - The event name\n * @returns Array of listeners\n */\n protected getListeners(eventName: string): EventListener[] {\n const directListeners = this.listeners.get(eventName) || [];\n const wildcardListeners = this.getWildcardListeners(eventName);\n\n return [...directListeners, ...wildcardListeners];\n }\n\n /**\n * Setup a wildcard listener\n *\n * @param event - Wildcard pattern (e.g., 'user.*')\n * @param listener - Listener to invoke\n */\n protected setupWildcardListen(event: string, listener: EventListener): void {\n if (!this.wildcards.has(event)) {\n this.wildcards.set(event, []);\n }\n\n this.wildcards.get(event)!.push(listener);\n }\n\n /**\n * Get all wildcard listeners matching an event name\n *\n * @param eventName - The event name to match\n * @returns Array of matching listeners\n */\n protected getWildcardListeners(eventName: string): EventListener[] {\n const matched: EventListener[] = [];\n\n for (const [pattern, listeners] of this.wildcards) {\n if (this.wildcardMatch(pattern, eventName)) {\n matched.push(...listeners);\n }\n }\n\n return matched;\n }\n\n /**\n * Check if an event name matches a wildcard pattern\n *\n * Supports patterns like:\n * - 'event.*' - Matches 'event.created', 'event.updated', etc.\n * - 'event.*.action' - Matches 'event.user.action', 'event.post.action', etc.\n * - '*' - Matches everything\n *\n * @param pattern - Wildcard pattern\n * @param eventName - Event name to test\n * @returns True if the pattern matches\n */\n protected wildcardMatch(pattern: string, eventName: string): boolean {\n // Convert wildcard pattern to regex\n // Escape special regex characters except *\n const regexPattern = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(eventName);\n }\n\n /**\n * Parse event and payload from dispatch arguments\n *\n * @param event - Event name or instance\n * @param payload - Event payload\n * @returns Tuple of [eventName, eventInstance]\n */\n protected parseEventAndPayload(event: string | Event, payload: any[]): [string, Event | null] {\n if (typeof event === 'string') {\n return [event, null];\n }\n\n // Event is an object\n return [event.constructor.name, event];\n }\n\n /**\n * Call a listener with the event and payload\n *\n * Handles different listener types (closure, class instance, string reference)\n *\n * @param listener - The listener to call\n * @param event - Event name or instance\n * @param payload - Additional payload arguments\n * @returns The result from the listener\n */\n protected callListener(listener: EventListener, event: string | Event, payload: any[]): any {\n try {\n const callable = this.makeListener(listener);\n return callable(event, ...payload);\n } catch (error) {\n // Re-throw the error to allow application-level error handling\n console.error(`Error calling event listener:`, error);\n throw error;\n }\n }\n\n /**\n * Create a callable function from a listener\n *\n * Resolves string listeners from container and wraps class instances\n *\n * @param listener - The listener to convert\n * @param wildcard - Whether this is for a wildcard listener\n * @returns Callable function\n */\n protected makeListener(listener: EventListener, wildcard: boolean = false): (...args: any[]) => any {\n // If it's a string, resolve from container\n if (typeof listener === 'string') {\n return this.createClassListener(listener, wildcard);\n }\n\n // If it's a function/class constructor\n if (typeof listener === 'function') {\n // Check if it's a class constructor (has prototype with handle method)\n if (listener.prototype && typeof listener.prototype.handle === 'function') {\n // It's a class constructor, instantiate and call handle\n return (event: Event, ...payload: any[]) => {\n const instance = new (listener as any)();\n return instance.handle(event);\n };\n }\n\n // It's a regular function (closure), return as-is\n return listener;\n }\n\n // If it's a class instance with handle method\n if (typeof listener === 'object' && 'handle' in listener) {\n const instance = listener as ListenerInterface;\n return (event: Event, ...payload: any[]) => {\n return instance.handle(event);\n };\n }\n\n throw new Error(`Invalid listener type: ${typeof listener}`);\n }\n\n /**\n * Create a listener from a class string reference\n *\n * Resolves the class from the container and calls its handle method\n *\n * @param listener - Class name/path to resolve\n * @param wildcard - Whether this is for a wildcard listener\n * @returns Callable function\n */\n protected createClassListener(listener: string, wildcard: boolean = false): (...args: any[]) => any {\n return (event: Event, ...payload: any[]) => {\n // Resolve the listener class from the container\n const instance = this.container.make<ListenerInterface>(listener);\n\n if (!instance || typeof instance.handle !== 'function') {\n throw new Error(`Listener [${listener}] does not have a handle method`);\n }\n\n // Call the handle method\n return instance.handle(event);\n };\n }\n\n /**\n * Check if an event should broadcast\n *\n * This is a placeholder for future broadcasting support\n *\n * @param event - The event instance\n * @param payload - The event payload\n * @returns True if should broadcast\n */\n protected shouldBroadcast(event: Event, payload: any[]): boolean {\n // Check if event has shouldBroadcast method and it returns true\n if (typeof (event as any).shouldBroadcast === 'function') {\n return (event as any).shouldBroadcast();\n }\n\n // Check if event has broadcastOn method that returns channels\n if (typeof (event as any).broadcastOn === 'function') {\n const channels = (event as any).broadcastOn();\n return Array.isArray(channels) ? channels.length > 0 : !!channels;\n }\n\n return false;\n }\n}\n"],"mappings":"AAuBA,IAAa,EAAb,KAAsD,CAIpD,UAAoD,IAAI,IAKxD,UAAoD,IAAI,IAKxD,aAAiE,IAAI,IAOrE,YAAY,EAAgC,CAAtB,KAAA,UAAA,EAUtB,OAAO,EAA2B,EAA+B,CAC/D,IAAM,EAAa,MAAM,QAAQ,EAAO,CAAG,EAAS,CAAC,EAAO,CAE5D,IAAK,IAAM,KAAS,EACd,EAAM,SAAS,IAAI,CACrB,KAAK,oBAAoB,EAAO,EAAS,EAEpC,KAAK,UAAU,IAAI,EAAM,EAC5B,KAAK,UAAU,IAAI,EAAO,EAAE,CAAC,CAE/B,KAAK,UAAU,IAAI,EAAM,CAAE,KAAK,EAAS,EAa/C,aAAa,EAA4B,CACvC,OAAO,KAAK,aAAa,EAAU,CAAC,OAAS,EAU/C,UAAU,EAAmC,CAC3C,IAAM,EAAS,EAAW,UAAU,KAAK,CAGzC,GAAI,GAAU,OAAO,GAAW,SAC9B,IAAK,GAAM,CAAC,EAAO,KAAc,OAAO,QAAQ,EAAO,CAAE,CACvD,IAAM,EAAgB,MAAM,QAAQ,EAAU,CAAG,EAAY,CAAC,EAAU,CAExE,IAAK,IAAM,KAAY,EACrB,KAAK,OAAO,EAAO,EAAS,EAcpC,SAAS,EAAuB,EAAiB,EAAE,CAAE,EAAgB,GAAc,CACjF,GAAM,CAAC,EAAW,GAAiB,KAAK,qBAAqB,EAAO,EAAQ,CAGxE,GACF,KAAK,gBAAgB,EAAe,EAAQ,CAG9C,IAAM,EAAY,KAAK,aAAa,EAAU,CACxC,EAAmB,EAAE,CAE3B,IAAK,IAAM,KAAY,EAAW,CAChC,IAAM,EAAW,KAAK,aAAa,EAAU,GAAiB,EAAW,EAAQ,CAGjF,GAAI,GAAQ,IAAa,GACvB,OAAO,EAIL,GAAa,MACf,EAAU,KAAK,EAAS,CAI5B,OAAO,EAUT,MAAM,EAAuB,EAAiB,EAAE,CAAO,CACrD,GAAM,CAAC,EAAW,GAAiB,KAAK,qBAAqB,EAAO,EAAQ,CACtE,EAAY,KAAK,aAAa,EAAU,CAE9C,IAAK,IAAM,KAAY,EAAW,CAChC,IAAM,EAAW,KAAK,aAAa,EAAU,GAAiB,EAAW,EAAQ,CAEjF,GAAI,GAAa,KACf,OAAO,EAIX,OAAO,KAST,KAAK,EAAe,EAAiB,EAAE,CAAQ,CACxC,KAAK,aAAa,IAAI,EAAM,EAC/B,KAAK,aAAa,IAAI,EAAO,EAAE,CAAC,CAGlC,KAAK,aAAa,IAAI,EAAM,CAAE,KAAK,CAAE,UAAS,CAAC,CAQjD,MAAM,EAAqB,CACzB,IAAM,EAAS,KAAK,aAAa,IAAI,EAAM,CAEvC,MAAC,GAAU,EAAO,SAAW,GAKjC,KAAK,GAAM,CAAE,aAAa,EACxB,KAAK,SAAS,EAAO,EAAQ,CAI/B,KAAK,aAAa,OAAO,EAAM,EAQjC,OAAO,EAAqB,CAC1B,KAAK,UAAU,OAAO,EAAM,CAC5B,KAAK,UAAU,OAAO,EAAM,CAM9B,cAAqB,CACnB,KAAK,aAAa,OAAO,CAQ3B,iBAAgD,CAC9C,OAAO,KAAK,UASd,aAAuB,EAAoC,CACzD,IAAM,EAAkB,KAAK,UAAU,IAAI,EAAU,EAAI,EAAE,CACrD,EAAoB,KAAK,qBAAqB,EAAU,CAE9D,MAAO,CAAC,GAAG,EAAiB,GAAG,EAAkB,CASnD,oBAA8B,EAAe,EAA+B,CACrE,KAAK,UAAU,IAAI,EAAM,EAC5B,KAAK,UAAU,IAAI,EAAO,EAAE,CAAC,CAG/B,KAAK,UAAU,IAAI,EAAM,CAAE,KAAK,EAAS,CAS3C,qBAA+B,EAAoC,CACjE,IAAM,EAA2B,EAAE,CAEnC,IAAK,GAAM,CAAC,EAAS,KAAc,KAAK,UAClC,KAAK,cAAc,EAAS,EAAU,EACxC,EAAQ,KAAK,GAAG,EAAU,CAI9B,OAAO,EAeT,cAAwB,EAAiB,EAA4B,CAGnE,IAAM,EAAe,EAAQ,QAAQ,qBAAsB,OAAO,CAAC,QAAQ,MAAO,KAAK,CAGvF,OADkB,OAAO,IAAI,EAAa,GAAG,CAChC,KAAK,EAAU,CAU9B,qBAA+B,EAAuB,EAAwC,CAM5F,OALI,OAAO,GAAU,SACZ,CAAC,EAAO,KAAK,CAIf,CAAC,EAAM,YAAY,KAAM,EAAM,CAaxC,aAAuB,EAAyB,EAAuB,EAAqB,CAC1F,GAAI,CAEF,OADiB,KAAK,aAAa,EAAS,CAC5B,EAAO,GAAG,EAAQ,OAC3B,EAAO,CAGd,MADA,QAAQ,MAAM,gCAAiC,EAAM,CAC/C,GAaV,aAAuB,EAAyB,EAAoB,GAAgC,CAElG,GAAI,OAAO,GAAa,SACtB,OAAO,KAAK,oBAAoB,EAAU,EAAS,CAIrD,GAAI,OAAO,GAAa,WAWtB,OATI,EAAS,WAAa,OAAO,EAAS,UAAU,QAAW,YAErD,EAAc,GAAG,IACN,IAAK,GAAkB,CACxB,OAAO,EAAM,CAK1B,EAIT,GAAI,OAAO,GAAa,UAAY,WAAY,EAAU,CACxD,IAAM,EAAW,EACjB,OAAQ,EAAc,GAAG,IAChB,EAAS,OAAO,EAAM,CAIjC,MAAU,MAAM,0BAA0B,OAAO,IAAW,CAY9D,oBAA8B,EAAkB,EAAoB,GAAgC,CAClG,OAAQ,EAAc,GAAG,IAAmB,CAE1C,IAAM,EAAW,KAAK,UAAU,KAAwB,EAAS,CAEjE,GAAI,CAAC,GAAY,OAAO,EAAS,QAAW,WAC1C,MAAU,MAAM,aAAa,EAAS,iCAAiC,CAIzE,OAAO,EAAS,OAAO,EAAM,EAajC,gBAA0B,EAAc,EAAyB,CAE/D,GAAI,OAAQ,EAAc,iBAAoB,WAC5C,OAAQ,EAAc,iBAAiB,CAIzC,GAAI,OAAQ,EAAc,aAAgB,WAAY,CACpD,IAAM,EAAY,EAAc,aAAa,CAC7C,OAAO,MAAM,QAAQ,EAAS,CAAG,EAAS,OAAS,EAAI,CAAC,CAAC,EAG3D,MAAO"}
|
|
1
|
+
{"version":3,"file":"Dispatcher.mjs","names":[],"sources":["../../src/Events/Dispatcher.ts"],"sourcesContent":["import type { Container } from '@/Container/Container';\nimport type { DispatcherContract } from './Contracts/Dispatcher';\nimport type { Event } from './Event';\nimport type { EventListener, EventSubscriber, ListenerInterface } from './types';\n\n/**\n * Event Dispatcher\n *\n * The core event dispatcher implementation. Manages event listeners,\n * handles wildcard patterns, and dispatches events to registered listeners.\n *\n * @example\n * ```typescript\n * const dispatcher = new Dispatcher(container);\n *\n * // Register listeners\n * dispatcher.listen('user.registered', SendWelcomeEmail);\n * dispatcher.listen('user.*', LogUserActivity);\n *\n * // Dispatch events\n * dispatcher.dispatch(new UserRegistered(user));\n * ```\n */\nexport class Dispatcher implements DispatcherContract {\n /**\n * Registered event listeners (direct event name matches)\n */\n protected listeners: Map<string, EventListener[]> = new Map();\n\n /**\n * Wildcard event listeners (patterns like 'user.*')\n */\n protected wildcards: Map<string, EventListener[]> = new Map();\n\n /**\n * Queued events waiting to be flushed\n */\n protected queuedEvents: Map<string, Array<{ payload: any[] }>> = new Map();\n\n /**\n * Create a new event dispatcher\n *\n * @param container - The service container for resolving listeners\n */\n constructor(protected container: Container) {}\n\n /**\n * Register an event listener\n *\n * Supports single events, multiple events, and wildcard patterns\n *\n * @param events - Event name(s) to listen for\n * @param listener - Listener to invoke when event is dispatched\n */\n listen(events: string | string[], listener: EventListener): void {\n const eventArray = Array.isArray(events) ? events : [events];\n\n for (const event of eventArray) {\n if (event.includes('*')) {\n this.setupWildcardListen(event, listener);\n } else {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event)!.push(listener);\n }\n }\n }\n\n /**\n * Check if an event has any listeners\n *\n * Checks both direct listeners and wildcard matches\n *\n * @param eventName - The event name to check\n * @returns True if the event has listeners\n */\n hasListeners(eventName: string): boolean {\n return this.getListeners(eventName).length > 0;\n }\n\n /**\n * Register an event subscriber\n *\n * Subscribers can register multiple event listeners at once\n *\n * @param subscriber - The subscriber instance\n */\n subscribe(subscriber: EventSubscriber): void {\n const result = subscriber.subscribe(this);\n\n // If the subscriber returns a mapping, register those listeners\n if (result && typeof result === 'object') {\n for (const [event, listeners] of Object.entries(result)) {\n const listenerArray = Array.isArray(listeners) ? listeners : [listeners];\n\n for (const listener of listenerArray) {\n this.listen(event, listener);\n }\n }\n }\n }\n\n /**\n * Dispatch an event to all listeners\n *\n * @param event - Event name or instance\n * @param payload - Additional arguments to pass to listeners\n * @param halt - Stop dispatching if a listener returns false\n * @returns Array of results from listeners\n */\n dispatch(event: string | Event, payload: any[] = [], halt: boolean = false): any[] {\n const [eventName, eventInstance] = this.parseEventAndPayload(event, payload);\n\n // Check if we should broadcast this event (for future broadcasting support)\n if (eventInstance) {\n this.shouldBroadcast(eventInstance, payload);\n }\n\n const listeners = this.getListeners(eventName);\n const responses: any[] = [];\n\n for (const listener of listeners) {\n const response = this.callListener(listener, eventInstance || eventName, payload);\n\n // If halting and response is false, stop propagation\n if (halt && response === false) {\n return responses;\n }\n\n // Collect non-null responses\n if (response !== null && response !== undefined) {\n responses.push(response);\n }\n }\n\n return responses;\n }\n\n /**\n * Dispatch an event until a listener returns a non-null response\n *\n * @param event - Event name or instance\n * @param payload - Additional arguments to pass to listeners\n * @returns The first non-null response from a listener\n */\n until(event: string | Event, payload: any[] = []): any {\n const [eventName, eventInstance] = this.parseEventAndPayload(event, payload);\n const listeners = this.getListeners(eventName);\n\n for (const listener of listeners) {\n const response = this.callListener(listener, eventInstance || eventName, payload);\n\n if (response !== null && response !== undefined) {\n return response;\n }\n }\n\n return null;\n }\n\n /**\n * Queue an event for later dispatch\n *\n * @param event - Event name\n * @param payload - Event payload\n */\n push(event: string, payload: any[] = []): void {\n if (!this.queuedEvents.has(event)) {\n this.queuedEvents.set(event, []);\n }\n\n this.queuedEvents.get(event)!.push({ payload });\n }\n\n /**\n * Flush (dispatch) all queued events for a specific event name\n *\n * @param event - Event name to flush\n */\n flush(event: string): void {\n const queued = this.queuedEvents.get(event);\n\n if (!queued || queued.length === 0) {\n return;\n }\n\n // Dispatch each queued event\n for (const { payload } of queued) {\n this.dispatch(event, payload);\n }\n\n // Clear the queue for this event\n this.queuedEvents.delete(event);\n }\n\n /**\n * Remove all listeners for an event\n *\n * @param event - Event name\n */\n forget(event: string): void {\n this.listeners.delete(event);\n this.wildcards.delete(event);\n }\n\n /**\n * Clear all queued events\n */\n forgetPushed(): void {\n this.queuedEvents.clear();\n }\n\n /**\n * Get raw listener mappings\n *\n * @returns Map of event names to their listeners\n */\n getRawListeners(): Map<string, EventListener[]> {\n return this.listeners;\n }\n\n /**\n * Get all listeners for an event (direct + wildcard matches)\n *\n * @param eventName - The event name\n * @returns Array of listeners\n */\n protected getListeners(eventName: string): EventListener[] {\n const directListeners = this.listeners.get(eventName) || [];\n const wildcardListeners = this.getWildcardListeners(eventName);\n\n return [...directListeners, ...wildcardListeners];\n }\n\n /**\n * Setup a wildcard listener\n *\n * @param event - Wildcard pattern (e.g., 'user.*')\n * @param listener - Listener to invoke\n */\n protected setupWildcardListen(event: string, listener: EventListener): void {\n if (!this.wildcards.has(event)) {\n this.wildcards.set(event, []);\n }\n\n this.wildcards.get(event)!.push(listener);\n }\n\n /**\n * Get all wildcard listeners matching an event name\n *\n * @param eventName - The event name to match\n * @returns Array of matching listeners\n */\n protected getWildcardListeners(eventName: string): EventListener[] {\n const matched: EventListener[] = [];\n\n for (const [pattern, listeners] of this.wildcards) {\n if (this.wildcardMatch(pattern, eventName)) {\n matched.push(...listeners);\n }\n }\n\n return matched;\n }\n\n /**\n * Check if an event name matches a wildcard pattern\n *\n * Supports patterns like:\n * - 'event.*' - Matches 'event.created', 'event.updated', etc.\n * - 'event.*.action' - Matches 'event.user.action', 'event.post.action', etc.\n * - '*' - Matches everything\n *\n * @param pattern - Wildcard pattern\n * @param eventName - Event name to test\n * @returns True if the pattern matches\n */\n protected wildcardMatch(pattern: string, eventName: string): boolean {\n // Convert wildcard pattern to regex\n // Escape special regex characters except *\n const regexPattern = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(eventName);\n }\n\n /**\n * Parse event and payload from dispatch arguments\n *\n * @param event - Event name or instance\n * @param payload - Event payload\n * @returns Tuple of [eventName, eventInstance]\n */\n protected parseEventAndPayload(event: string | Event, payload: any[]): [string, Event | null] {\n if (typeof event === 'string') {\n return [event, null];\n }\n\n // Event is an object\n return [event.constructor.name, event];\n }\n\n /**\n * Call a listener with the event and payload\n *\n * Handles different listener types (closure, class instance, string reference)\n *\n * @param listener - The listener to call\n * @param event - Event name or instance\n * @param payload - Additional payload arguments\n * @returns The result from the listener\n */\n protected callListener(listener: EventListener, event: string | Event, payload: any[]): any {\n try {\n const callable = this.makeListener(listener);\n return callable(event, ...payload);\n } catch (error) {\n // Re-throw the error to allow application-level error handling\n console.error(`Error calling event listener:`, error);\n throw error;\n }\n }\n\n /**\n * Create a callable function from a listener\n *\n * Resolves string listeners from container and wraps class instances\n *\n * @param listener - The listener to convert\n * @param wildcard - Whether this is for a wildcard listener\n * @returns Callable function\n */\n protected makeListener(listener: EventListener, wildcard: boolean = false): (...args: any[]) => any {\n // If it's a string, resolve from container\n if (typeof listener === 'string') {\n return this.createClassListener(listener, wildcard);\n }\n\n // If it's a function/class constructor\n if (typeof listener === 'function') {\n // Check if it's a class constructor (has prototype with handle method)\n if (listener.prototype && typeof listener.prototype.handle === 'function') {\n // It's a class constructor, instantiate and call handle\n return (event: Event, ...payload: any[]) => {\n const instance = new (listener as any)();\n return instance.handle(event);\n };\n }\n\n // It's a regular function (closure), return as-is\n return listener;\n }\n\n // If it's a class instance with handle method\n if (typeof listener === 'object' && 'handle' in listener) {\n const instance = listener as ListenerInterface;\n return (event: Event, ...payload: any[]) => {\n return instance.handle(event);\n };\n }\n\n throw new Error(`Invalid listener type: ${typeof listener}`);\n }\n\n /**\n * Create a listener from a class string reference\n *\n * Resolves the class from the container and calls its handle method\n *\n * @param listener - Class name/path to resolve\n * @param wildcard - Whether this is for a wildcard listener\n * @returns Callable function\n */\n protected createClassListener(listener: string, wildcard: boolean = false): (...args: any[]) => any {\n return (event: Event, ...payload: any[]) => {\n // Resolve the listener class from the container\n const instance = this.container.make<ListenerInterface>(listener);\n\n if (!instance || typeof instance.handle !== 'function') {\n throw new Error(`Listener [${listener}] does not have a handle method`);\n }\n\n // Call the handle method\n return instance.handle(event);\n };\n }\n\n /**\n * Check if an event should broadcast\n *\n * This is a placeholder for future broadcasting support\n *\n * @param event - The event instance\n * @param payload - The event payload\n * @returns True if should broadcast\n */\n protected shouldBroadcast(event: Event, payload: any[]): boolean {\n // Check if event has shouldBroadcast method and it returns true\n if (typeof (event as any).shouldBroadcast === 'function') {\n return (event as any).shouldBroadcast();\n }\n\n // Check if event has broadcastOn method that returns channels\n if (typeof (event as any).broadcastOn === 'function') {\n const channels = (event as any).broadcastOn();\n return Array.isArray(channels) ? channels.length > 0 : !!channels;\n }\n\n return false;\n }\n}\n"],"mappings":"AAuBA,IAAa,EAAb,KAAsD,CAqB9B,UAjBtB,UAAoD,IAAI,IAKxD,UAAoD,IAAI,IAKxD,aAAiE,IAAI,IAOrE,YAAY,EAAgC,CAAtB,KAAA,UAAA,EAUtB,OAAO,EAA2B,EAA+B,CAC/D,IAAM,EAAa,MAAM,QAAQ,EAAO,CAAG,EAAS,CAAC,EAAO,CAE5D,IAAK,IAAM,KAAS,EACd,EAAM,SAAS,IAAI,CACrB,KAAK,oBAAoB,EAAO,EAAS,EAEpC,KAAK,UAAU,IAAI,EAAM,EAC5B,KAAK,UAAU,IAAI,EAAO,EAAE,CAAC,CAE/B,KAAK,UAAU,IAAI,EAAM,CAAE,KAAK,EAAS,EAa/C,aAAa,EAA4B,CACvC,OAAO,KAAK,aAAa,EAAU,CAAC,OAAS,EAU/C,UAAU,EAAmC,CAC3C,IAAM,EAAS,EAAW,UAAU,KAAK,CAGzC,GAAI,GAAU,OAAO,GAAW,SAC9B,IAAK,GAAM,CAAC,EAAO,KAAc,OAAO,QAAQ,EAAO,CAAE,CACvD,IAAM,EAAgB,MAAM,QAAQ,EAAU,CAAG,EAAY,CAAC,EAAU,CAExE,IAAK,IAAM,KAAY,EACrB,KAAK,OAAO,EAAO,EAAS,EAcpC,SAAS,EAAuB,EAAiB,EAAE,CAAE,EAAgB,GAAc,CACjF,GAAM,CAAC,EAAW,GAAiB,KAAK,qBAAqB,EAAO,EAAQ,CAGxE,GACF,KAAK,gBAAgB,EAAe,EAAQ,CAG9C,IAAM,EAAY,KAAK,aAAa,EAAU,CACxC,EAAmB,EAAE,CAE3B,IAAK,IAAM,KAAY,EAAW,CAChC,IAAM,EAAW,KAAK,aAAa,EAAU,GAAiB,EAAW,EAAQ,CAGjF,GAAI,GAAQ,IAAa,GACvB,OAAO,EAIL,GAAa,MACf,EAAU,KAAK,EAAS,CAI5B,OAAO,EAUT,MAAM,EAAuB,EAAiB,EAAE,CAAO,CACrD,GAAM,CAAC,EAAW,GAAiB,KAAK,qBAAqB,EAAO,EAAQ,CACtE,EAAY,KAAK,aAAa,EAAU,CAE9C,IAAK,IAAM,KAAY,EAAW,CAChC,IAAM,EAAW,KAAK,aAAa,EAAU,GAAiB,EAAW,EAAQ,CAEjF,GAAI,GAAa,KACf,OAAO,EAIX,OAAO,KAST,KAAK,EAAe,EAAiB,EAAE,CAAQ,CACxC,KAAK,aAAa,IAAI,EAAM,EAC/B,KAAK,aAAa,IAAI,EAAO,EAAE,CAAC,CAGlC,KAAK,aAAa,IAAI,EAAM,CAAE,KAAK,CAAE,UAAS,CAAC,CAQjD,MAAM,EAAqB,CACzB,IAAM,EAAS,KAAK,aAAa,IAAI,EAAM,CAEvC,MAAC,GAAU,EAAO,SAAW,GAKjC,KAAK,GAAM,CAAE,aAAa,EACxB,KAAK,SAAS,EAAO,EAAQ,CAI/B,KAAK,aAAa,OAAO,EAAM,EAQjC,OAAO,EAAqB,CAC1B,KAAK,UAAU,OAAO,EAAM,CAC5B,KAAK,UAAU,OAAO,EAAM,CAM9B,cAAqB,CACnB,KAAK,aAAa,OAAO,CAQ3B,iBAAgD,CAC9C,OAAO,KAAK,UASd,aAAuB,EAAoC,CACzD,IAAM,EAAkB,KAAK,UAAU,IAAI,EAAU,EAAI,EAAE,CACrD,EAAoB,KAAK,qBAAqB,EAAU,CAE9D,MAAO,CAAC,GAAG,EAAiB,GAAG,EAAkB,CASnD,oBAA8B,EAAe,EAA+B,CACrE,KAAK,UAAU,IAAI,EAAM,EAC5B,KAAK,UAAU,IAAI,EAAO,EAAE,CAAC,CAG/B,KAAK,UAAU,IAAI,EAAM,CAAE,KAAK,EAAS,CAS3C,qBAA+B,EAAoC,CACjE,IAAM,EAA2B,EAAE,CAEnC,IAAK,GAAM,CAAC,EAAS,KAAc,KAAK,UAClC,KAAK,cAAc,EAAS,EAAU,EACxC,EAAQ,KAAK,GAAG,EAAU,CAI9B,OAAO,EAeT,cAAwB,EAAiB,EAA4B,CAGnE,IAAM,EAAe,EAAQ,QAAQ,qBAAsB,OAAO,CAAC,QAAQ,MAAO,KAAK,CAGvF,OADkB,OAAO,IAAI,EAAa,GAC9B,CAAC,KAAK,EAAU,CAU9B,qBAA+B,EAAuB,EAAwC,CAM5F,OALI,OAAO,GAAU,SACZ,CAAC,EAAO,KAAK,CAIf,CAAC,EAAM,YAAY,KAAM,EAAM,CAaxC,aAAuB,EAAyB,EAAuB,EAAqB,CAC1F,GAAI,CAEF,OADiB,KAAK,aAAa,EACpB,CAAC,EAAO,GAAG,EAAQ,OAC3B,EAAO,CAGd,MADA,QAAQ,MAAM,gCAAiC,EAAM,CAC/C,GAaV,aAAuB,EAAyB,EAAoB,GAAgC,CAElG,GAAI,OAAO,GAAa,SACtB,OAAO,KAAK,oBAAoB,EAAU,EAAS,CAIrD,GAAI,OAAO,GAAa,WAWtB,OATI,EAAS,WAAa,OAAO,EAAS,UAAU,QAAW,YAErD,EAAc,GAAG,IAEhB,IADe,GACP,CAAC,OAAO,EAAM,CAK1B,EAIT,GAAI,OAAO,GAAa,UAAY,WAAY,EAAU,CACxD,IAAM,EAAW,EACjB,OAAQ,EAAc,GAAG,IAChB,EAAS,OAAO,EAAM,CAIjC,MAAU,MAAM,0BAA0B,OAAO,IAAW,CAY9D,oBAA8B,EAAkB,EAAoB,GAAgC,CAClG,OAAQ,EAAc,GAAG,IAAmB,CAE1C,IAAM,EAAW,KAAK,UAAU,KAAwB,EAAS,CAEjE,GAAI,CAAC,GAAY,OAAO,EAAS,QAAW,WAC1C,MAAU,MAAM,aAAa,EAAS,iCAAiC,CAIzE,OAAO,EAAS,OAAO,EAAM,EAajC,gBAA0B,EAAc,EAAyB,CAE/D,GAAI,OAAQ,EAAc,iBAAoB,WAC5C,OAAQ,EAAc,iBAAiB,CAIzC,GAAI,OAAQ,EAAc,aAAgB,WAAY,CACpD,IAAM,EAAY,EAAc,aAAa,CAC7C,OAAO,MAAM,QAAQ,EAAS,CAAG,EAAS,OAAS,EAAI,CAAC,CAAC,EAG3D,MAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../Foundation/ServiceProvider.cjs`),n=require(`./Dispatcher.cjs`);let r=require(`fs`);r=e.__toESM(r);var i=class extends t.ServiceProvider{listen={};subscribe=[];register(){this.app.singleton(`events`,e=>new n.Dispatcher(e)),this.app.alias(`events`,n.Dispatcher)}async boot(){let e=this.app.make(`events`);for(let[t,n]of Object.entries(this.listen)){let r=Array.isArray(n)?n:[n];for(let n of r)e.listen(t,n)}for(let t of this.subscribe){let n=this.app.make(t);e.subscribe(n)}this.shouldDiscoverEvents()&&await this.discoverEvents(e)}shouldDiscoverEvents(){return!this.eventsAreCached()}async discoverEvents(e){try{let{EventDiscovery:t}=await Promise.resolve().then(()=>require(`../Support/EventDiscovery.cjs`)),n=await new t(this.app).discover(this.discoverEventsWithin());for(let[t,r]of n)for(let n of r)e.listen(t,n)}catch(e){if(e.code!==`MODULE_NOT_FOUND`)throw e}}discoverEventsWithin(){return this.app.getEventDiscoveryPaths()}eventsAreCached(){let e=this.app.storagePath(`framework/events.json`);try{return r.accessSync(e,r.constants.F_OK),!0}catch{return!1}}getCachedEvents(){let e=this.app.storagePath(`framework/events.json`);if(!r.existsSync(e))return new Map;try{let t=JSON.parse(r.readFileSync(e,`utf-8`));return new Map(t)}catch{return new Map}}listens(){return this.listen}};exports.EventServiceProvider=i;
|
|
1
|
+
const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../Foundation/ServiceProvider.cjs`),n=require(`./Dispatcher.cjs`);let r=require(`fs`);r=e.__toESM(r,1);var i=class extends t.ServiceProvider{listen={};subscribe=[];register(){this.app.singleton(`events`,e=>new n.Dispatcher(e)),this.app.alias(`events`,n.Dispatcher)}async boot(){let e=this.app.make(`events`);for(let[t,n]of Object.entries(this.listen)){let r=Array.isArray(n)?n:[n];for(let n of r)e.listen(t,n)}for(let t of this.subscribe){let n=this.app.make(t);e.subscribe(n)}this.shouldDiscoverEvents()&&await this.discoverEvents(e)}shouldDiscoverEvents(){return!this.eventsAreCached()}async discoverEvents(e){try{let{EventDiscovery:t}=await Promise.resolve().then(()=>require(`../Support/EventDiscovery.cjs`)),n=await new t(this.app).discover(this.discoverEventsWithin());for(let[t,r]of n)for(let n of r)e.listen(t,n)}catch(e){if(e.code!==`MODULE_NOT_FOUND`)throw e}}discoverEventsWithin(){return this.app.getEventDiscoveryPaths()}eventsAreCached(){let e=this.app.storagePath(`framework/events.json`);try{return r.accessSync(e,r.constants.F_OK),!0}catch{return!1}}getCachedEvents(){let e=this.app.storagePath(`framework/events.json`);if(!r.existsSync(e))return new Map;try{let t=JSON.parse(r.readFileSync(e,`utf-8`));return new Map(t)}catch{return new Map}}listens(){return this.listen}};exports.EventServiceProvider=i;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventServiceProvider.mjs","names":[],"sources":["../../src/Events/EventServiceProvider.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport { Application } from '@/Foundation/Application';\nimport { ServiceProvider } from '@/Foundation/ServiceProvider';\nimport { Dispatcher } from './Dispatcher';\nimport { EventSubscriber } from './types';\n\n/**\n * Event Service Provider\n *\n * Provides event registration and discovery services following Laravel's\n * EventServiceProvider pattern. Supports both manual registration and\n * automatic listener discovery.\n *\n * @example\n * ```typescript\n * export class AppEventServiceProvider extends EventServiceProvider {\n * protected listen = {\n * 'UserRegistered': [\n * 'SendWelcomeEmail',\n * 'CreateUserProfile'\n * ],\n * 'OrderPlaced': 'SendOrderConfirmation'\n * }\n *\n * protected subscribe = [\n * 'UserEventSubscriber'\n * ]\n * }\n * ```\n */\nexport abstract class EventServiceProvider extends ServiceProvider {\n /**\n * The event listener mappings for the application\n *\n * Maps event names to listener class names (string) or arrays of listener names.\n *\n * @example\n * ```typescript\n * protected listen = {\n * 'UserRegistered': ['SendWelcomeEmail', 'LogRegistration'],\n * 'OrderPlaced': 'ProcessOrder'\n * }\n * ```\n */\n protected listen: Record<string, string | string[]> = {};\n\n /**\n * The subscriber classes to register\n *\n * Subscribers provide their own event-to-listener mappings via a subscribe() method.\n *\n * @example\n * ```typescript\n * protected subscribe = [\n * 'UserEventSubscriber',\n * 'OrderEventSubscriber'\n * ]\n * ```\n */\n protected subscribe: string[] = [];\n\n /**\n * Register the application's event listeners\n *\n * Binds the event dispatcher as a singleton in the container.\n */\n register(): void {\n this.app.singleton('events', (app) => {\n return new Dispatcher(app as Application);\n });\n\n // Register alias for convenience\n this.app.alias('events', Dispatcher);\n }\n\n /**\n * Bootstrap the application events\n *\n * Performs three key operations:\n * 1. Registers manual event-listener mappings from the `listen` property\n * 2. Registers event subscribers from the `subscribe` property\n * 3. Performs automatic event discovery if enabled\n *\n * @throws {Error} If the dispatcher cannot be resolved from the container\n */\n async boot(): Promise<void> {\n const events = this.app.make<Dispatcher>('events');\n\n // Register event listeners from listen property\n for (const [event, listeners] of Object.entries(this.listen)) {\n const listenerArray = Array.isArray(listeners) ? listeners : [listeners];\n\n for (const listener of listenerArray) {\n events.listen(event, listener);\n }\n }\n\n // Register event subscribers\n for (const subscriber of this.subscribe) {\n const subscriberInstance = this.app.make<EventSubscriber>(subscriber);\n events.subscribe(subscriberInstance);\n }\n\n // Perform event discovery if enabled\n if (this.shouldDiscoverEvents()) {\n await this.discoverEvents(events);\n }\n }\n\n /**\n * Determine if events and listeners should be automatically discovered\n *\n * By default, discovery is enabled unless events are cached.\n * Override this method to customize discovery behavior.\n *\n * @returns {boolean} True if event discovery should run\n *\n * @example\n * ```typescript\n * protected shouldDiscoverEvents(): boolean {\n * // Disable discovery in production\n * return this.app.environment() !== 'production'\n * }\n * ```\n */\n protected shouldDiscoverEvents(): boolean {\n // Check for cached events first\n return !this.eventsAreCached();\n }\n\n /**\n * Discover the events and listeners for the application\n *\n * Uses EventDiscovery to scan specified directories for listener classes\n * and automatically registers them with their corresponding events.\n *\n * @param {Dispatcher} events - The event dispatcher instance\n *\n * @throws {Error} If EventDiscovery is not available (Task 6 dependency)\n */\n protected async discoverEvents(events: Dispatcher): Promise<void> {\n // Import EventDiscovery dynamically to avoid circular dependency\n try {\n const { EventDiscovery } = await import('@/Support/EventDiscovery');\n const discovery = new EventDiscovery(this.app);\n\n const listeners = await discovery.discover(this.discoverEventsWithin());\n\n for (const [event, listenerClasses] of listeners) {\n for (const listener of listenerClasses) {\n events.listen(event, listener);\n }\n }\n } catch (error: any) {\n // EventDiscovery not implemented yet (Task 6)\n // Silently skip discovery for now\n if (error.code !== 'MODULE_NOT_FOUND') {\n throw error;\n }\n }\n }\n\n /**\n * Get the directories to discover events within\n *\n * By default, uses the paths configured via Application.withEvents()\n * or falls back to the standard 'Listeners' directory.\n *\n * Override this method to customize discovery paths.\n *\n * @returns {string[]} Array of absolute directory paths to scan\n *\n * @example\n * ```typescript\n * protected discoverEventsWithin(): string[] {\n * return [\n * this.app.path('Listeners'),\n * this.app.path('Domain/Listeners')\n * ]\n * }\n * ```\n */\n protected discoverEventsWithin(): string[] {\n return this.app.getEventDiscoveryPaths();\n }\n\n /**\n * Determine if events are cached\n *\n * Checks for the existence of the cached events file.\n *\n * @returns {boolean} True if cached events file exists\n */\n protected eventsAreCached(): boolean {\n const cachePath = this.app.storagePath('framework/events.json');\n try {\n fs.accessSync(cachePath, fs.constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get the events and handlers from the cached file\n *\n * Loads and parses the cached events JSON file.\n *\n * @returns {Map<string, string[]>} Map of event names to listener class names\n */\n protected getCachedEvents(): Map<string, string[]> {\n const cachePath = this.app.storagePath('framework/events.json');\n\n if (!fs.existsSync(cachePath)) {\n return new Map();\n }\n\n try {\n const cached = JSON.parse(fs.readFileSync(cachePath, 'utf-8'));\n // Convert array of entries back to Map\n return new Map(cached);\n } catch {\n return new Map();\n }\n }\n\n /**\n * Get all registered event-listener mappings\n *\n * Returns the complete mapping of events to listeners for inspection.\n * Useful for debugging and console commands.\n *\n * @returns {Record<string, string | string[]>} The listen property mappings\n */\n listens(): Record<string, string | string[]> {\n return this.listen;\n }\n}\n"],"mappings":"uIA+BA,IAAsB,EAAtB,cAAmD,CAAgB,CAcjE,OAAsD,EAAE,CAexD,UAAgC,EAAE,CAOlC,UAAiB,CACf,KAAK,IAAI,UAAU,SAAW,GACrB,IAAI,EAAW,EAAmB,CACzC,CAGF,KAAK,IAAI,MAAM,SAAU,EAAW,CAatC,MAAM,MAAsB,CAC1B,IAAM,EAAS,KAAK,IAAI,KAAiB,SAAS,CAGlD,IAAK,GAAM,CAAC,EAAO,KAAc,OAAO,QAAQ,KAAK,OAAO,CAAE,CAC5D,IAAM,EAAgB,MAAM,QAAQ,EAAU,CAAG,EAAY,CAAC,EAAU,CAExE,IAAK,IAAM,KAAY,EACrB,EAAO,OAAO,EAAO,EAAS,CAKlC,IAAK,IAAM,KAAc,KAAK,UAAW,CACvC,IAAM,EAAqB,KAAK,IAAI,KAAsB,EAAW,CACrE,EAAO,UAAU,EAAmB,CAIlC,KAAK,sBAAsB,EAC7B,MAAM,KAAK,eAAe,EAAO,CAoBrC,sBAA0C,CAExC,MAAO,CAAC,KAAK,iBAAiB,CAahC,MAAgB,eAAe,EAAmC,CAEhE,GAAI,CACF,GAAM,CAAE,kBAAmB,MAAM,OAAO,iCAGlC,EAAY,
|
|
1
|
+
{"version":3,"file":"EventServiceProvider.mjs","names":[],"sources":["../../src/Events/EventServiceProvider.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport { Application } from '@/Foundation/Application';\nimport { ServiceProvider } from '@/Foundation/ServiceProvider';\nimport { Dispatcher } from './Dispatcher';\nimport { EventSubscriber } from './types';\n\n/**\n * Event Service Provider\n *\n * Provides event registration and discovery services following Laravel's\n * EventServiceProvider pattern. Supports both manual registration and\n * automatic listener discovery.\n *\n * @example\n * ```typescript\n * export class AppEventServiceProvider extends EventServiceProvider {\n * protected listen = {\n * 'UserRegistered': [\n * 'SendWelcomeEmail',\n * 'CreateUserProfile'\n * ],\n * 'OrderPlaced': 'SendOrderConfirmation'\n * }\n *\n * protected subscribe = [\n * 'UserEventSubscriber'\n * ]\n * }\n * ```\n */\nexport abstract class EventServiceProvider extends ServiceProvider {\n /**\n * The event listener mappings for the application\n *\n * Maps event names to listener class names (string) or arrays of listener names.\n *\n * @example\n * ```typescript\n * protected listen = {\n * 'UserRegistered': ['SendWelcomeEmail', 'LogRegistration'],\n * 'OrderPlaced': 'ProcessOrder'\n * }\n * ```\n */\n protected listen: Record<string, string | string[]> = {};\n\n /**\n * The subscriber classes to register\n *\n * Subscribers provide their own event-to-listener mappings via a subscribe() method.\n *\n * @example\n * ```typescript\n * protected subscribe = [\n * 'UserEventSubscriber',\n * 'OrderEventSubscriber'\n * ]\n * ```\n */\n protected subscribe: string[] = [];\n\n /**\n * Register the application's event listeners\n *\n * Binds the event dispatcher as a singleton in the container.\n */\n register(): void {\n this.app.singleton('events', (app) => {\n return new Dispatcher(app as Application);\n });\n\n // Register alias for convenience\n this.app.alias('events', Dispatcher);\n }\n\n /**\n * Bootstrap the application events\n *\n * Performs three key operations:\n * 1. Registers manual event-listener mappings from the `listen` property\n * 2. Registers event subscribers from the `subscribe` property\n * 3. Performs automatic event discovery if enabled\n *\n * @throws {Error} If the dispatcher cannot be resolved from the container\n */\n async boot(): Promise<void> {\n const events = this.app.make<Dispatcher>('events');\n\n // Register event listeners from listen property\n for (const [event, listeners] of Object.entries(this.listen)) {\n const listenerArray = Array.isArray(listeners) ? listeners : [listeners];\n\n for (const listener of listenerArray) {\n events.listen(event, listener);\n }\n }\n\n // Register event subscribers\n for (const subscriber of this.subscribe) {\n const subscriberInstance = this.app.make<EventSubscriber>(subscriber);\n events.subscribe(subscriberInstance);\n }\n\n // Perform event discovery if enabled\n if (this.shouldDiscoverEvents()) {\n await this.discoverEvents(events);\n }\n }\n\n /**\n * Determine if events and listeners should be automatically discovered\n *\n * By default, discovery is enabled unless events are cached.\n * Override this method to customize discovery behavior.\n *\n * @returns {boolean} True if event discovery should run\n *\n * @example\n * ```typescript\n * protected shouldDiscoverEvents(): boolean {\n * // Disable discovery in production\n * return this.app.environment() !== 'production'\n * }\n * ```\n */\n protected shouldDiscoverEvents(): boolean {\n // Check for cached events first\n return !this.eventsAreCached();\n }\n\n /**\n * Discover the events and listeners for the application\n *\n * Uses EventDiscovery to scan specified directories for listener classes\n * and automatically registers them with their corresponding events.\n *\n * @param {Dispatcher} events - The event dispatcher instance\n *\n * @throws {Error} If EventDiscovery is not available (Task 6 dependency)\n */\n protected async discoverEvents(events: Dispatcher): Promise<void> {\n // Import EventDiscovery dynamically to avoid circular dependency\n try {\n const { EventDiscovery } = await import('@/Support/EventDiscovery');\n const discovery = new EventDiscovery(this.app);\n\n const listeners = await discovery.discover(this.discoverEventsWithin());\n\n for (const [event, listenerClasses] of listeners) {\n for (const listener of listenerClasses) {\n events.listen(event, listener);\n }\n }\n } catch (error: any) {\n // EventDiscovery not implemented yet (Task 6)\n // Silently skip discovery for now\n if (error.code !== 'MODULE_NOT_FOUND') {\n throw error;\n }\n }\n }\n\n /**\n * Get the directories to discover events within\n *\n * By default, uses the paths configured via Application.withEvents()\n * or falls back to the standard 'Listeners' directory.\n *\n * Override this method to customize discovery paths.\n *\n * @returns {string[]} Array of absolute directory paths to scan\n *\n * @example\n * ```typescript\n * protected discoverEventsWithin(): string[] {\n * return [\n * this.app.path('Listeners'),\n * this.app.path('Domain/Listeners')\n * ]\n * }\n * ```\n */\n protected discoverEventsWithin(): string[] {\n return this.app.getEventDiscoveryPaths();\n }\n\n /**\n * Determine if events are cached\n *\n * Checks for the existence of the cached events file.\n *\n * @returns {boolean} True if cached events file exists\n */\n protected eventsAreCached(): boolean {\n const cachePath = this.app.storagePath('framework/events.json');\n try {\n fs.accessSync(cachePath, fs.constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get the events and handlers from the cached file\n *\n * Loads and parses the cached events JSON file.\n *\n * @returns {Map<string, string[]>} Map of event names to listener class names\n */\n protected getCachedEvents(): Map<string, string[]> {\n const cachePath = this.app.storagePath('framework/events.json');\n\n if (!fs.existsSync(cachePath)) {\n return new Map();\n }\n\n try {\n const cached = JSON.parse(fs.readFileSync(cachePath, 'utf-8'));\n // Convert array of entries back to Map\n return new Map(cached);\n } catch {\n return new Map();\n }\n }\n\n /**\n * Get all registered event-listener mappings\n *\n * Returns the complete mapping of events to listeners for inspection.\n * Useful for debugging and console commands.\n *\n * @returns {Record<string, string | string[]>} The listen property mappings\n */\n listens(): Record<string, string | string[]> {\n return this.listen;\n }\n}\n"],"mappings":"uIA+BA,IAAsB,EAAtB,cAAmD,CAAgB,CAcjE,OAAsD,EAAE,CAexD,UAAgC,EAAE,CAOlC,UAAiB,CACf,KAAK,IAAI,UAAU,SAAW,GACrB,IAAI,EAAW,EAAmB,CACzC,CAGF,KAAK,IAAI,MAAM,SAAU,EAAW,CAatC,MAAM,MAAsB,CAC1B,IAAM,EAAS,KAAK,IAAI,KAAiB,SAAS,CAGlD,IAAK,GAAM,CAAC,EAAO,KAAc,OAAO,QAAQ,KAAK,OAAO,CAAE,CAC5D,IAAM,EAAgB,MAAM,QAAQ,EAAU,CAAG,EAAY,CAAC,EAAU,CAExE,IAAK,IAAM,KAAY,EACrB,EAAO,OAAO,EAAO,EAAS,CAKlC,IAAK,IAAM,KAAc,KAAK,UAAW,CACvC,IAAM,EAAqB,KAAK,IAAI,KAAsB,EAAW,CACrE,EAAO,UAAU,EAAmB,CAIlC,KAAK,sBAAsB,EAC7B,MAAM,KAAK,eAAe,EAAO,CAoBrC,sBAA0C,CAExC,MAAO,CAAC,KAAK,iBAAiB,CAahC,MAAgB,eAAe,EAAmC,CAEhE,GAAI,CACF,GAAM,CAAE,kBAAmB,MAAM,OAAO,iCAGlC,EAAY,MAAM,IAFF,EAAe,KAAK,IAET,CAAC,SAAS,KAAK,sBAAsB,CAAC,CAEvE,IAAK,GAAM,CAAC,EAAO,KAAoB,EACrC,IAAK,IAAM,KAAY,EACrB,EAAO,OAAO,EAAO,EAAS,OAG3B,EAAY,CAGnB,GAAI,EAAM,OAAS,mBACjB,MAAM,GAyBZ,sBAA2C,CACzC,OAAO,KAAK,IAAI,wBAAwB,CAU1C,iBAAqC,CACnC,IAAM,EAAY,KAAK,IAAI,YAAY,wBAAwB,CAC/D,GAAI,CAEF,OADA,EAAG,WAAW,EAAW,EAAG,UAAU,KAAK,CACpC,QACD,CACN,MAAO,IAWX,iBAAmD,CACjD,IAAM,EAAY,KAAK,IAAI,YAAY,wBAAwB,CAE/D,GAAI,CAAC,EAAG,WAAW,EAAU,CAC3B,OAAO,IAAI,IAGb,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,EAAG,aAAa,EAAW,QAAQ,CAAC,CAE9D,OAAO,IAAI,IAAI,EAAO,MAChB,CACN,OAAO,IAAI,KAYf,SAA6C,CAC3C,OAAO,KAAK"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./Concerns/Dispatchable.cjs`),t=require(`./Event.cjs`),n=require(`./Dispatcher.cjs`),r=require(`./EventServiceProvider.cjs`);exports.Dispatchable=e.Dispatchable,exports.Dispatcher=n.Dispatcher,exports.Event=t.Event,exports.EventServiceProvider=r.EventServiceProvider,exports.applyDispatchable=e.applyDispatchable;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Event, EventClass } from "./Event.cjs";
|
|
2
|
+
import { EventListener, EventPayload, EventSubscriber, ListenerClosure, ListenerInterface, QueuedListener } from "./types.cjs";
|
|
3
|
+
import { DispatcherContract } from "./Contracts/Dispatcher.cjs";
|
|
4
|
+
import { Dispatcher } from "./Dispatcher.cjs";
|
|
5
|
+
import { EventServiceProvider } from "./EventServiceProvider.cjs";
|
|
6
|
+
import { Dispatchable, applyDispatchable } from "./Concerns/Dispatchable.cjs";
|
|
7
|
+
export { Dispatchable, Dispatcher, type DispatcherContract, Event, type EventClass, type EventListener, type EventPayload, EventServiceProvider, type EventSubscriber, type ListenerClosure, type ListenerInterface, type QueuedListener, applyDispatchable };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Event, EventClass } from "./Event.mjs";
|
|
2
|
+
import { EventListener, EventPayload, EventSubscriber, ListenerClosure, ListenerInterface, QueuedListener } from "./types.mjs";
|
|
3
|
+
import { DispatcherContract } from "./Contracts/Dispatcher.mjs";
|
|
4
|
+
import { Dispatcher } from "./Dispatcher.mjs";
|
|
5
|
+
import { EventServiceProvider } from "./EventServiceProvider.mjs";
|
|
6
|
+
import { Dispatchable, applyDispatchable } from "./Concerns/Dispatchable.mjs";
|
|
7
|
+
export { Dispatchable, Dispatcher, type DispatcherContract, Event, type EventClass, type EventListener, type EventPayload, EventServiceProvider, type EventSubscriber, type ListenerClosure, type ListenerInterface, type QueuedListener, applyDispatchable };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Dispatchable as e,applyDispatchable as t}from"./Concerns/Dispatchable.mjs";import{Event as n}from"./Event.mjs";import{Dispatcher as r}from"./Dispatcher.mjs";import{EventServiceProvider as i}from"./EventServiceProvider.mjs";export{e as Dispatchable,r as Dispatcher,n as Event,i as EventServiceProvider,t as applyDispatchable};
|
package/dist/Facades/Bus.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bus.mjs","names":[],"sources":["../../src/Facades/Bus.ts"],"sourcesContent":["/**\n * Bus Facade\n *\n * Provides static access to the command bus for dispatching jobs,\n * chains, and batches.\n *\n * @example\n * ```typescript\n * // Dispatch a job\n * await Bus.dispatch(new ProcessPodcast(podcastId));\n *\n * // Dispatch synchronously\n * await Bus.dispatchSync(new ProcessPodcast(podcastId));\n *\n * // Chain jobs\n * await Bus.chain([\n * new ProcessPodcast(id),\n * new OptimizePodcast(id),\n * new ReleasePodcast(id),\n * ]).dispatch();\n *\n * // Batch jobs\n * const batch = await Bus.batch([\n * new ProcessPodcast(1),\n * new ProcessPodcast(2),\n * ])\n * .then((batch) => console.log('Done'))\n * .catch((batch, error) => console.error('Failed'))\n * .dispatch();\n * ```\n */\n\nimport type { Job } from '@/Queue/Job';\nimport type { QueueManager } from '@/Queue/QueueManager';\nimport { PendingBatch } from '@/Queue/Batching/PendingBatch';\nimport { PendingChain } from '@/Queue/PendingChain';\nimport { Facade } from '@/Support/Facade';\n\nclass BusFacadeClass extends Facade {\n protected static getFacadeAccessor(): string {\n return 'queue';\n }\n\n /**\n * Dispatch a job to the queue\n */\n static async dispatch(job: Job): Promise<string> {\n const manager = this.getFacadeRoot() as QueueManager;\n return manager.dispatch(job);\n }\n\n /**\n * Dispatch a job synchronously\n */\n static async dispatchSync(job: Job): Promise<void> {\n const manager = this.getFacadeRoot() as QueueManager;\n return manager.dispatchSync(job);\n }\n\n /**\n * Dispatch a job immediately (alias for dispatchSync)\n */\n static async dispatchNow(job: Job): Promise<void> {\n return this.dispatchSync(job);\n }\n\n /**\n * Create a new chain of queueable jobs\n */\n static chain(jobs: Job[]): PendingChain {\n const manager = this.getFacadeRoot() as QueueManager;\n return new PendingChain(manager, jobs);\n }\n\n /**\n * Create a new batch of queueable jobs\n */\n static batch(jobs: Job[]): PendingBatch {\n const app = this.getFacadeApplication();\n return new PendingBatch(app, jobs);\n }\n}\n\nexport const Bus = new Proxy(BusFacadeClass, {\n get(target, prop) {\n if (prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n try {\n const root = (target as any).getFacadeRoot() as QueueManager;\n if (root && prop in root) {\n const value = (root as any)[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n } catch (error) {\n // Facade root not available yet\n }\n\n return undefined;\n },\n}) as unknown as typeof BusFacadeClass & QueueManager;\n"],"mappings":"0KAmFA,MAAa,EAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"Bus.mjs","names":[],"sources":["../../src/Facades/Bus.ts"],"sourcesContent":["/**\n * Bus Facade\n *\n * Provides static access to the command bus for dispatching jobs,\n * chains, and batches.\n *\n * @example\n * ```typescript\n * // Dispatch a job\n * await Bus.dispatch(new ProcessPodcast(podcastId));\n *\n * // Dispatch synchronously\n * await Bus.dispatchSync(new ProcessPodcast(podcastId));\n *\n * // Chain jobs\n * await Bus.chain([\n * new ProcessPodcast(id),\n * new OptimizePodcast(id),\n * new ReleasePodcast(id),\n * ]).dispatch();\n *\n * // Batch jobs\n * const batch = await Bus.batch([\n * new ProcessPodcast(1),\n * new ProcessPodcast(2),\n * ])\n * .then((batch) => console.log('Done'))\n * .catch((batch, error) => console.error('Failed'))\n * .dispatch();\n * ```\n */\n\nimport type { Job } from '@/Queue/Job';\nimport type { QueueManager } from '@/Queue/QueueManager';\nimport { PendingBatch } from '@/Queue/Batching/PendingBatch';\nimport { PendingChain } from '@/Queue/PendingChain';\nimport { Facade } from '@/Support/Facade';\n\nclass BusFacadeClass extends Facade {\n protected static getFacadeAccessor(): string {\n return 'queue';\n }\n\n /**\n * Dispatch a job to the queue\n */\n static async dispatch(job: Job): Promise<string> {\n const manager = this.getFacadeRoot() as QueueManager;\n return manager.dispatch(job);\n }\n\n /**\n * Dispatch a job synchronously\n */\n static async dispatchSync(job: Job): Promise<void> {\n const manager = this.getFacadeRoot() as QueueManager;\n return manager.dispatchSync(job);\n }\n\n /**\n * Dispatch a job immediately (alias for dispatchSync)\n */\n static async dispatchNow(job: Job): Promise<void> {\n return this.dispatchSync(job);\n }\n\n /**\n * Create a new chain of queueable jobs\n */\n static chain(jobs: Job[]): PendingChain {\n const manager = this.getFacadeRoot() as QueueManager;\n return new PendingChain(manager, jobs);\n }\n\n /**\n * Create a new batch of queueable jobs\n */\n static batch(jobs: Job[]): PendingBatch {\n const app = this.getFacadeApplication();\n return new PendingBatch(app, jobs);\n }\n}\n\nexport const Bus = new Proxy(BusFacadeClass, {\n get(target, prop) {\n if (prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n try {\n const root = (target as any).getFacadeRoot() as QueueManager;\n if (root && prop in root) {\n const value = (root as any)[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n } catch (error) {\n // Facade root not available yet\n }\n\n return undefined;\n },\n}) as unknown as typeof BusFacadeClass & QueueManager;\n"],"mappings":"0KAmFA,MAAa,EAAM,IAAI,MAAM,cA7CA,CAAO,CAClC,OAAiB,mBAA4B,CAC3C,MAAO,QAMT,aAAa,SAAS,EAA2B,CAE/C,OADgB,KAAK,eACP,CAAC,SAAS,EAAI,CAM9B,aAAa,aAAa,EAAyB,CAEjD,OADgB,KAAK,eACP,CAAC,aAAa,EAAI,CAMlC,aAAa,YAAY,EAAyB,CAChD,OAAO,KAAK,aAAa,EAAI,CAM/B,OAAO,MAAM,EAA2B,CAEtC,OAAO,IAAI,EADK,KAAK,eACU,CAAE,EAAK,CAMxC,OAAO,MAAM,EAA2B,CAEtC,OAAO,IAAI,EADC,KAAK,sBACU,CAAE,EAAK,GAIO,CAC3C,IAAI,EAAQ,EAAM,CAChB,GAAI,KAAQ,EAAQ,CAClB,IAAM,EAAS,EAAe,GAI9B,OAHI,OAAO,GAAU,WACZ,EAAM,KAAK,EAAO,CAEpB,EAGT,GAAI,CACF,IAAM,EAAQ,EAAe,eAAe,CAC5C,GAAI,GAAQ,KAAQ,EAAM,CACxB,IAAM,EAAS,EAAa,GAI5B,OAHI,OAAO,GAAU,YACX,GAAG,IAAgB,EAAM,MAAM,EAAM,EAAK,CAE7C,QAEK,IAMnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cache.mjs","names":[],"sources":["../../src/Facades/Cache.ts"],"sourcesContent":["/**\n * Cache Facade\n *\n * Provides static access to the cache manager and default store.\n *\n * @example\n * ```typescript\n * import { Cache } from '@orchestr-sh/orchestr';\n *\n * // Basic operations\n * await Cache.put('key', 'value', 3600);\n * const value = await Cache.get('key');\n * await Cache.forget('key');\n *\n * // Remember pattern\n * const user = await Cache.remember('user:1', 3600, async () => {\n * return await fetchUser(1);\n * });\n *\n * // Switch stores\n * await Cache.store('redis').put('key', 'value', 3600);\n *\n * // Tags\n * await Cache.tags(['people', 'artists']).put('John', data, 3600);\n * await Cache.tags('people').flush();\n *\n * // Locks\n * await Cache.lock('processing', 120).get(async () => {\n * // critical section\n * });\n * ```\n */\n\nimport type { CacheManager } from '@/Cache/CacheManager';\nimport type { Repository } from '@/Cache/Repository';\nimport { Facade } from '@/Support/Facade';\n\nclass CacheFacadeClass extends Facade {\n protected static getFacadeAccessor(): string {\n return 'cache';\n }\n}\n\nexport const Cache = new Proxy(CacheFacadeClass, {\n get(target, prop) {\n // First check if it's a static method on the facade class itself\n if (prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n // Then try to get from the facade root (the CacheManager instance)\n try {\n const root = (target as any).getFacadeRoot() as CacheManager;\n if (root && prop in root) {\n const value = (root as any)[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n\n // Also proxy to default store for convenience\n const store = root.store() as Repository;\n if (store && prop in store) {\n const value = (store as any)[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(store, args);\n }\n return value;\n }\n } catch (error) {\n // Facade root not available yet\n }\n\n return undefined;\n },\n}) as unknown as typeof CacheFacadeClass & CacheManager & Repository;\n"],"mappings":"+CA2CA,MAAa,EAAQ,IAAI,
|
|
1
|
+
{"version":3,"file":"Cache.mjs","names":[],"sources":["../../src/Facades/Cache.ts"],"sourcesContent":["/**\n * Cache Facade\n *\n * Provides static access to the cache manager and default store.\n *\n * @example\n * ```typescript\n * import { Cache } from '@orchestr-sh/orchestr';\n *\n * // Basic operations\n * await Cache.put('key', 'value', 3600);\n * const value = await Cache.get('key');\n * await Cache.forget('key');\n *\n * // Remember pattern\n * const user = await Cache.remember('user:1', 3600, async () => {\n * return await fetchUser(1);\n * });\n *\n * // Switch stores\n * await Cache.store('redis').put('key', 'value', 3600);\n *\n * // Tags\n * await Cache.tags(['people', 'artists']).put('John', data, 3600);\n * await Cache.tags('people').flush();\n *\n * // Locks\n * await Cache.lock('processing', 120).get(async () => {\n * // critical section\n * });\n * ```\n */\n\nimport type { CacheManager } from '@/Cache/CacheManager';\nimport type { Repository } from '@/Cache/Repository';\nimport { Facade } from '@/Support/Facade';\n\nclass CacheFacadeClass extends Facade {\n protected static getFacadeAccessor(): string {\n return 'cache';\n }\n}\n\nexport const Cache = new Proxy(CacheFacadeClass, {\n get(target, prop) {\n // First check if it's a static method on the facade class itself\n if (prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n // Then try to get from the facade root (the CacheManager instance)\n try {\n const root = (target as any).getFacadeRoot() as CacheManager;\n if (root && prop in root) {\n const value = (root as any)[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n\n // Also proxy to default store for convenience\n const store = root.store() as Repository;\n if (store && prop in store) {\n const value = (store as any)[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(store, args);\n }\n return value;\n }\n } catch (error) {\n // Facade root not available yet\n }\n\n return undefined;\n },\n}) as unknown as typeof CacheFacadeClass & CacheManager & Repository;\n"],"mappings":"+CA2CA,MAAa,EAAQ,IAAI,MAAM,cANA,CAAO,CACpC,OAAiB,mBAA4B,CAC3C,MAAO,UAIsC,CAC/C,IAAI,EAAQ,EAAM,CAEhB,GAAI,KAAQ,EAAQ,CAClB,IAAM,EAAS,EAAe,GAI9B,OAHI,OAAO,GAAU,WACZ,EAAM,KAAK,EAAO,CAEpB,EAIT,GAAI,CACF,IAAM,EAAQ,EAAe,eAAe,CAC5C,GAAI,GAAQ,KAAQ,EAAM,CACxB,IAAM,EAAS,EAAa,GAI5B,OAHI,OAAO,GAAU,YACX,GAAG,IAAgB,EAAM,MAAM,EAAM,EAAK,CAE7C,EAIT,IAAM,EAAQ,EAAK,OAAO,CAC1B,GAAI,GAAS,KAAQ,EAAO,CAC1B,IAAM,EAAS,EAAc,GAI7B,OAHI,OAAO,GAAU,YACX,GAAG,IAAgB,EAAM,MAAM,EAAO,EAAK,CAE9C,QAEK,IAMnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Config.mjs","names":[],"sources":["../../src/Facades/Config.ts"],"sourcesContent":["import type { Config as ConfigClass } from '@/Foundation/Config/Config';\nimport { Facade } from '@/Support/Facade';\n\n/**\n * Config Facade - Static access to configuration\n * Illuminate\\Support\\Facades\\Config\n *\n * @example\n * Config.get('app.name')\n * Config.set('app.debug', true)\n * Config.has('database.connections.mysql')\n */\nclass ConfigFacade extends Facade {\n protected static getFacadeAccessor(): string {\n return 'config';\n }\n}\n\n// Export facade with proper typing\nexport const Config = ConfigFacade as typeof ConfigFacade & ConfigClass;\n"],"mappings":"+CAmBA,MAAa,
|
|
1
|
+
{"version":3,"file":"Config.mjs","names":[],"sources":["../../src/Facades/Config.ts"],"sourcesContent":["import type { Config as ConfigClass } from '@/Foundation/Config/Config';\nimport { Facade } from '@/Support/Facade';\n\n/**\n * Config Facade - Static access to configuration\n * Illuminate\\Support\\Facades\\Config\n *\n * @example\n * Config.get('app.name')\n * Config.set('app.debug', true)\n * Config.has('database.connections.mysql')\n */\nclass ConfigFacade extends Facade {\n protected static getFacadeAccessor(): string {\n return 'config';\n }\n}\n\n// Export facade with proper typing\nexport const Config = ConfigFacade as typeof ConfigFacade & ConfigClass;\n"],"mappings":"+CAmBA,MAAa,EAAS,cAPK,CAAO,CAChC,OAAiB,mBAA4B,CAC3C,MAAO"}
|
package/dist/Facades/DB.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DB.mjs","names":[],"sources":["../../src/Facades/DB.ts"],"sourcesContent":["/**\n * DB Facade\n *\n * Provides static access to the DatabaseManager\n */\n\nimport { DatabaseManager } from '@/Database/DatabaseManager';\nimport { Facade } from '@/Support/Facade';\n\nclass DBFacade extends Facade {\n protected static getFacadeAccessor(): string {\n return 'db';\n }\n}\n\n// Create proxy for static method access\nexport const DB = new Proxy(DBFacade, {\n get(target: any, prop: string) {\n // Get the resolved instance from the container\n const root = target.getFacadeRoot() as DatabaseManager;\n\n if (!root) {\n throw new Error('DB Facade: Database manager not found in container. Did you register DatabaseServiceProvider?');\n }\n\n // If accessing a method/property on DatabaseManager\n if (root && typeof (root as any)[prop] === 'function') {\n return (...args: any[]) => (root as any)[prop](...args);\n }\n\n if (root && prop in root) {\n return (root as any)[prop];\n }\n\n // Default table() shortcut - get connection and call table()\n if (prop === 'table') {\n return (tableName: string) => root.connection().table(tableName);\n }\n\n // Proxy other methods to the default connection\n const connection = root.connection();\n\n if (connection && typeof (connection as any)[prop] === 'function') {\n return (...args: any[]) => (connection as any)[prop](...args);\n }\n\n return (connection as any)?.[prop];\n },\n});\n"],"mappings":"+CAgBA,MAAa,EAAK,IAAI,
|
|
1
|
+
{"version":3,"file":"DB.mjs","names":[],"sources":["../../src/Facades/DB.ts"],"sourcesContent":["/**\n * DB Facade\n *\n * Provides static access to the DatabaseManager\n */\n\nimport { DatabaseManager } from '@/Database/DatabaseManager';\nimport { Facade } from '@/Support/Facade';\n\nclass DBFacade extends Facade {\n protected static getFacadeAccessor(): string {\n return 'db';\n }\n}\n\n// Create proxy for static method access\nexport const DB = new Proxy(DBFacade, {\n get(target: any, prop: string) {\n // Get the resolved instance from the container\n const root = target.getFacadeRoot() as DatabaseManager;\n\n if (!root) {\n throw new Error('DB Facade: Database manager not found in container. Did you register DatabaseServiceProvider?');\n }\n\n // If accessing a method/property on DatabaseManager\n if (root && typeof (root as any)[prop] === 'function') {\n return (...args: any[]) => (root as any)[prop](...args);\n }\n\n if (root && prop in root) {\n return (root as any)[prop];\n }\n\n // Default table() shortcut - get connection and call table()\n if (prop === 'table') {\n return (tableName: string) => root.connection().table(tableName);\n }\n\n // Proxy other methods to the default connection\n const connection = root.connection();\n\n if (connection && typeof (connection as any)[prop] === 'function') {\n return (...args: any[]) => (connection as any)[prop](...args);\n }\n\n return (connection as any)?.[prop];\n },\n});\n"],"mappings":"+CAgBA,MAAa,EAAK,IAAI,MAAM,cAPL,CAAO,CAC5B,OAAiB,mBAA4B,CAC3C,MAAO,OAK2B,CACpC,IAAI,EAAa,EAAc,CAE7B,IAAM,EAAO,EAAO,eAAe,CAEnC,GAAI,CAAC,EACH,MAAU,MAAM,gGAAgG,CAIlH,GAAI,GAAQ,OAAQ,EAAa,IAAU,WACzC,OAAQ,GAAG,IAAiB,EAAa,GAAM,GAAG,EAAK,CAGzD,GAAI,GAAQ,KAAQ,EAClB,OAAQ,EAAa,GAIvB,GAAI,IAAS,QACX,MAAQ,IAAsB,EAAK,YAAY,CAAC,MAAM,EAAU,CAIlE,IAAM,EAAa,EAAK,YAAY,CAMpC,OAJI,GAAc,OAAQ,EAAmB,IAAU,YAC7C,GAAG,IAAiB,EAAmB,GAAM,GAAG,EAAK,CAGvD,IAAqB,IAEhC,CAAC"}
|
package/dist/Facades/Event.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Facade } from "../Support/Facade.cjs";
|
|
2
1
|
import { Event as Event$1 } from "../Events/Event.cjs";
|
|
3
2
|
import { EventListener } from "../Events/types.cjs";
|
|
4
3
|
import { Dispatcher } from "../Events/Dispatcher.cjs";
|
|
4
|
+
import { Facade } from "../Support/Facade.cjs";
|
|
5
5
|
import { EventFake } from "../Support/Testing/Fakes/EventFake.cjs";
|
|
6
6
|
|
|
7
7
|
//#region src/Facades/Event.d.ts
|
package/dist/Facades/Event.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Facade } from "../Support/Facade.mjs";
|
|
2
1
|
import { Event as Event$1 } from "../Events/Event.mjs";
|
|
3
2
|
import { EventListener } from "../Events/types.mjs";
|
|
4
3
|
import { Dispatcher } from "../Events/Dispatcher.mjs";
|
|
4
|
+
import { Facade } from "../Support/Facade.mjs";
|
|
5
5
|
import { EventFake } from "../Support/Testing/Fakes/EventFake.mjs";
|
|
6
6
|
|
|
7
7
|
//#region src/Facades/Event.d.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Event.mjs","names":[],"sources":["../../src/Facades/Event.ts"],"sourcesContent":["import type { Dispatcher } from '@/Events/Dispatcher';\nimport type { Event as EventClass } from '@/Events/Event';\nimport type { EventListener } from '@/Events/types';\nimport { Facade } from '@/Support/Facade';\nimport { EventFake } from '@/Support/Testing/Fakes/EventFake';\n\n/**\n * Event Facade\n *\n * Provides static access to the event dispatcher for listening to and dispatching events.\n * Includes testing utilities for faking events in tests.\n *\n * @example\n * ```typescript\n * // Listen to events\n * Event.listen(UserRegistered, SendWelcomeEmail);\n * Event.listen('user.*', (event) => console.log(event));\n *\n * // Dispatch events\n * Event.dispatch(new UserRegistered(user));\n * Event.dispatch('user.registered', [user]);\n *\n * // Dispatch until first non-null response\n * const result = Event.until(new ValidateUser(user));\n *\n * // Testing - Fake all events\n * Event.fake();\n * // Your code that dispatches events\n * Event.assertDispatched(UserRegistered);\n * Event.assertDispatchedTimes(UserRegistered, 2);\n *\n * // Fake specific events\n * Event.fake([UserRegistered, OrderPlaced]);\n *\n * // Fake all except specific events\n * Event.fakeExcept([UserDeleted]);\n * ```\n */\nclass EventFacadeClass extends Facade {\n protected static getFacadeAccessor(): string {\n return 'events';\n }\n /**\n * Fake events for testing\n *\n * Replaces the real event dispatcher with a fake that records all\n * dispatched events instead of calling listeners. Returns the fake\n * instance for making assertions.\n *\n * @param events - Optional array of events to fake (fakes all if not provided)\n * @returns EventFake instance for assertions\n *\n * @example\n * ```typescript\n * // Fake all events\n * const fake = Event.fake();\n * // Your code\n * fake.assertDispatched(UserRegistered);\n *\n * // Fake specific events only\n * Event.fake([UserRegistered, OrderPlaced]);\n * ```\n */\n static fake(events?: (string | (new (...args: any[]) => EventClass))[]): EventFake {\n const app = this.getFacadeApplication();\n const fake = new EventFake(app);\n\n if (events && events.length > 0) {\n // Create selective fake that only intercepts specified events\n const eventNames = events.map((e) => (typeof e === 'string' ? e : e.name));\n fake.setFakedEvents(eventNames);\n\n // Store original dispatcher for pass-through\n try {\n const originalDispatcher = app.make<Dispatcher>('events');\n fake.setOriginalDispatcher(originalDispatcher);\n } catch (error) {\n // Dispatcher not registered yet, that's okay\n }\n }\n\n // Replace the events binding with the fake\n app.instance('events', fake);\n this.clearResolvedInstance('events');\n\n return fake;\n }\n\n /**\n * Fake all events except the specified ones\n *\n * All events will be faked except those in the provided array,\n * which will dispatch normally.\n *\n * @param events - Events that should NOT be faked\n * @returns EventFake instance for assertions\n *\n * @example\n * ```typescript\n * // Fake all events except UserDeleted\n * Event.fakeExcept([UserDeleted]);\n * // UserDeleted will dispatch normally, all others will be faked\n * ```\n */\n static fakeExcept(events: (string | (new (...args: any[]) => EventClass))[]): EventFake {\n const app = this.getFacadeApplication();\n const fake = new EventFake(app);\n\n const eventNames = events.map((e) => (typeof e === 'string' ? e : e.name));\n fake.setExceptedEvents(eventNames);\n\n // Store original dispatcher for pass-through\n try {\n const originalDispatcher = app.make<Dispatcher>('events');\n fake.setOriginalDispatcher(originalDispatcher);\n } catch (error) {\n // Dispatcher not registered yet, that's okay\n }\n\n // Replace the events binding with the fake\n app.instance('events', fake);\n this.clearResolvedInstance('events');\n\n return fake;\n }\n\n /**\n * Fake events only for the duration of a callback\n *\n * Temporarily replaces the event dispatcher with a fake, executes\n * the callback, then restores the original dispatcher. Useful for\n * scoping fakes to specific test blocks.\n *\n * @param callback - Function to execute with faked events\n * @returns Result of the callback and the fake instance\n *\n * @example\n * ```typescript\n * const [result, fake] = await Event.fakeFor(async () => {\n * await someService.createUser();\n * return 'done';\n * });\n *\n * fake.assertDispatched(UserRegistered);\n * expect(result).toBe('done');\n * ```\n */\n static async fakeFor<T>(callback: (fake: EventFake) => T | Promise<T>): Promise<[T, EventFake]> {\n const app = this.getFacadeApplication();\n\n // Store the original binding\n const originalBinding = app.bound('events');\n let originalDispatcher: Dispatcher | undefined;\n\n if (originalBinding) {\n try {\n originalDispatcher = app.make<Dispatcher>('events');\n } catch (error) {\n // Ignore if can't resolve\n }\n }\n\n // Create and install fake\n const fake = this.fake();\n\n try {\n const result = await callback(fake);\n return [result, fake];\n } finally {\n // Restore original dispatcher\n if (originalDispatcher) {\n app.instance('events', originalDispatcher);\n } else {\n // Re-register the singleton binding\n const { Dispatcher } = await import('@/Events/Dispatcher');\n app.singleton('events', (container: any) => new Dispatcher(container));\n }\n this.clearResolvedInstance('events');\n }\n }\n\n /**\n * Assert that an event was dispatched\n *\n * Can only be called after Event.fake() has been called.\n *\n * @param event - The event name or class\n * @param callback - Optional callback to filter events\n *\n * @example\n * ```typescript\n * Event.fake();\n * // Your code\n * Event.assertDispatched(UserRegistered);\n * Event.assertDispatched(UserRegistered, (event) => event.user.email === 'test@example.com');\n * ```\n */\n static assertDispatched(\n event: string | (new (...args: any[]) => EventClass),\n callback?: (event: EventClass) => boolean\n ): void {\n const fake = this.getFakeInstance();\n fake.assertDispatched(event, callback);\n }\n\n /**\n * Assert that an event was NOT dispatched\n *\n * Can only be called after Event.fake() has been called.\n *\n * @param event - The event name or class\n * @param callback - Optional callback to filter events\n *\n * @example\n * ```typescript\n * Event.fake();\n * // Your code\n * Event.assertNotDispatched(UserDeleted);\n * ```\n */\n static assertNotDispatched(\n event: string | (new (...args: any[]) => EventClass),\n callback?: (event: EventClass) => boolean\n ): void {\n const fake = this.getFakeInstance();\n fake.assertNotDispatched(event, callback);\n }\n\n /**\n * Assert that an event was dispatched a specific number of times\n *\n * Can only be called after Event.fake() has been called.\n *\n * @param event - The event name or class\n * @param times - Expected number of dispatches\n *\n * @example\n * ```typescript\n * Event.fake();\n * // Your code\n * Event.assertDispatchedTimes(UserRegistered, 3);\n * ```\n */\n static assertDispatchedTimes(event: string | (new (...args: any[]) => EventClass), times: number): void {\n const fake = this.getFakeInstance();\n fake.assertDispatchedTimes(event, times);\n }\n\n /**\n * Assert that no events were dispatched\n *\n * Can only be called after Event.fake() has been called.\n *\n * @example\n * ```typescript\n * Event.fake();\n * // Your code that shouldn't dispatch events\n * Event.assertNothingDispatched();\n * ```\n */\n static assertNothingDispatched(): void {\n const fake = this.getFakeInstance();\n fake.assertNothingDispatched();\n }\n\n /**\n * Assert that a listener is registered for an event\n *\n * @param event - The event name or class\n * @param listener - Optional specific listener to check for\n *\n * @example\n * ```typescript\n * Event.fake();\n * Event.listen(UserRegistered, SendWelcomeEmail);\n * Event.assertListening(UserRegistered);\n * Event.assertListening(UserRegistered, SendWelcomeEmail);\n * ```\n */\n static assertListening(\n event: string | (new (...args: any[]) => EventClass),\n listener?: string | EventListener\n ): void {\n const fake = this.getFakeInstance();\n fake.assertListening(event, listener);\n }\n\n /**\n * Get the fake instance\n *\n * @returns The EventFake instance\n * @throws Error if Event.fake() hasn't been called\n */\n protected static getFakeInstance(): EventFake {\n const app = this.getFacadeApplication();\n const instance = app.make<EventFake>('events');\n\n if (!(instance instanceof EventFake)) {\n throw new Error('Event facade is not faked. Call Event.fake() before making assertions.');\n }\n\n return instance;\n }\n\n /**\n * Check if the event dispatcher is currently faked\n *\n * @returns true if using EventFake\n */\n static isFaked(): boolean {\n try {\n const app = this.getFacadeApplication();\n const instance = app.make('events');\n return instance instanceof EventFake;\n } catch (error) {\n return false;\n }\n }\n}\n\n/**\n * Export facade with Proxy for static method calls\n */\nexport const Event = new Proxy(EventFacadeClass, {\n get(target, prop) {\n // First check if it's a static method on the facade class itself\n if (prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n // Then try to get from the facade root (the actual Dispatcher instance)\n try {\n const root = (target as any).getFacadeRoot();\n if (root && prop in root) {\n const value = root[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n } catch (error) {\n // Facade root not available yet, that's okay\n }\n\n return undefined;\n },\n}) as unknown as typeof EventFacadeClass & Dispatcher;\n\n/**\n * Re-export EventFake for direct use\n */\nexport { EventFake };\n"],"mappings":"kHAmUA,MAAa,EAAQ,IAAI,MA7RzB,cAA+B,CAAO,CACpC,OAAiB,mBAA4B,CAC3C,MAAO,SAuBT,OAAO,KAAK,EAAuE,CACjF,IAAM,EAAM,KAAK,sBAAsB,CACjC,EAAO,IAAI,EAAU,EAAI,CAE/B,GAAI,GAAU,EAAO,OAAS,EAAG,CAE/B,IAAM,EAAa,EAAO,IAAK,GAAO,OAAO,GAAM,SAAW,EAAI,EAAE,KAAM,CAC1E,EAAK,eAAe,EAAW,CAG/B,GAAI,CACF,IAAM,EAAqB,EAAI,KAAiB,SAAS,CACzD,EAAK,sBAAsB,EAAmB,MAChC,GASlB,OAHA,EAAI,SAAS,SAAU,EAAK,CAC5B,KAAK,sBAAsB,SAAS,CAE7B,EAmBT,OAAO,WAAW,EAAsE,CACtF,IAAM,EAAM,KAAK,sBAAsB,CACjC,EAAO,IAAI,EAAU,EAAI,CAEzB,EAAa,EAAO,IAAK,GAAO,OAAO,GAAM,SAAW,EAAI,EAAE,KAAM,CAC1E,EAAK,kBAAkB,EAAW,CAGlC,GAAI,CACF,IAAM,EAAqB,EAAI,KAAiB,SAAS,CACzD,EAAK,sBAAsB,EAAmB,MAChC,EAQhB,OAHA,EAAI,SAAS,SAAU,EAAK,CAC5B,KAAK,sBAAsB,SAAS,CAE7B,EAwBT,aAAa,QAAW,EAAwE,CAC9F,IAAM,EAAM,KAAK,sBAAsB,CAGjC,EAAkB,EAAI,MAAM,SAAS,CACvC,EAEJ,GAAI,EACF,GAAI,CACF,EAAqB,EAAI,KAAiB,SAAS,MACrC,EAMlB,IAAM,EAAO,KAAK,MAAM,CAExB,GAAI,CAEF,MAAO,CADQ,MAAM,EAAS,EAAK,CACnB,EAAK,QACb,CAER,GAAI,EACF,EAAI,SAAS,SAAU,EAAmB,KACrC,CAEL,GAAM,CAAE,cAAe,MAAM,OAAO,4BACpC,EAAI,UAAU,SAAW,GAAmB,IAAI,EAAW,EAAU,CAAC,CAExE,KAAK,sBAAsB,SAAS,EAoBxC,OAAO,iBACL,EACA,EACM,CACO,KAAK,iBAAiB,CAC9B,iBAAiB,EAAO,EAAS,CAkBxC,OAAO,oBACL,EACA,EACM,CACO,KAAK,iBAAiB,CAC9B,oBAAoB,EAAO,EAAS,CAkB3C,OAAO,sBAAsB,EAAsD,EAAqB,CACzF,KAAK,iBAAiB,CAC9B,sBAAsB,EAAO,EAAM,CAe1C,OAAO,yBAAgC,CACxB,KAAK,iBAAiB,CAC9B,yBAAyB,CAiBhC,OAAO,gBACL,EACA,EACM,CACO,KAAK,iBAAiB,CAC9B,gBAAgB,EAAO,EAAS,CASvC,OAAiB,iBAA6B,CAE5C,IAAM,EADM,KAAK,sBAAsB,CAClB,KAAgB,SAAS,CAE9C,GAAI,EAAE,aAAoB,GACxB,MAAU,MAAM,yEAAyE,CAG3F,OAAO,EAQT,OAAO,SAAmB,CACxB,GAAI,CAGF,OAFY,KAAK,sBAAsB,CAClB,KAAK,SAAS,WACR,OACb,CACd,MAAO,MAQoC,CAC/C,IAAI,EAAQ,EAAM,CAEhB,GAAI,KAAQ,EAAQ,CAClB,IAAM,EAAS,EAAe,GAI9B,OAHI,OAAO,GAAU,WACZ,EAAM,KAAK,EAAO,CAEpB,EAIT,GAAI,CACF,IAAM,EAAQ,EAAe,eAAe,CAC5C,GAAI,GAAQ,KAAQ,EAAM,CACxB,IAAM,EAAQ,EAAK,GAInB,OAHI,OAAO,GAAU,YACX,GAAG,IAAgB,EAAM,MAAM,EAAM,EAAK,CAE7C,QAEK,IAMnB,CAAC"}
|
|
1
|
+
{"version":3,"file":"Event.mjs","names":[],"sources":["../../src/Facades/Event.ts"],"sourcesContent":["import type { Dispatcher } from '@/Events/Dispatcher';\nimport type { Event as EventClass } from '@/Events/Event';\nimport type { EventListener } from '@/Events/types';\nimport { Facade } from '@/Support/Facade';\nimport { EventFake } from '@/Support/Testing/Fakes/EventFake';\n\n/**\n * Event Facade\n *\n * Provides static access to the event dispatcher for listening to and dispatching events.\n * Includes testing utilities for faking events in tests.\n *\n * @example\n * ```typescript\n * // Listen to events\n * Event.listen(UserRegistered, SendWelcomeEmail);\n * Event.listen('user.*', (event) => console.log(event));\n *\n * // Dispatch events\n * Event.dispatch(new UserRegistered(user));\n * Event.dispatch('user.registered', [user]);\n *\n * // Dispatch until first non-null response\n * const result = Event.until(new ValidateUser(user));\n *\n * // Testing - Fake all events\n * Event.fake();\n * // Your code that dispatches events\n * Event.assertDispatched(UserRegistered);\n * Event.assertDispatchedTimes(UserRegistered, 2);\n *\n * // Fake specific events\n * Event.fake([UserRegistered, OrderPlaced]);\n *\n * // Fake all except specific events\n * Event.fakeExcept([UserDeleted]);\n * ```\n */\nclass EventFacadeClass extends Facade {\n protected static getFacadeAccessor(): string {\n return 'events';\n }\n /**\n * Fake events for testing\n *\n * Replaces the real event dispatcher with a fake that records all\n * dispatched events instead of calling listeners. Returns the fake\n * instance for making assertions.\n *\n * @param events - Optional array of events to fake (fakes all if not provided)\n * @returns EventFake instance for assertions\n *\n * @example\n * ```typescript\n * // Fake all events\n * const fake = Event.fake();\n * // Your code\n * fake.assertDispatched(UserRegistered);\n *\n * // Fake specific events only\n * Event.fake([UserRegistered, OrderPlaced]);\n * ```\n */\n static fake(events?: (string | (new (...args: any[]) => EventClass))[]): EventFake {\n const app = this.getFacadeApplication();\n const fake = new EventFake(app);\n\n if (events && events.length > 0) {\n // Create selective fake that only intercepts specified events\n const eventNames = events.map((e) => (typeof e === 'string' ? e : e.name));\n fake.setFakedEvents(eventNames);\n\n // Store original dispatcher for pass-through\n try {\n const originalDispatcher = app.make<Dispatcher>('events');\n fake.setOriginalDispatcher(originalDispatcher);\n } catch (error) {\n // Dispatcher not registered yet, that's okay\n }\n }\n\n // Replace the events binding with the fake\n app.instance('events', fake);\n this.clearResolvedInstance('events');\n\n return fake;\n }\n\n /**\n * Fake all events except the specified ones\n *\n * All events will be faked except those in the provided array,\n * which will dispatch normally.\n *\n * @param events - Events that should NOT be faked\n * @returns EventFake instance for assertions\n *\n * @example\n * ```typescript\n * // Fake all events except UserDeleted\n * Event.fakeExcept([UserDeleted]);\n * // UserDeleted will dispatch normally, all others will be faked\n * ```\n */\n static fakeExcept(events: (string | (new (...args: any[]) => EventClass))[]): EventFake {\n const app = this.getFacadeApplication();\n const fake = new EventFake(app);\n\n const eventNames = events.map((e) => (typeof e === 'string' ? e : e.name));\n fake.setExceptedEvents(eventNames);\n\n // Store original dispatcher for pass-through\n try {\n const originalDispatcher = app.make<Dispatcher>('events');\n fake.setOriginalDispatcher(originalDispatcher);\n } catch (error) {\n // Dispatcher not registered yet, that's okay\n }\n\n // Replace the events binding with the fake\n app.instance('events', fake);\n this.clearResolvedInstance('events');\n\n return fake;\n }\n\n /**\n * Fake events only for the duration of a callback\n *\n * Temporarily replaces the event dispatcher with a fake, executes\n * the callback, then restores the original dispatcher. Useful for\n * scoping fakes to specific test blocks.\n *\n * @param callback - Function to execute with faked events\n * @returns Result of the callback and the fake instance\n *\n * @example\n * ```typescript\n * const [result, fake] = await Event.fakeFor(async () => {\n * await someService.createUser();\n * return 'done';\n * });\n *\n * fake.assertDispatched(UserRegistered);\n * expect(result).toBe('done');\n * ```\n */\n static async fakeFor<T>(callback: (fake: EventFake) => T | Promise<T>): Promise<[T, EventFake]> {\n const app = this.getFacadeApplication();\n\n // Store the original binding\n const originalBinding = app.bound('events');\n let originalDispatcher: Dispatcher | undefined;\n\n if (originalBinding) {\n try {\n originalDispatcher = app.make<Dispatcher>('events');\n } catch (error) {\n // Ignore if can't resolve\n }\n }\n\n // Create and install fake\n const fake = this.fake();\n\n try {\n const result = await callback(fake);\n return [result, fake];\n } finally {\n // Restore original dispatcher\n if (originalDispatcher) {\n app.instance('events', originalDispatcher);\n } else {\n // Re-register the singleton binding\n const { Dispatcher } = await import('@/Events/Dispatcher');\n app.singleton('events', (container: any) => new Dispatcher(container));\n }\n this.clearResolvedInstance('events');\n }\n }\n\n /**\n * Assert that an event was dispatched\n *\n * Can only be called after Event.fake() has been called.\n *\n * @param event - The event name or class\n * @param callback - Optional callback to filter events\n *\n * @example\n * ```typescript\n * Event.fake();\n * // Your code\n * Event.assertDispatched(UserRegistered);\n * Event.assertDispatched(UserRegistered, (event) => event.user.email === 'test@example.com');\n * ```\n */\n static assertDispatched(\n event: string | (new (...args: any[]) => EventClass),\n callback?: (event: EventClass) => boolean\n ): void {\n const fake = this.getFakeInstance();\n fake.assertDispatched(event, callback);\n }\n\n /**\n * Assert that an event was NOT dispatched\n *\n * Can only be called after Event.fake() has been called.\n *\n * @param event - The event name or class\n * @param callback - Optional callback to filter events\n *\n * @example\n * ```typescript\n * Event.fake();\n * // Your code\n * Event.assertNotDispatched(UserDeleted);\n * ```\n */\n static assertNotDispatched(\n event: string | (new (...args: any[]) => EventClass),\n callback?: (event: EventClass) => boolean\n ): void {\n const fake = this.getFakeInstance();\n fake.assertNotDispatched(event, callback);\n }\n\n /**\n * Assert that an event was dispatched a specific number of times\n *\n * Can only be called after Event.fake() has been called.\n *\n * @param event - The event name or class\n * @param times - Expected number of dispatches\n *\n * @example\n * ```typescript\n * Event.fake();\n * // Your code\n * Event.assertDispatchedTimes(UserRegistered, 3);\n * ```\n */\n static assertDispatchedTimes(event: string | (new (...args: any[]) => EventClass), times: number): void {\n const fake = this.getFakeInstance();\n fake.assertDispatchedTimes(event, times);\n }\n\n /**\n * Assert that no events were dispatched\n *\n * Can only be called after Event.fake() has been called.\n *\n * @example\n * ```typescript\n * Event.fake();\n * // Your code that shouldn't dispatch events\n * Event.assertNothingDispatched();\n * ```\n */\n static assertNothingDispatched(): void {\n const fake = this.getFakeInstance();\n fake.assertNothingDispatched();\n }\n\n /**\n * Assert that a listener is registered for an event\n *\n * @param event - The event name or class\n * @param listener - Optional specific listener to check for\n *\n * @example\n * ```typescript\n * Event.fake();\n * Event.listen(UserRegistered, SendWelcomeEmail);\n * Event.assertListening(UserRegistered);\n * Event.assertListening(UserRegistered, SendWelcomeEmail);\n * ```\n */\n static assertListening(\n event: string | (new (...args: any[]) => EventClass),\n listener?: string | EventListener\n ): void {\n const fake = this.getFakeInstance();\n fake.assertListening(event, listener);\n }\n\n /**\n * Get the fake instance\n *\n * @returns The EventFake instance\n * @throws Error if Event.fake() hasn't been called\n */\n protected static getFakeInstance(): EventFake {\n const app = this.getFacadeApplication();\n const instance = app.make<EventFake>('events');\n\n if (!(instance instanceof EventFake)) {\n throw new Error('Event facade is not faked. Call Event.fake() before making assertions.');\n }\n\n return instance;\n }\n\n /**\n * Check if the event dispatcher is currently faked\n *\n * @returns true if using EventFake\n */\n static isFaked(): boolean {\n try {\n const app = this.getFacadeApplication();\n const instance = app.make('events');\n return instance instanceof EventFake;\n } catch (error) {\n return false;\n }\n }\n}\n\n/**\n * Export facade with Proxy for static method calls\n */\nexport const Event = new Proxy(EventFacadeClass, {\n get(target, prop) {\n // First check if it's a static method on the facade class itself\n if (prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n // Then try to get from the facade root (the actual Dispatcher instance)\n try {\n const root = (target as any).getFacadeRoot();\n if (root && prop in root) {\n const value = root[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n } catch (error) {\n // Facade root not available yet, that's okay\n }\n\n return undefined;\n },\n}) as unknown as typeof EventFacadeClass & Dispatcher;\n\n/**\n * Re-export EventFake for direct use\n */\nexport { EventFake };\n"],"mappings":"kHAmUA,MAAa,EAAQ,IAAI,MAAM,cA7RA,CAAO,CACpC,OAAiB,mBAA4B,CAC3C,MAAO,SAuBT,OAAO,KAAK,EAAuE,CACjF,IAAM,EAAM,KAAK,sBAAsB,CACjC,EAAO,IAAI,EAAU,EAAI,CAE/B,GAAI,GAAU,EAAO,OAAS,EAAG,CAE/B,IAAM,EAAa,EAAO,IAAK,GAAO,OAAO,GAAM,SAAW,EAAI,EAAE,KAAM,CAC1E,EAAK,eAAe,EAAW,CAG/B,GAAI,CACF,IAAM,EAAqB,EAAI,KAAiB,SAAS,CACzD,EAAK,sBAAsB,EAAmB,MAChC,GASlB,OAHA,EAAI,SAAS,SAAU,EAAK,CAC5B,KAAK,sBAAsB,SAAS,CAE7B,EAmBT,OAAO,WAAW,EAAsE,CACtF,IAAM,EAAM,KAAK,sBAAsB,CACjC,EAAO,IAAI,EAAU,EAAI,CAEzB,EAAa,EAAO,IAAK,GAAO,OAAO,GAAM,SAAW,EAAI,EAAE,KAAM,CAC1E,EAAK,kBAAkB,EAAW,CAGlC,GAAI,CACF,IAAM,EAAqB,EAAI,KAAiB,SAAS,CACzD,EAAK,sBAAsB,EAAmB,MAChC,EAQhB,OAHA,EAAI,SAAS,SAAU,EAAK,CAC5B,KAAK,sBAAsB,SAAS,CAE7B,EAwBT,aAAa,QAAW,EAAwE,CAC9F,IAAM,EAAM,KAAK,sBAAsB,CAGjC,EAAkB,EAAI,MAAM,SAAS,CACvC,EAEJ,GAAI,EACF,GAAI,CACF,EAAqB,EAAI,KAAiB,SAAS,MACrC,EAMlB,IAAM,EAAO,KAAK,MAAM,CAExB,GAAI,CAEF,MAAO,CAAC,MADa,EAAS,EAAK,CACnB,EAAK,QACb,CAER,GAAI,EACF,EAAI,SAAS,SAAU,EAAmB,KACrC,CAEL,GAAM,CAAE,cAAe,MAAM,OAAO,4BACpC,EAAI,UAAU,SAAW,GAAmB,IAAI,EAAW,EAAU,CAAC,CAExE,KAAK,sBAAsB,SAAS,EAoBxC,OAAO,iBACL,EACA,EACM,CAEN,KADkB,iBACd,CAAC,iBAAiB,EAAO,EAAS,CAkBxC,OAAO,oBACL,EACA,EACM,CAEN,KADkB,iBACd,CAAC,oBAAoB,EAAO,EAAS,CAkB3C,OAAO,sBAAsB,EAAsD,EAAqB,CAEtG,KADkB,iBACd,CAAC,sBAAsB,EAAO,EAAM,CAe1C,OAAO,yBAAgC,CAErC,KADkB,iBACd,CAAC,yBAAyB,CAiBhC,OAAO,gBACL,EACA,EACM,CAEN,KADkB,iBACd,CAAC,gBAAgB,EAAO,EAAS,CASvC,OAAiB,iBAA6B,CAE5C,IAAM,EADM,KAAK,sBACG,CAAC,KAAgB,SAAS,CAE9C,GAAI,EAAE,aAAoB,GACxB,MAAU,MAAM,yEAAyE,CAG3F,OAAO,EAQT,OAAO,SAAmB,CACxB,GAAI,CAGF,OAFY,KAAK,sBACG,CAAC,KAAK,SACX,WAAY,OACb,CACd,MAAO,MAQoC,CAC/C,IAAI,EAAQ,EAAM,CAEhB,GAAI,KAAQ,EAAQ,CAClB,IAAM,EAAS,EAAe,GAI9B,OAHI,OAAO,GAAU,WACZ,EAAM,KAAK,EAAO,CAEpB,EAIT,GAAI,CACF,IAAM,EAAQ,EAAe,eAAe,CAC5C,GAAI,GAAQ,KAAQ,EAAM,CACxB,IAAM,EAAQ,EAAK,GAInB,OAHI,OAAO,GAAU,YACX,GAAG,IAAgB,EAAM,MAAM,EAAM,EAAK,CAE7C,QAEK,IAMnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Queue.mjs","names":[],"sources":["../../src/Facades/Queue.ts"],"sourcesContent":["/**\n * Queue Facade\n *\n * Provides static access to the queue manager for dispatching\n * and managing queued jobs.\n *\n * @example\n * ```typescript\n * // Push a job onto the queue\n * await Queue.push(new ProcessPodcast(podcastId));\n *\n * // Push onto a specific queue\n * await Queue.pushOn('high-priority', new ProcessPodcast(podcastId));\n *\n * // Push with a delay\n * await Queue.later(60, new ProcessPodcast(podcastId));\n *\n * // Get queue size\n * const size = await Queue.size();\n *\n * // Event hooks\n * Queue.before((connectionName, job) => {\n * console.log('Processing:', job.displayName());\n * });\n *\n * Queue.after((connectionName, job) => {\n * console.log('Processed:', job.displayName());\n * });\n *\n * Queue.failing((connectionName, job, error) => {\n * console.error('Failed:', job.displayName(), error);\n * });\n * ```\n */\n\nimport type { QueueManager } from '@/Queue/QueueManager';\nimport { Facade } from '@/Support/Facade';\n\nclass QueueFacadeClass extends Facade {\n protected static getFacadeAccessor(): string {\n return 'queue';\n }\n}\n\nexport const Queue = new Proxy(QueueFacadeClass, {\n get(target, prop) {\n // First check if it's a static method on the facade class itself\n if (prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n // Then try to get from the facade root (the QueueManager instance)\n try {\n const root = (target as any).getFacadeRoot() as QueueManager;\n if (root && prop in root) {\n const value = (root as any)[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n } catch (error) {\n // Facade root not available yet\n }\n\n return undefined;\n },\n}) as unknown as typeof QueueFacadeClass & QueueManager;\n"],"mappings":"+CA4CA,MAAa,EAAQ,IAAI,
|
|
1
|
+
{"version":3,"file":"Queue.mjs","names":[],"sources":["../../src/Facades/Queue.ts"],"sourcesContent":["/**\n * Queue Facade\n *\n * Provides static access to the queue manager for dispatching\n * and managing queued jobs.\n *\n * @example\n * ```typescript\n * // Push a job onto the queue\n * await Queue.push(new ProcessPodcast(podcastId));\n *\n * // Push onto a specific queue\n * await Queue.pushOn('high-priority', new ProcessPodcast(podcastId));\n *\n * // Push with a delay\n * await Queue.later(60, new ProcessPodcast(podcastId));\n *\n * // Get queue size\n * const size = await Queue.size();\n *\n * // Event hooks\n * Queue.before((connectionName, job) => {\n * console.log('Processing:', job.displayName());\n * });\n *\n * Queue.after((connectionName, job) => {\n * console.log('Processed:', job.displayName());\n * });\n *\n * Queue.failing((connectionName, job, error) => {\n * console.error('Failed:', job.displayName(), error);\n * });\n * ```\n */\n\nimport type { QueueManager } from '@/Queue/QueueManager';\nimport { Facade } from '@/Support/Facade';\n\nclass QueueFacadeClass extends Facade {\n protected static getFacadeAccessor(): string {\n return 'queue';\n }\n}\n\nexport const Queue = new Proxy(QueueFacadeClass, {\n get(target, prop) {\n // First check if it's a static method on the facade class itself\n if (prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n // Then try to get from the facade root (the QueueManager instance)\n try {\n const root = (target as any).getFacadeRoot() as QueueManager;\n if (root && prop in root) {\n const value = (root as any)[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n } catch (error) {\n // Facade root not available yet\n }\n\n return undefined;\n },\n}) as unknown as typeof QueueFacadeClass & QueueManager;\n"],"mappings":"+CA4CA,MAAa,EAAQ,IAAI,MAAM,cANA,CAAO,CACpC,OAAiB,mBAA4B,CAC3C,MAAO,UAIsC,CAC/C,IAAI,EAAQ,EAAM,CAEhB,GAAI,KAAQ,EAAQ,CAClB,IAAM,EAAS,EAAe,GAI9B,OAHI,OAAO,GAAU,WACZ,EAAM,KAAK,EAAO,CAEpB,EAIT,GAAI,CACF,IAAM,EAAQ,EAAe,eAAe,CAC5C,GAAI,GAAQ,KAAQ,EAAM,CACxB,IAAM,EAAS,EAAa,GAI5B,OAHI,OAAO,GAAU,YACX,GAAG,IAAgB,EAAM,MAAM,EAAM,EAAK,CAE7C,QAEK,IAMnB,CAAC"}
|
package/dist/Facades/Route.d.cts
CHANGED
package/dist/Facades/Route.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Route.mjs","names":[],"sources":["../../src/Facades/Route.ts"],"sourcesContent":["import { Router } from '@/Routing/Router';\nimport { Facade } from '@/Support/Facade';\n\n/**\n * Route Facade - Static access to the Router\n * Usage: Route.get('/path', handler)\n */\nclass RouteFacade extends Facade {\n protected static getFacadeAccessor(): string {\n return 'router';\n }\n\n static get: Router['get'];\n static post: Router['post'];\n static put: Router['put'];\n static patch: Router['patch'];\n static delete: Router['delete'];\n static any: Router['any'];\n static match: Router['match'];\n static group: Router['group'];\n}\n\n// Create proxy to enable static method calls\nexport const Route = new Proxy(RouteFacade, {\n get(target, prop) {\n // First try to get from the facade root (the actual Router instance)\n try {\n const root = (target as any).getFacadeRoot();\n if (root && prop in root) {\n const value = root[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n } catch (error) {\n // Facade root not available yet, fall through\n }\n\n // Fall back to static properties/methods of the Facade class itself\n if (typeof prop === 'string' && prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n return undefined;\n },\n}) as unknown as typeof RouteFacade & Omit<Router, 'app'>;\n"],"mappings":"+CAuBA,MAAa,EAAQ,IAAI,
|
|
1
|
+
{"version":3,"file":"Route.mjs","names":[],"sources":["../../src/Facades/Route.ts"],"sourcesContent":["import { Router } from '@/Routing/Router';\nimport { Facade } from '@/Support/Facade';\n\n/**\n * Route Facade - Static access to the Router\n * Usage: Route.get('/path', handler)\n */\nclass RouteFacade extends Facade {\n protected static getFacadeAccessor(): string {\n return 'router';\n }\n\n static get: Router['get'];\n static post: Router['post'];\n static put: Router['put'];\n static patch: Router['patch'];\n static delete: Router['delete'];\n static any: Router['any'];\n static match: Router['match'];\n static group: Router['group'];\n}\n\n// Create proxy to enable static method calls\nexport const Route = new Proxy(RouteFacade, {\n get(target, prop) {\n // First try to get from the facade root (the actual Router instance)\n try {\n const root = (target as any).getFacadeRoot();\n if (root && prop in root) {\n const value = root[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n } catch (error) {\n // Facade root not available yet, fall through\n }\n\n // Fall back to static properties/methods of the Facade class itself\n if (typeof prop === 'string' && prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n return undefined;\n },\n}) as unknown as typeof RouteFacade & Omit<Router, 'app'>;\n"],"mappings":"+CAuBA,MAAa,EAAQ,IAAI,MAAM,cAhBL,CAAO,CAC/B,OAAiB,mBAA4B,CAC3C,MAAO,SAGT,OAAO,IACP,OAAO,KACP,OAAO,IACP,OAAO,MACP,OAAO,OACP,OAAO,IACP,OAAO,MACP,OAAO,OAImC,CAC1C,IAAI,EAAQ,EAAM,CAEhB,GAAI,CACF,IAAM,EAAQ,EAAe,eAAe,CAC5C,GAAI,GAAQ,KAAQ,EAAM,CACxB,IAAM,EAAQ,EAAK,GAInB,OAHI,OAAO,GAAU,YACX,GAAG,IAAgB,EAAM,MAAM,EAAM,EAAK,CAE7C,QAEK,EAKhB,GAAI,OAAO,GAAS,UAAY,KAAQ,EAAQ,CAC9C,IAAM,EAAS,EAAe,GAI9B,OAHI,OAAO,GAAU,WACZ,EAAM,KAAK,EAAO,CAEpB,IAKZ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"View.mjs","names":[],"sources":["../../src/Facades/View.ts"],"sourcesContent":["/**\n * View Facade\n *\n * Provides static access to the ViewFactory.\n *\n * @example\n * ```typescript\n * import { View } from '@orchestr-sh/orchestr';\n *\n * // Create a view\n * const v = View.make('welcome', { name: 'John' });\n * const html = await v.render();\n *\n * // Check if a view exists\n * if (View.exists('layouts.app')) { ... }\n *\n * // Share data with all views\n * View.share('appName', 'My App');\n * ```\n */\n\nimport type { ViewFactory } from '@/View/ViewFactory';\nimport { Facade } from '@/Support/Facade';\n\nclass ViewFacadeClass extends Facade {\n protected static getFacadeAccessor(): string {\n return 'view';\n }\n}\n\nexport const View = new Proxy(ViewFacadeClass, {\n get(target, prop) {\n // First check if it's a static method on the facade class itself\n if (prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n // Then proxy to the ViewFactory instance\n try {\n const root = (target as any).getFacadeRoot() as ViewFactory;\n if (root && prop in root) {\n const value = (root as any)[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n } catch {\n // Facade root not available yet\n }\n\n return undefined;\n },\n}) as unknown as typeof ViewFacadeClass & ViewFactory;\n"],"mappings":"+CA8BA,MAAa,EAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"View.mjs","names":[],"sources":["../../src/Facades/View.ts"],"sourcesContent":["/**\n * View Facade\n *\n * Provides static access to the ViewFactory.\n *\n * @example\n * ```typescript\n * import { View } from '@orchestr-sh/orchestr';\n *\n * // Create a view\n * const v = View.make('welcome', { name: 'John' });\n * const html = await v.render();\n *\n * // Check if a view exists\n * if (View.exists('layouts.app')) { ... }\n *\n * // Share data with all views\n * View.share('appName', 'My App');\n * ```\n */\n\nimport type { ViewFactory } from '@/View/ViewFactory';\nimport { Facade } from '@/Support/Facade';\n\nclass ViewFacadeClass extends Facade {\n protected static getFacadeAccessor(): string {\n return 'view';\n }\n}\n\nexport const View = new Proxy(ViewFacadeClass, {\n get(target, prop) {\n // First check if it's a static method on the facade class itself\n if (prop in target) {\n const value = (target as any)[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n\n // Then proxy to the ViewFactory instance\n try {\n const root = (target as any).getFacadeRoot() as ViewFactory;\n if (root && prop in root) {\n const value = (root as any)[prop];\n if (typeof value === 'function') {\n return (...args: any[]) => value.apply(root, args);\n }\n return value;\n }\n } catch {\n // Facade root not available yet\n }\n\n return undefined;\n },\n}) as unknown as typeof ViewFacadeClass & ViewFactory;\n"],"mappings":"+CA8BA,MAAa,EAAO,IAAI,MAAM,cANA,CAAO,CACnC,OAAiB,mBAA4B,CAC3C,MAAO,SAIoC,CAC7C,IAAI,EAAQ,EAAM,CAEhB,GAAI,KAAQ,EAAQ,CAClB,IAAM,EAAS,EAAe,GAI9B,OAHI,OAAO,GAAU,WACZ,EAAM,KAAK,EAAO,CAEpB,EAIT,GAAI,CACF,IAAM,EAAQ,EAAe,eAAe,CAC5C,GAAI,GAAQ,KAAQ,EAAM,CACxB,IAAM,EAAS,EAAa,GAI5B,OAHI,OAAO,GAAU,YACX,GAAG,IAAgB,EAAM,MAAM,EAAM,EAAK,CAE7C,QAEH,IAMX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./Route.cjs`),t=require(`./Config.cjs`),n=require(`../Support/Testing/Fakes/EventFake.cjs`),r=require(`./Event.cjs`),i=require(`./Queue.cjs`),a=require(`./Bus.cjs`),o=require(`./Cache.cjs`),s=require(`./DB.cjs`);exports.Bus=a.Bus,exports.Cache=o.Cache,exports.Config=t.Config,exports.DB=s.DB,exports.Event=r.Event,exports.EventFake=n.EventFake,exports.Queue=i.Queue,exports.Route=e.Route;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Config } from "./Config.cjs";
|
|
2
|
+
import { DB } from "./DB.cjs";
|
|
3
|
+
import { Route } from "./Route.cjs";
|
|
4
|
+
import { EventFake } from "../Support/Testing/Fakes/EventFake.cjs";
|
|
5
|
+
import { Event } from "./Event.cjs";
|
|
6
|
+
import { Queue } from "./Queue.cjs";
|
|
7
|
+
import { Bus } from "./Bus.cjs";
|
|
8
|
+
import { Cache } from "./Cache.cjs";
|
|
9
|
+
export { Bus, Cache, Config, DB, Event, EventFake, Queue, Route };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Config } from "./Config.mjs";
|
|
2
|
+
import { DB } from "./DB.mjs";
|
|
3
|
+
import { Route } from "./Route.mjs";
|
|
4
|
+
import { EventFake } from "../Support/Testing/Fakes/EventFake.mjs";
|
|
5
|
+
import { Event } from "./Event.mjs";
|
|
6
|
+
import { Queue } from "./Queue.mjs";
|
|
7
|
+
import { Bus } from "./Bus.mjs";
|
|
8
|
+
import { Cache } from "./Cache.mjs";
|
|
9
|
+
export { Bus, Cache, Config, DB, Event, EventFake, Queue, Route };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Route as e}from"./Route.mjs";import{Config as t}from"./Config.mjs";import{EventFake as n}from"../Support/Testing/Fakes/EventFake.mjs";import{Event as r}from"./Event.mjs";import{Queue as i}from"./Queue.mjs";import{Bus as a}from"./Bus.mjs";import{Cache as o}from"./Cache.mjs";import{DB as s}from"./DB.mjs";export{a as Bus,o as Cache,t as Config,s as DB,r as Event,n as EventFake,i as Queue,e as Route};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Application.mjs","names":[],"sources":["../../src/Foundation/Application.ts"],"sourcesContent":["import { Container } from '@/Container/Container';\nimport { setGlobalApp } from '@/Support/helpers';\nimport { ServiceProvider } from './ServiceProvider';\n\n/**\n * Application class - Laravel's Illuminate\\Foundation\\Application\n * The heart of the framework, bootstraps everything\n */\nexport class Application extends Container {\n private basePath: string;\n private booted: boolean = false;\n private serviceProviders: ServiceProvider[] = [];\n private loadedProviders: Map<string, boolean> = new Map();\n private eventDiscoveryPaths: string[] = [];\n\n constructor(basePath: string = process.cwd()) {\n super();\n this.basePath = basePath;\n this.registerBaseBindings();\n this.registerCoreContainerAliases();\n\n // Set this as the global app instance for helper functions\n setGlobalApp(this);\n }\n\n /**\n * Register the basic bindings into the container\n */\n private registerBaseBindings(): void {\n this.instance('app', this);\n this.instance(Application, this);\n this.instance(Container, this);\n }\n\n /**\n * Register core container aliases\n */\n private registerCoreContainerAliases(): void {\n const aliases: { [key: string]: string[] } = {\n app: ['Application'],\n };\n\n for (const [key, aliasList] of Object.entries(aliases)) {\n for (const alias of aliasList) {\n this.alias(key, alias);\n }\n }\n }\n\n /**\n * Get the base path of the application\n */\n getBasePath(): string {\n return this.basePath;\n }\n\n /**\n * Set the base path for the application\n */\n setBasePath(basePath: string): this {\n this.basePath = basePath;\n return this;\n }\n\n /**\n * Get the path to various application directories\n */\n path(path: string = ''): string {\n return `${this.basePath}/app${path ? '/' + path : ''}`;\n }\n\n configPath(path: string = ''): string {\n return `${this.basePath}/config${path ? '/' + path : ''}`;\n }\n\n databasePath(path: string = ''): string {\n return `${this.basePath}/database${path ? '/' + path : ''}`;\n }\n\n storagePath(path: string = ''): string {\n return `${this.basePath}/storage${path ? '/' + path : ''}`;\n }\n\n publicPath(path: string = ''): string {\n return `${this.basePath}/public${path ? '/' + path : ''}`;\n }\n\n /**\n * Register a service provider with the application\n * Laravel: $app->register(provider)\n */\n register(provider: ServiceProvider | (new (app: Application) => ServiceProvider)): ServiceProvider {\n // If provider is a class, instantiate it\n if (typeof provider === 'function') {\n provider = new provider(this);\n }\n\n // Check if already registered\n const providerName = provider.constructor.name;\n if (this.loadedProviders.has(providerName)) {\n return provider;\n }\n\n // Call the provider's register method\n provider.register();\n\n this.serviceProviders.push(provider);\n this.loadedProviders.set(providerName, true);\n\n // If the application has already booted, boot the provider\n if (this.booted) {\n this.bootProvider(provider);\n }\n\n return provider;\n }\n\n /**\n * Register multiple service providers\n */\n registerProviders(providers: Array<ServiceProvider | (new (app: Application) => ServiceProvider)>): void {\n providers.forEach((provider) => this.register(provider));\n }\n\n /**\n * Boot the application's service providers\n */\n async boot(): Promise<void> {\n if (this.booted) {\n return;\n }\n\n for (const provider of this.serviceProviders) {\n await this.bootProvider(provider);\n }\n\n this.booted = true;\n }\n\n /**\n * Boot the given service provider\n */\n private async bootProvider(provider: ServiceProvider): Promise<void> {\n if (typeof provider.boot === 'function') {\n const result = this.call<any>(provider.boot.bind(provider));\n if (result instanceof Promise) {\n await result;\n }\n }\n }\n\n /**\n * Determine if the application has booted\n */\n isBooted(): boolean {\n return this.booted;\n }\n\n /**\n * Register a terminating callback\n * Laravel: $app->terminating(callback)\n */\n private terminatingCallbacks: Array<() => void> = [];\n\n terminating(callback: () => void): void {\n this.terminatingCallbacks.push(callback);\n }\n\n /**\n * Terminate the application\n */\n terminate(): void {\n this.terminatingCallbacks.forEach((callback) => callback());\n }\n\n /**\n * Get the version number of the application\n */\n version(): string {\n return '0.1.0';\n }\n\n /**\n * Determine if the application is running in the console\n */\n runningInConsole(): boolean {\n return process.argv[1] !== undefined;\n }\n\n /**\n * Get the environment file the application is using\n */\n environmentFile(): string {\n return '.env';\n }\n\n /**\n * Get the environment the application is running in\n */\n environment(): string {\n return process.env.NODE_ENV || 'production';\n }\n\n /**\n * Determine if the application is in debug mode\n */\n isDebug(): boolean {\n return process.env.DEBUG === 'true';\n }\n\n /**\n * Get the service providers that have been loaded\n */\n getProviders(): ServiceProvider[] {\n return this.serviceProviders;\n }\n\n /**\n * Determine if the application has been bootstrapped before\n */\n hasBeenBootstrapped(): boolean {\n return this.booted;\n }\n\n /**\n * Configure event discovery paths\n *\n * Allows customizing which directories should be scanned for event listeners\n * during automatic discovery.\n *\n * @param {Object} options - Configuration options\n * @param {string[]} options.discover - Array of directory paths to scan for listeners\n * @returns {this} The application instance for chaining\n *\n * @example\n * ```typescript\n * app.withEvents({\n * discover: [\n * app.path('Listeners'),\n * app.path('Domain/Listeners')\n * ]\n * })\n * ```\n */\n withEvents(options: { discover?: string[] } = {}): this {\n if (options.discover) {\n this.eventDiscoveryPaths = options.discover;\n }\n return this;\n }\n\n /**\n * Get the event discovery paths\n *\n * Returns the configured paths for event listener discovery.\n * If no paths are configured, defaults to the 'Listeners' directory.\n *\n * @returns {string[]} Array of absolute directory paths\n */\n getEventDiscoveryPaths(): string[] {\n return this.eventDiscoveryPaths.length > 0 ? this.eventDiscoveryPaths : [this.path('Listeners')];\n }\n}\n"],"mappings":"6GAQA,IAAa,EAAb,MAAa,UAAoB,CAAU,CACzC,SACA,OAA0B,GAC1B,iBAA8C,EAAE,CAChD,gBAAgD,IAAI,IACpD,oBAAwC,EAAE,CAE1C,YAAY,EAAmB,QAAQ,KAAK,CAAE,CAC5C,OAAO,CACP,KAAK,SAAW,EAChB,KAAK,sBAAsB,CAC3B,KAAK,8BAA8B,CAGnC,EAAa,KAAK,CAMpB,sBAAqC,CACnC,KAAK,SAAS,MAAO,KAAK,CAC1B,KAAK,SAAS,EAAa,KAAK,CAChC,KAAK,SAAS,EAAW,KAAK,CAMhC,8BAA6C,CAK3C,IAAK,GAAM,CAAC,EAAK,KAAc,OAAO,
|
|
1
|
+
{"version":3,"file":"Application.mjs","names":[],"sources":["../../src/Foundation/Application.ts"],"sourcesContent":["import { Container } from '@/Container/Container';\nimport { setGlobalApp } from '@/Support/helpers';\nimport { ServiceProvider } from './ServiceProvider';\n\n/**\n * Application class - Laravel's Illuminate\\Foundation\\Application\n * The heart of the framework, bootstraps everything\n */\nexport class Application extends Container {\n private basePath: string;\n private booted: boolean = false;\n private serviceProviders: ServiceProvider[] = [];\n private loadedProviders: Map<string, boolean> = new Map();\n private eventDiscoveryPaths: string[] = [];\n\n constructor(basePath: string = process.cwd()) {\n super();\n this.basePath = basePath;\n this.registerBaseBindings();\n this.registerCoreContainerAliases();\n\n // Set this as the global app instance for helper functions\n setGlobalApp(this);\n }\n\n /**\n * Register the basic bindings into the container\n */\n private registerBaseBindings(): void {\n this.instance('app', this);\n this.instance(Application, this);\n this.instance(Container, this);\n }\n\n /**\n * Register core container aliases\n */\n private registerCoreContainerAliases(): void {\n const aliases: { [key: string]: string[] } = {\n app: ['Application'],\n };\n\n for (const [key, aliasList] of Object.entries(aliases)) {\n for (const alias of aliasList) {\n this.alias(key, alias);\n }\n }\n }\n\n /**\n * Get the base path of the application\n */\n getBasePath(): string {\n return this.basePath;\n }\n\n /**\n * Set the base path for the application\n */\n setBasePath(basePath: string): this {\n this.basePath = basePath;\n return this;\n }\n\n /**\n * Get the path to various application directories\n */\n path(path: string = ''): string {\n return `${this.basePath}/app${path ? '/' + path : ''}`;\n }\n\n configPath(path: string = ''): string {\n return `${this.basePath}/config${path ? '/' + path : ''}`;\n }\n\n databasePath(path: string = ''): string {\n return `${this.basePath}/database${path ? '/' + path : ''}`;\n }\n\n storagePath(path: string = ''): string {\n return `${this.basePath}/storage${path ? '/' + path : ''}`;\n }\n\n publicPath(path: string = ''): string {\n return `${this.basePath}/public${path ? '/' + path : ''}`;\n }\n\n /**\n * Register a service provider with the application\n * Laravel: $app->register(provider)\n */\n register(provider: ServiceProvider | (new (app: Application) => ServiceProvider)): ServiceProvider {\n // If provider is a class, instantiate it\n if (typeof provider === 'function') {\n provider = new provider(this);\n }\n\n // Check if already registered\n const providerName = provider.constructor.name;\n if (this.loadedProviders.has(providerName)) {\n return provider;\n }\n\n // Call the provider's register method\n provider.register();\n\n this.serviceProviders.push(provider);\n this.loadedProviders.set(providerName, true);\n\n // If the application has already booted, boot the provider\n if (this.booted) {\n this.bootProvider(provider);\n }\n\n return provider;\n }\n\n /**\n * Register multiple service providers\n */\n registerProviders(providers: Array<ServiceProvider | (new (app: Application) => ServiceProvider)>): void {\n providers.forEach((provider) => this.register(provider));\n }\n\n /**\n * Boot the application's service providers\n */\n async boot(): Promise<void> {\n if (this.booted) {\n return;\n }\n\n for (const provider of this.serviceProviders) {\n await this.bootProvider(provider);\n }\n\n this.booted = true;\n }\n\n /**\n * Boot the given service provider\n */\n private async bootProvider(provider: ServiceProvider): Promise<void> {\n if (typeof provider.boot === 'function') {\n const result = this.call<any>(provider.boot.bind(provider));\n if (result instanceof Promise) {\n await result;\n }\n }\n }\n\n /**\n * Determine if the application has booted\n */\n isBooted(): boolean {\n return this.booted;\n }\n\n /**\n * Register a terminating callback\n * Laravel: $app->terminating(callback)\n */\n private terminatingCallbacks: Array<() => void> = [];\n\n terminating(callback: () => void): void {\n this.terminatingCallbacks.push(callback);\n }\n\n /**\n * Terminate the application\n */\n terminate(): void {\n this.terminatingCallbacks.forEach((callback) => callback());\n }\n\n /**\n * Get the version number of the application\n */\n version(): string {\n return '0.1.0';\n }\n\n /**\n * Determine if the application is running in the console\n */\n runningInConsole(): boolean {\n return process.argv[1] !== undefined;\n }\n\n /**\n * Get the environment file the application is using\n */\n environmentFile(): string {\n return '.env';\n }\n\n /**\n * Get the environment the application is running in\n */\n environment(): string {\n return process.env.NODE_ENV || 'production';\n }\n\n /**\n * Determine if the application is in debug mode\n */\n isDebug(): boolean {\n return process.env.DEBUG === 'true';\n }\n\n /**\n * Get the service providers that have been loaded\n */\n getProviders(): ServiceProvider[] {\n return this.serviceProviders;\n }\n\n /**\n * Determine if the application has been bootstrapped before\n */\n hasBeenBootstrapped(): boolean {\n return this.booted;\n }\n\n /**\n * Configure event discovery paths\n *\n * Allows customizing which directories should be scanned for event listeners\n * during automatic discovery.\n *\n * @param {Object} options - Configuration options\n * @param {string[]} options.discover - Array of directory paths to scan for listeners\n * @returns {this} The application instance for chaining\n *\n * @example\n * ```typescript\n * app.withEvents({\n * discover: [\n * app.path('Listeners'),\n * app.path('Domain/Listeners')\n * ]\n * })\n * ```\n */\n withEvents(options: { discover?: string[] } = {}): this {\n if (options.discover) {\n this.eventDiscoveryPaths = options.discover;\n }\n return this;\n }\n\n /**\n * Get the event discovery paths\n *\n * Returns the configured paths for event listener discovery.\n * If no paths are configured, defaults to the 'Listeners' directory.\n *\n * @returns {string[]} Array of absolute directory paths\n */\n getEventDiscoveryPaths(): string[] {\n return this.eventDiscoveryPaths.length > 0 ? this.eventDiscoveryPaths : [this.path('Listeners')];\n }\n}\n"],"mappings":"6GAQA,IAAa,EAAb,MAAa,UAAoB,CAAU,CACzC,SACA,OAA0B,GAC1B,iBAA8C,EAAE,CAChD,gBAAgD,IAAI,IACpD,oBAAwC,EAAE,CAE1C,YAAY,EAAmB,QAAQ,KAAK,CAAE,CAC5C,OAAO,CACP,KAAK,SAAW,EAChB,KAAK,sBAAsB,CAC3B,KAAK,8BAA8B,CAGnC,EAAa,KAAK,CAMpB,sBAAqC,CACnC,KAAK,SAAS,MAAO,KAAK,CAC1B,KAAK,SAAS,EAAa,KAAK,CAChC,KAAK,SAAS,EAAW,KAAK,CAMhC,8BAA6C,CAK3C,IAAK,GAAM,CAAC,EAAK,KAAc,OAAO,QAAQ,CAH5C,IAAK,CAAC,cAAc,CAG+B,CAAC,CACpD,IAAK,IAAM,KAAS,EAClB,KAAK,MAAM,EAAK,EAAM,CAQ5B,aAAsB,CACpB,OAAO,KAAK,SAMd,YAAY,EAAwB,CAElC,MADA,MAAK,SAAW,EACT,KAMT,KAAK,EAAe,GAAY,CAC9B,MAAO,GAAG,KAAK,SAAS,MAAM,EAAO,IAAM,EAAO,KAGpD,WAAW,EAAe,GAAY,CACpC,MAAO,GAAG,KAAK,SAAS,SAAS,EAAO,IAAM,EAAO,KAGvD,aAAa,EAAe,GAAY,CACtC,MAAO,GAAG,KAAK,SAAS,WAAW,EAAO,IAAM,EAAO,KAGzD,YAAY,EAAe,GAAY,CACrC,MAAO,GAAG,KAAK,SAAS,UAAU,EAAO,IAAM,EAAO,KAGxD,WAAW,EAAe,GAAY,CACpC,MAAO,GAAG,KAAK,SAAS,SAAS,EAAO,IAAM,EAAO,KAOvD,SAAS,EAA0F,CAE7F,OAAO,GAAa,aACtB,EAAW,IAAI,EAAS,KAAK,EAI/B,IAAM,EAAe,EAAS,YAAY,KAgB1C,OAfI,KAAK,gBAAgB,IAAI,EAAa,CACjC,GAIT,EAAS,UAAU,CAEnB,KAAK,iBAAiB,KAAK,EAAS,CACpC,KAAK,gBAAgB,IAAI,EAAc,GAAK,CAGxC,KAAK,QACP,KAAK,aAAa,EAAS,CAGtB,GAMT,kBAAkB,EAAuF,CACvG,EAAU,QAAS,GAAa,KAAK,SAAS,EAAS,CAAC,CAM1D,MAAM,MAAsB,CACtB,SAAK,OAIT,KAAK,IAAM,KAAY,KAAK,iBAC1B,MAAM,KAAK,aAAa,EAAS,CAGnC,KAAK,OAAS,IAMhB,MAAc,aAAa,EAA0C,CACnE,GAAI,OAAO,EAAS,MAAS,WAAY,CACvC,IAAM,EAAS,KAAK,KAAU,EAAS,KAAK,KAAK,EAAS,CAAC,CACvD,aAAkB,SACpB,MAAM,GAQZ,UAAoB,CAClB,OAAO,KAAK,OAOd,qBAAkD,EAAE,CAEpD,YAAY,EAA4B,CACtC,KAAK,qBAAqB,KAAK,EAAS,CAM1C,WAAkB,CAChB,KAAK,qBAAqB,QAAS,GAAa,GAAU,CAAC,CAM7D,SAAkB,CAChB,MAAO,QAMT,kBAA4B,CAC1B,OAAO,QAAQ,KAAK,KAAO,IAAA,GAM7B,iBAA0B,CACxB,MAAO,OAMT,aAAsB,CACpB,OAAO,QAAQ,IAAI,UAAY,aAMjC,SAAmB,CACjB,OAAO,QAAQ,IAAI,QAAU,OAM/B,cAAkC,CAChC,OAAO,KAAK,iBAMd,qBAA+B,CAC7B,OAAO,KAAK,OAuBd,WAAW,EAAmC,EAAE,CAAQ,CAItD,OAHI,EAAQ,WACV,KAAK,oBAAsB,EAAQ,UAE9B,KAWT,wBAAmC,CACjC,OAAO,KAAK,oBAAoB,OAAS,EAAI,KAAK,oBAAsB,CAAC,KAAK,KAAK,YAAY,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Request } from "../../Routing/Request.cjs";
|
|
2
1
|
import { Response } from "../../Routing/Response.cjs";
|
|
2
|
+
import { Request } from "../../Routing/Request.cjs";
|
|
3
3
|
import { ValidationRules, Validator } from "./Validator.cjs";
|
|
4
4
|
import { ValidationException } from "./ValidationException.cjs";
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Request } from "../../Routing/Request.mjs";
|
|
2
1
|
import { Response } from "../../Routing/Response.mjs";
|
|
2
|
+
import { Request } from "../../Routing/Request.mjs";
|
|
3
3
|
import { ValidationRules, Validator } from "./Validator.mjs";
|
|
4
4
|
import { ValidationException } from "./ValidationException.mjs";
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormRequest.mjs","names":[],"sources":["../../../src/Foundation/Http/FormRequest.ts"],"sourcesContent":["import { Request } from '@/Routing/Request';\nimport { Response } from '@/Routing/Response';\nimport { ValidationException } from './ValidationException';\nimport { Validator, ValidationRules } from './Validator';\n\n/**\n * FormRequest - Laravel's form request validation\n * Illuminate\\Foundation\\Http\\FormRequest\n *\n * Provides authorization and validation for incoming HTTP requests.\n * Automatically validates data before reaching the controller.\n */\nexport abstract class FormRequest {\n protected request: Request;\n protected validator?: Validator;\n protected validatedData?: Record<string, any>;\n\n constructor(request: Request) {\n this.request = request;\n }\n\n /**\n * Determine if the user is authorized to make this request\n * Laravel: public function authorize(): bool\n *\n * Override this method to implement authorization logic.\n * Return false to deny access (403 response).\n *\n * @returns {boolean | Promise<boolean>}\n */\n protected authorize(): boolean | Promise<boolean> {\n return true;\n }\n\n /**\n * Get the validation rules that apply to the request\n * Laravel: public function rules(): array\n *\n * Override this method to define validation rules.\n *\n * @returns {ValidationRules | Promise<ValidationRules>}\n */\n protected abstract rules(): ValidationRules | Promise<ValidationRules>;\n\n /**\n * Get custom messages for validator errors\n * Laravel: public function messages(): array\n *\n * @returns {Record<string, string>}\n */\n protected messages(): Record<string, string> {\n return {};\n }\n\n /**\n * Get custom attributes for validator errors\n * Laravel: public function attributes(): array\n *\n * @returns {Record<string, string>}\n */\n protected attributes(): Record<string, string> {\n return {};\n }\n\n /**\n * Validate the request\n *\n * @throws {ValidationException} If validation fails\n * @throws {Error} If authorization fails\n */\n async validate(): Promise<void> {\n // Check authorization first\n const authorized = await this.authorize();\n if (!authorized) {\n throw new Error('This action is unauthorized.');\n }\n\n // Get validation rules\n const rules = await this.rules();\n\n // Create validator\n this.validator = new Validator(this.request.all(), rules, this.messages(), this.attributes());\n\n // Run validation\n const passes = await this.validator.validate();\n\n if (!passes) {\n throw new ValidationException(this.validator);\n }\n\n // Store validated data\n this.validatedData = this.validator.validated();\n }\n\n /**\n * Get the validated data from the request\n * Laravel: $request->validated()\n *\n * @returns {Record<string, any>}\n */\n validated(): Record<string, any> {\n if (!this.validatedData) {\n throw new Error('Validation has not been run yet.');\n }\n return this.validatedData;\n }\n\n /**\n * Get the validator instance\n *\n * @returns {Validator | undefined}\n */\n getValidator(): Validator | undefined {\n return this.validator;\n }\n\n /**\n * Get all input data\n * Laravel: $request->all()\n */\n all(): Record<string, any> {\n return this.request.all();\n }\n\n /**\n * Get an input value\n * Laravel: $request->input('key')\n */\n input(key: string, defaultValue?: any): any {\n return this.request.input(key, defaultValue);\n }\n\n /**\n * Get only specified inputs\n * Laravel: $request->only(['name', 'email'])\n */\n only(keys: string[]): Record<string, any> {\n return this.request.only(keys);\n }\n\n /**\n * Get all inputs except specified\n * Laravel: $request->except(['password'])\n */\n except(keys: string[]): Record<string, any> {\n return this.request.except(keys);\n }\n\n /**\n * Get a route parameter\n * Laravel: $request->route('id')\n */\n routeParam(key: string, defaultValue?: string): string | undefined {\n return this.request.routeParam(key, defaultValue);\n }\n\n /**\n * Handle a failed authorization attempt\n * Laravel: protected function failedAuthorization()\n *\n * @param {Response} res\n */\n handleFailedAuthorization(res: Response): void {\n res.status(403).json({\n message: 'This action is unauthorized.',\n });\n }\n\n /**\n * Handle a failed validation attempt\n * Laravel: protected function failedValidation(Validator $validator)\n *\n * @param {Response} res\n * @param {ValidationException} exception\n */\n handleFailedValidation(res: Response, exception: ValidationException): void {\n res.status(422).json({\n message: 'The given data was invalid.',\n errors: exception.errors(),\n });\n }\n\n /**\n * Static factory method to create and validate a FormRequest\n *\n * @param {Request} request\n * @param {Response} res\n * @returns {Promise<T>} The validated FormRequest instance\n */\n static async validate<T extends FormRequest>(\n this: new (request: Request) => T,\n request: Request,\n res: Response\n ): Promise<T> {\n const formRequest = new this(request);\n\n try {\n await formRequest.validate();\n return formRequest;\n } catch (error) {\n if (error instanceof ValidationException) {\n formRequest.handleFailedValidation(res, error);\n throw error;\n }\n\n if (error instanceof Error && error.message === 'This action is unauthorized.') {\n formRequest.handleFailedAuthorization(res);\n throw error;\n }\n\n throw error;\n }\n }\n}\n"],"mappings":"4GAYA,IAAsB,EAAtB,KAAkC,CAChC,QACA,UACA,cAEA,YAAY,EAAkB,CAC5B,KAAK,QAAU,EAYjB,WAAkD,CAChD,MAAO,GAmBT,UAA6C,CAC3C,MAAO,EAAE,CASX,YAA+C,CAC7C,MAAO,EAAE,CASX,MAAM,UAA0B,CAG9B,GAAI,
|
|
1
|
+
{"version":3,"file":"FormRequest.mjs","names":[],"sources":["../../../src/Foundation/Http/FormRequest.ts"],"sourcesContent":["import { Request } from '@/Routing/Request';\nimport { Response } from '@/Routing/Response';\nimport { ValidationException } from './ValidationException';\nimport { Validator, ValidationRules } from './Validator';\n\n/**\n * FormRequest - Laravel's form request validation\n * Illuminate\\Foundation\\Http\\FormRequest\n *\n * Provides authorization and validation for incoming HTTP requests.\n * Automatically validates data before reaching the controller.\n */\nexport abstract class FormRequest {\n protected request: Request;\n protected validator?: Validator;\n protected validatedData?: Record<string, any>;\n\n constructor(request: Request) {\n this.request = request;\n }\n\n /**\n * Determine if the user is authorized to make this request\n * Laravel: public function authorize(): bool\n *\n * Override this method to implement authorization logic.\n * Return false to deny access (403 response).\n *\n * @returns {boolean | Promise<boolean>}\n */\n protected authorize(): boolean | Promise<boolean> {\n return true;\n }\n\n /**\n * Get the validation rules that apply to the request\n * Laravel: public function rules(): array\n *\n * Override this method to define validation rules.\n *\n * @returns {ValidationRules | Promise<ValidationRules>}\n */\n protected abstract rules(): ValidationRules | Promise<ValidationRules>;\n\n /**\n * Get custom messages for validator errors\n * Laravel: public function messages(): array\n *\n * @returns {Record<string, string>}\n */\n protected messages(): Record<string, string> {\n return {};\n }\n\n /**\n * Get custom attributes for validator errors\n * Laravel: public function attributes(): array\n *\n * @returns {Record<string, string>}\n */\n protected attributes(): Record<string, string> {\n return {};\n }\n\n /**\n * Validate the request\n *\n * @throws {ValidationException} If validation fails\n * @throws {Error} If authorization fails\n */\n async validate(): Promise<void> {\n // Check authorization first\n const authorized = await this.authorize();\n if (!authorized) {\n throw new Error('This action is unauthorized.');\n }\n\n // Get validation rules\n const rules = await this.rules();\n\n // Create validator\n this.validator = new Validator(this.request.all(), rules, this.messages(), this.attributes());\n\n // Run validation\n const passes = await this.validator.validate();\n\n if (!passes) {\n throw new ValidationException(this.validator);\n }\n\n // Store validated data\n this.validatedData = this.validator.validated();\n }\n\n /**\n * Get the validated data from the request\n * Laravel: $request->validated()\n *\n * @returns {Record<string, any>}\n */\n validated(): Record<string, any> {\n if (!this.validatedData) {\n throw new Error('Validation has not been run yet.');\n }\n return this.validatedData;\n }\n\n /**\n * Get the validator instance\n *\n * @returns {Validator | undefined}\n */\n getValidator(): Validator | undefined {\n return this.validator;\n }\n\n /**\n * Get all input data\n * Laravel: $request->all()\n */\n all(): Record<string, any> {\n return this.request.all();\n }\n\n /**\n * Get an input value\n * Laravel: $request->input('key')\n */\n input(key: string, defaultValue?: any): any {\n return this.request.input(key, defaultValue);\n }\n\n /**\n * Get only specified inputs\n * Laravel: $request->only(['name', 'email'])\n */\n only(keys: string[]): Record<string, any> {\n return this.request.only(keys);\n }\n\n /**\n * Get all inputs except specified\n * Laravel: $request->except(['password'])\n */\n except(keys: string[]): Record<string, any> {\n return this.request.except(keys);\n }\n\n /**\n * Get a route parameter\n * Laravel: $request->route('id')\n */\n routeParam(key: string, defaultValue?: string): string | undefined {\n return this.request.routeParam(key, defaultValue);\n }\n\n /**\n * Handle a failed authorization attempt\n * Laravel: protected function failedAuthorization()\n *\n * @param {Response} res\n */\n handleFailedAuthorization(res: Response): void {\n res.status(403).json({\n message: 'This action is unauthorized.',\n });\n }\n\n /**\n * Handle a failed validation attempt\n * Laravel: protected function failedValidation(Validator $validator)\n *\n * @param {Response} res\n * @param {ValidationException} exception\n */\n handleFailedValidation(res: Response, exception: ValidationException): void {\n res.status(422).json({\n message: 'The given data was invalid.',\n errors: exception.errors(),\n });\n }\n\n /**\n * Static factory method to create and validate a FormRequest\n *\n * @param {Request} request\n * @param {Response} res\n * @returns {Promise<T>} The validated FormRequest instance\n */\n static async validate<T extends FormRequest>(\n this: new (request: Request) => T,\n request: Request,\n res: Response\n ): Promise<T> {\n const formRequest = new this(request);\n\n try {\n await formRequest.validate();\n return formRequest;\n } catch (error) {\n if (error instanceof ValidationException) {\n formRequest.handleFailedValidation(res, error);\n throw error;\n }\n\n if (error instanceof Error && error.message === 'This action is unauthorized.') {\n formRequest.handleFailedAuthorization(res);\n throw error;\n }\n\n throw error;\n }\n }\n}\n"],"mappings":"4GAYA,IAAsB,EAAtB,KAAkC,CAChC,QACA,UACA,cAEA,YAAY,EAAkB,CAC5B,KAAK,QAAU,EAYjB,WAAkD,CAChD,MAAO,GAmBT,UAA6C,CAC3C,MAAO,EAAE,CASX,YAA+C,CAC7C,MAAO,EAAE,CASX,MAAM,UAA0B,CAG9B,GAAI,CAAC,MADoB,KAAK,WAAW,CAEvC,MAAU,MAAM,+BAA+B,CAIjD,IAAM,EAAQ,MAAM,KAAK,OAAO,CAQhC,GALA,KAAK,UAAY,IAAI,EAAU,KAAK,QAAQ,KAAK,CAAE,EAAO,KAAK,UAAU,CAAE,KAAK,YAAY,CAAC,CAKzF,CAAC,MAFgB,KAAK,UAAU,UAAU,CAG5C,MAAM,IAAI,EAAoB,KAAK,UAAU,CAI/C,KAAK,cAAgB,KAAK,UAAU,WAAW,CASjD,WAAiC,CAC/B,GAAI,CAAC,KAAK,cACR,MAAU,MAAM,mCAAmC,CAErD,OAAO,KAAK,cAQd,cAAsC,CACpC,OAAO,KAAK,UAOd,KAA2B,CACzB,OAAO,KAAK,QAAQ,KAAK,CAO3B,MAAM,EAAa,EAAyB,CAC1C,OAAO,KAAK,QAAQ,MAAM,EAAK,EAAa,CAO9C,KAAK,EAAqC,CACxC,OAAO,KAAK,QAAQ,KAAK,EAAK,CAOhC,OAAO,EAAqC,CAC1C,OAAO,KAAK,QAAQ,OAAO,EAAK,CAOlC,WAAW,EAAa,EAA2C,CACjE,OAAO,KAAK,QAAQ,WAAW,EAAK,EAAa,CASnD,0BAA0B,EAAqB,CAC7C,EAAI,OAAO,IAAI,CAAC,KAAK,CACnB,QAAS,+BACV,CAAC,CAUJ,uBAAuB,EAAe,EAAsC,CAC1E,EAAI,OAAO,IAAI,CAAC,KAAK,CACnB,QAAS,8BACT,OAAQ,EAAU,QAAQ,CAC3B,CAAC,CAUJ,aAAa,SAEX,EACA,EACY,CACZ,IAAM,EAAc,IAAI,KAAK,EAAQ,CAErC,GAAI,CAEF,OADA,MAAM,EAAY,UAAU,CACrB,QACA,EAAO,CAWd,MAVI,aAAiB,GACnB,EAAY,uBAAuB,EAAK,EAAM,CACxC,IAGJ,aAAiB,OAAS,EAAM,UAAY,gCAC9C,EAAY,0BAA0B,EAAI,CAItC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnyOfRule.mjs","names":[],"sources":["../../../../src/Foundation/Http/Rules/AnyOfRule.ts"],"sourcesContent":["import { Validator } from '../Validator';\nimport { BaseRule, type ValidationRuleObject } from './Base';\n\nexport class AnyOfRule extends BaseRule {\n private inner: Array<string | ValidationRuleObject>;\n constructor(rules: Array<string | ValidationRuleObject>) {\n super('any_of');\n this.invokable = true;\n this.inner = rules;\n }\n async passes(_attribute: string, value: any, ctx: any): Promise<boolean> {\n const data = { [ctx.field]: value };\n for (const r of this.inner) {\n const v = new Validator(data, { [ctx.field]: [r] });\n if (await v.validate()) {\n return true;\n }\n }\n return false;\n }\n messageFor(attribute: string): string {\n return `The ${attribute} must satisfy at least one rule.`;\n }\n}\n"],"mappings":"mFAGA,IAAa,EAAb,cAA+B,CAAS,CACtC,MACA,YAAY,EAA6C,CACvD,MAAM,SAAS,CACf,KAAK,UAAY,GACjB,KAAK,MAAQ,EAEf,MAAM,OAAO,EAAoB,EAAY,EAA4B,CACvE,IAAM,EAAO,EAAG,EAAI,OAAQ,EAAO,CACnC,IAAK,IAAM,KAAK,KAAK,MAEnB,GAAI,
|
|
1
|
+
{"version":3,"file":"AnyOfRule.mjs","names":[],"sources":["../../../../src/Foundation/Http/Rules/AnyOfRule.ts"],"sourcesContent":["import { Validator } from '../Validator';\nimport { BaseRule, type ValidationRuleObject } from './Base';\n\nexport class AnyOfRule extends BaseRule {\n private inner: Array<string | ValidationRuleObject>;\n constructor(rules: Array<string | ValidationRuleObject>) {\n super('any_of');\n this.invokable = true;\n this.inner = rules;\n }\n async passes(_attribute: string, value: any, ctx: any): Promise<boolean> {\n const data = { [ctx.field]: value };\n for (const r of this.inner) {\n const v = new Validator(data, { [ctx.field]: [r] });\n if (await v.validate()) {\n return true;\n }\n }\n return false;\n }\n messageFor(attribute: string): string {\n return `The ${attribute} must satisfy at least one rule.`;\n }\n}\n"],"mappings":"mFAGA,IAAa,EAAb,cAA+B,CAAS,CACtC,MACA,YAAY,EAA6C,CACvD,MAAM,SAAS,CACf,KAAK,UAAY,GACjB,KAAK,MAAQ,EAEf,MAAM,OAAO,EAAoB,EAAY,EAA4B,CACvE,IAAM,EAAO,EAAG,EAAI,OAAQ,EAAO,CACnC,IAAK,IAAM,KAAK,KAAK,MAEnB,GAAI,MAAM,IADI,EAAU,EAAM,EAAG,EAAI,OAAQ,CAAC,EAAE,CAAE,CACvC,CAAC,UAAU,CACpB,MAAO,GAGX,MAAO,GAET,WAAW,EAA2B,CACpC,MAAO,OAAO,EAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageFileRule.mjs","names":[],"sources":["../../../../src/Foundation/Http/Rules/ImageFileRule.ts"],"sourcesContent":["import { BaseRule } from './Base';\n\nexport class ImageFileRule extends BaseRule {\n constructor() {\n super('image_file');\n this.invokable = true;\n }\n passes(_attribute: string, value: any): boolean {\n if (value && typeof value === 'object') {\n const type = (value.mimetype || value.type || '').toString();\n return type.startsWith('image/');\n }\n return true;\n }\n messageFor(attribute: string): string {\n return `The ${attribute} must be an image file.`;\n }\n}\n"],"mappings":"sCAEA,IAAa,EAAb,cAAmC,CAAS,CAC1C,aAAc,CACZ,MAAM,aAAa,CACnB,KAAK,UAAY,GAEnB,OAAO,EAAoB,EAAqB,CAK9C,OAJI,GAAS,OAAO,GAAU,UACd,EAAM,UAAY,EAAM,MAAQ,IAAI,
|
|
1
|
+
{"version":3,"file":"ImageFileRule.mjs","names":[],"sources":["../../../../src/Foundation/Http/Rules/ImageFileRule.ts"],"sourcesContent":["import { BaseRule } from './Base';\n\nexport class ImageFileRule extends BaseRule {\n constructor() {\n super('image_file');\n this.invokable = true;\n }\n passes(_attribute: string, value: any): boolean {\n if (value && typeof value === 'object') {\n const type = (value.mimetype || value.type || '').toString();\n return type.startsWith('image/');\n }\n return true;\n }\n messageFor(attribute: string): string {\n return `The ${attribute} must be an image file.`;\n }\n}\n"],"mappings":"sCAEA,IAAa,EAAb,cAAmC,CAAS,CAC1C,aAAc,CACZ,MAAM,aAAa,CACnB,KAAK,UAAY,GAEnB,OAAO,EAAoB,EAAqB,CAK9C,OAJI,GAAS,OAAO,GAAU,UACd,EAAM,UAAY,EAAM,MAAQ,IAAI,UACvC,CAAC,WAAW,SAAS,CAE3B,GAET,WAAW,EAA2B,CACpC,MAAO,OAAO,EAAU"}
|