@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":"SeedCommand.mjs","names":[],"sources":["../../../src/Console/Commands/SeedCommand.ts"],"sourcesContent":["/**\n * SeedCommand\n *\n * Seed the database with records\n */\n\nimport { Command, CommandOptions } from '@/Console/Command';\nimport { SeederRunner } from '@/Database/Seeders/SeederRunner';\nimport { Application } from '@/Foundation/Application';\n\nexport class SeedCommand extends Command {\n signature = 'db:seed';\n description = 'Seed the database with records';\n\n constructor(protected app: Application) {\n super();\n }\n\n async handle(args: string[], options: CommandOptions): Promise<void> {\n const db = this.app.make('db') as any;\n const connection = db.connection();\n const seederPath = options.path || './database/seeders';\n const paths = Array.isArray(seederPath) ? seederPath : [seederPath];\n\n const runner = new SeederRunner(connection, paths);\n\n this.info('Seeding database...');\n this.newLine();\n\n try {\n const className = options.class as string | undefined;\n\n if (className) {\n await runner.runByName(className);\n } else {\n await runner.run();\n }\n\n this.info('Database seeding completed successfully.');\n } catch (error) {\n this.error(`Seeding failed: ${(error as Error).message}`);\n throw error;\n }\n }\n}\n"],"mappings":"gHAUA,IAAa,EAAb,cAAiC,CAAQ,
|
|
1
|
+
{"version":3,"file":"SeedCommand.mjs","names":[],"sources":["../../../src/Console/Commands/SeedCommand.ts"],"sourcesContent":["/**\n * SeedCommand\n *\n * Seed the database with records\n */\n\nimport { Command, CommandOptions } from '@/Console/Command';\nimport { SeederRunner } from '@/Database/Seeders/SeederRunner';\nimport { Application } from '@/Foundation/Application';\n\nexport class SeedCommand extends Command {\n signature = 'db:seed';\n description = 'Seed the database with records';\n\n constructor(protected app: Application) {\n super();\n }\n\n async handle(args: string[], options: CommandOptions): Promise<void> {\n const db = this.app.make('db') as any;\n const connection = db.connection();\n const seederPath = options.path || './database/seeders';\n const paths = Array.isArray(seederPath) ? seederPath : [seederPath];\n\n const runner = new SeederRunner(connection, paths);\n\n this.info('Seeding database...');\n this.newLine();\n\n try {\n const className = options.class as string | undefined;\n\n if (className) {\n await runner.runByName(className);\n } else {\n await runner.run();\n }\n\n this.info('Database seeding completed successfully.');\n } catch (error) {\n this.error(`Seeding failed: ${(error as Error).message}`);\n throw error;\n }\n }\n}\n"],"mappings":"gHAUA,IAAa,EAAb,cAAiC,CAAQ,CAIjB,IAHtB,UAAY,UACZ,YAAc,iCAEd,YAAY,EAA4B,CACtC,OAAO,CADa,KAAA,IAAA,EAItB,MAAM,OAAO,EAAgB,EAAwC,CAEnE,IAAM,EADK,KAAK,IAAI,KAAK,KACJ,CAAC,YAAY,CAC5B,EAAa,EAAQ,MAAQ,qBAG7B,EAAS,IAAI,EAAa,EAFlB,MAAM,QAAQ,EAAW,CAAG,EAAa,CAAC,EAAW,CAEjB,CAElD,KAAK,KAAK,sBAAsB,CAChC,KAAK,SAAS,CAEd,GAAI,CACF,IAAM,EAAY,EAAQ,MAEtB,EACF,MAAM,EAAO,UAAU,EAAU,CAEjC,MAAM,EAAO,KAAK,CAGpB,KAAK,KAAK,2CAA2C,OAC9C,EAAO,CAEd,MADA,KAAK,MAAM,mBAAoB,EAAgB,UAAU,CACnD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);var e=class{commands=new Map;constructor(e){this.app=e,this.registerCommands()}registerCommands(){}register(e){this.commands.set(e.getName(),e)}registerMany(e){e.forEach(e=>this.register(e))}async handle(e,t=[],n={}){let r=this.commands.get(e);if(!r)throw Error(`Command not found: ${e}`);await r.handle(t,n)}async run(e=process.argv){let t=e.slice(2);if(t.length===0){this.listCommands();return}let n=t[0],r=[],i={};for(let e=1;e<t.length;e++){let n=t[e];if(n.startsWith(`--`)){let e=n.slice(2).split(`=`),t=e[0];i[t]=e.length>1?e[1]:!0}else if(n.startsWith(`-`)){let e=n.slice(1);i[e]=!0}else r.push(n)}try{await this.handle(n,r,i)}catch(e){console.error(`\x1b[31mError: ${e.message}\x1b[0m`),process.exit(1)}}listCommands(){console.log(`\x1B[33mAvailable commands:\x1B[0m
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);var e=class{app;commands=new Map;constructor(e){this.app=e,this.registerCommands()}registerCommands(){}register(e){this.commands.set(e.getName(),e)}registerMany(e){e.forEach(e=>this.register(e))}async handle(e,t=[],n={}){let r=this.commands.get(e);if(!r)throw Error(`Command not found: ${e}`);await r.handle(t,n)}async run(e=process.argv){let t=e.slice(2);if(t.length===0){this.listCommands();return}let n=t[0],r=[],i={};for(let e=1;e<t.length;e++){let n=t[e];if(n.startsWith(`--`)){let e=n.slice(2).split(`=`),t=e[0];i[t]=e.length>1?e[1]:!0}else if(n.startsWith(`-`)){let e=n.slice(1);i[e]=!0}else r.push(n)}try{await this.handle(n,r,i)}catch(e){console.error(`\x1b[31mError: ${e.message}\x1b[0m`),process.exit(1)}}listCommands(){console.log(`\x1B[33mAvailable commands:\x1B[0m
|
|
2
2
|
`),this.commands.forEach(e=>{console.log(` \x1b[32m${e.signature}\x1b[0m`),console.log(` ${e.description}\n`)})}getCommands(){return this.commands}getApplication(){return this.app}};exports.ConsoleKernel=e;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var e=class{commands=new Map;constructor(e){this.app=e,this.registerCommands()}registerCommands(){}register(e){this.commands.set(e.getName(),e)}registerMany(e){e.forEach(e=>this.register(e))}async handle(e,t=[],n={}){let r=this.commands.get(e);if(!r)throw Error(`Command not found: ${e}`);await r.handle(t,n)}async run(e=process.argv){let t=e.slice(2);if(t.length===0){this.listCommands();return}let n=t[0],r=[],i={};for(let e=1;e<t.length;e++){let n=t[e];if(n.startsWith(`--`)){let e=n.slice(2).split(`=`),t=e[0];i[t]=e.length>1?e[1]:!0}else if(n.startsWith(`-`)){let e=n.slice(1);i[e]=!0}else r.push(n)}try{await this.handle(n,r,i)}catch(e){console.error(`\x1b[31mError: ${e.message}\x1b[0m`),process.exit(1)}}listCommands(){console.log(`\x1B[33mAvailable commands:\x1B[0m
|
|
1
|
+
var e=class{app;commands=new Map;constructor(e){this.app=e,this.registerCommands()}registerCommands(){}register(e){this.commands.set(e.getName(),e)}registerMany(e){e.forEach(e=>this.register(e))}async handle(e,t=[],n={}){let r=this.commands.get(e);if(!r)throw Error(`Command not found: ${e}`);await r.handle(t,n)}async run(e=process.argv){let t=e.slice(2);if(t.length===0){this.listCommands();return}let n=t[0],r=[],i={};for(let e=1;e<t.length;e++){let n=t[e];if(n.startsWith(`--`)){let e=n.slice(2).split(`=`),t=e[0];i[t]=e.length>1?e[1]:!0}else if(n.startsWith(`-`)){let e=n.slice(1);i[e]=!0}else r.push(n)}try{await this.handle(n,r,i)}catch(e){console.error(`\x1b[31mError: ${e.message}\x1b[0m`),process.exit(1)}}listCommands(){console.log(`\x1B[33mAvailable commands:\x1B[0m
|
|
2
2
|
`),this.commands.forEach(e=>{console.log(` \x1b[32m${e.signature}\x1b[0m`),console.log(` ${e.description}\n`)})}getCommands(){return this.commands}getApplication(){return this.app}};export{e as ConsoleKernel};
|
|
3
3
|
//# sourceMappingURL=ConsoleKernel.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleKernel.mjs","names":[],"sources":["../../src/Console/ConsoleKernel.ts"],"sourcesContent":["/**\n * ConsoleKernel\n *\n * The console kernel handles registration and execution of console commands\n */\n\nimport { Application } from '@/Foundation/Application';\nimport { Command, CommandOptions } from './Command';\n\nexport class ConsoleKernel {\n protected commands: Map<string, Command> = new Map();\n\n constructor(protected app: Application) {\n this.registerCommands();\n }\n\n /**\n * Register console commands\n */\n protected registerCommands(): void {\n // Override this method in your application's kernel to register commands\n }\n\n /**\n * Register a command\n */\n register(command: Command): void {\n this.commands.set(command.getName(), command);\n }\n\n /**\n * Register multiple commands\n */\n registerMany(commands: Command[]): void {\n commands.forEach((command) => this.register(command));\n }\n\n /**\n * Run a console command\n */\n async handle(commandName: string, args: string[] = [], options: CommandOptions = {}): Promise<void> {\n const command = this.commands.get(commandName);\n\n if (!command) {\n throw new Error(`Command not found: ${commandName}`);\n }\n\n await command.handle(args, options);\n }\n\n /**\n * Run the console kernel from CLI arguments\n */\n async run(argv: string[] = process.argv): Promise<void> {\n // Parse arguments: node script.js command-name arg1 arg2 --option=value\n const args = argv.slice(2);\n\n if (args.length === 0) {\n this.listCommands();\n return;\n }\n\n const commandName = args[0];\n const commandArgs: string[] = [];\n const options: CommandOptions = {};\n\n // Parse arguments and options\n for (let i = 1; i < args.length; i++) {\n const arg = args[i];\n\n if (arg.startsWith('--')) {\n // Parse option: --option=value or --option\n const parts = arg.slice(2).split('=');\n const optionName = parts[0];\n const optionValue = parts.length > 1 ? parts[1] : true;\n options[optionName] = optionValue;\n } else if (arg.startsWith('-')) {\n // Parse short option: -o\n const optionName = arg.slice(1);\n options[optionName] = true;\n } else {\n // Regular argument\n commandArgs.push(arg);\n }\n }\n\n try {\n await this.handle(commandName, commandArgs, options);\n } catch (error) {\n console.error(`\\x1b[31mError: ${(error as Error).message}\\x1b[0m`);\n process.exit(1);\n }\n }\n\n /**\n * List all registered commands\n */\n protected listCommands(): void {\n console.log('\\x1b[33mAvailable commands:\\x1b[0m\\n');\n\n this.commands.forEach((command) => {\n console.log(` \\x1b[32m${command.signature}\\x1b[0m`);\n console.log(` ${command.description}\\n`);\n });\n }\n\n /**\n * Get all registered commands\n */\n getCommands(): Map<string, Command> {\n return this.commands;\n }\n\n /**\n * Get the application instance\n */\n getApplication(): Application {\n return this.app;\n }\n}\n"],"mappings":"AASA,IAAa,EAAb,KAA2B,
|
|
1
|
+
{"version":3,"file":"ConsoleKernel.mjs","names":[],"sources":["../../src/Console/ConsoleKernel.ts"],"sourcesContent":["/**\n * ConsoleKernel\n *\n * The console kernel handles registration and execution of console commands\n */\n\nimport { Application } from '@/Foundation/Application';\nimport { Command, CommandOptions } from './Command';\n\nexport class ConsoleKernel {\n protected commands: Map<string, Command> = new Map();\n\n constructor(protected app: Application) {\n this.registerCommands();\n }\n\n /**\n * Register console commands\n */\n protected registerCommands(): void {\n // Override this method in your application's kernel to register commands\n }\n\n /**\n * Register a command\n */\n register(command: Command): void {\n this.commands.set(command.getName(), command);\n }\n\n /**\n * Register multiple commands\n */\n registerMany(commands: Command[]): void {\n commands.forEach((command) => this.register(command));\n }\n\n /**\n * Run a console command\n */\n async handle(commandName: string, args: string[] = [], options: CommandOptions = {}): Promise<void> {\n const command = this.commands.get(commandName);\n\n if (!command) {\n throw new Error(`Command not found: ${commandName}`);\n }\n\n await command.handle(args, options);\n }\n\n /**\n * Run the console kernel from CLI arguments\n */\n async run(argv: string[] = process.argv): Promise<void> {\n // Parse arguments: node script.js command-name arg1 arg2 --option=value\n const args = argv.slice(2);\n\n if (args.length === 0) {\n this.listCommands();\n return;\n }\n\n const commandName = args[0];\n const commandArgs: string[] = [];\n const options: CommandOptions = {};\n\n // Parse arguments and options\n for (let i = 1; i < args.length; i++) {\n const arg = args[i];\n\n if (arg.startsWith('--')) {\n // Parse option: --option=value or --option\n const parts = arg.slice(2).split('=');\n const optionName = parts[0];\n const optionValue = parts.length > 1 ? parts[1] : true;\n options[optionName] = optionValue;\n } else if (arg.startsWith('-')) {\n // Parse short option: -o\n const optionName = arg.slice(1);\n options[optionName] = true;\n } else {\n // Regular argument\n commandArgs.push(arg);\n }\n }\n\n try {\n await this.handle(commandName, commandArgs, options);\n } catch (error) {\n console.error(`\\x1b[31mError: ${(error as Error).message}\\x1b[0m`);\n process.exit(1);\n }\n }\n\n /**\n * List all registered commands\n */\n protected listCommands(): void {\n console.log('\\x1b[33mAvailable commands:\\x1b[0m\\n');\n\n this.commands.forEach((command) => {\n console.log(` \\x1b[32m${command.signature}\\x1b[0m`);\n console.log(` ${command.description}\\n`);\n });\n }\n\n /**\n * Get all registered commands\n */\n getCommands(): Map<string, Command> {\n return this.commands;\n }\n\n /**\n * Get the application instance\n */\n getApplication(): Application {\n return this.app;\n }\n}\n"],"mappings":"AASA,IAAa,EAAb,KAA2B,CAGH,IAFtB,SAA2C,IAAI,IAE/C,YAAY,EAA4B,CAAlB,KAAA,IAAA,EACpB,KAAK,kBAAkB,CAMzB,kBAAmC,EAOnC,SAAS,EAAwB,CAC/B,KAAK,SAAS,IAAI,EAAQ,SAAS,CAAE,EAAQ,CAM/C,aAAa,EAA2B,CACtC,EAAS,QAAS,GAAY,KAAK,SAAS,EAAQ,CAAC,CAMvD,MAAM,OAAO,EAAqB,EAAiB,EAAE,CAAE,EAA0B,EAAE,CAAiB,CAClG,IAAM,EAAU,KAAK,SAAS,IAAI,EAAY,CAE9C,GAAI,CAAC,EACH,MAAU,MAAM,sBAAsB,IAAc,CAGtD,MAAM,EAAQ,OAAO,EAAM,EAAQ,CAMrC,MAAM,IAAI,EAAiB,QAAQ,KAAqB,CAEtD,IAAM,EAAO,EAAK,MAAM,EAAE,CAE1B,GAAI,EAAK,SAAW,EAAG,CACrB,KAAK,cAAc,CACnB,OAGF,IAAM,EAAc,EAAK,GACnB,EAAwB,EAAE,CAC1B,EAA0B,EAAE,CAGlC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAQ,IAAK,CACpC,IAAM,EAAM,EAAK,GAEjB,GAAI,EAAI,WAAW,KAAK,CAAE,CAExB,IAAM,EAAQ,EAAI,MAAM,EAAE,CAAC,MAAM,IAAI,CAC/B,EAAa,EAAM,GAEzB,EAAQ,GADY,EAAM,OAAS,EAAI,EAAM,GAAK,QAE7C,GAAI,EAAI,WAAW,IAAI,CAAE,CAE9B,IAAM,EAAa,EAAI,MAAM,EAAE,CAC/B,EAAQ,GAAc,QAGtB,EAAY,KAAK,EAAI,CAIzB,GAAI,CACF,MAAM,KAAK,OAAO,EAAa,EAAa,EAAQ,OAC7C,EAAO,CACd,QAAQ,MAAM,kBAAmB,EAAgB,QAAQ,SAAS,CAClE,QAAQ,KAAK,EAAE,EAOnB,cAA+B,CAC7B,QAAQ,IAAI;EAAuC,CAEnD,KAAK,SAAS,QAAS,GAAY,CACjC,QAAQ,IAAI,aAAa,EAAQ,UAAU,SAAS,CACpD,QAAQ,IAAI,OAAO,EAAQ,YAAY,IAAI,EAC3C,CAMJ,aAAoC,CAClC,OAAO,KAAK,SAMd,gBAA8B,CAC5B,OAAO,KAAK"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../Foundation/Application.cjs`),t=require(`./ConsoleKernel.cjs`),n=require(`./Commands/MigrateCommand.cjs`),r=require(`./Commands/MigrateRollbackCommand.cjs`),i=require(`./Commands/MigrateResetCommand.cjs`),a=require(`./Commands/MigrateRefreshCommand.cjs`),o=require(`./Commands/MigrateFreshCommand.cjs`),s=require(`./Commands/MigrateStatusCommand.cjs`),c=require(`./Commands/MakeMigrationCommand.cjs`),l=require(`./Commands/SeedCommand.cjs`),u=require(`./Commands/MakeSeederCommand.cjs`),d=require(`./Commands/MakeEventCommand.cjs`),f=require(`./Commands/MakeListenerCommand.cjs`),p=require(`./Commands/MakeControllerCommand.cjs`),m=require(`./Commands/EventListCommand.cjs`),h=require(`./Commands/EventCacheCommand.cjs`),g=require(`./Commands/EventClearCommand.cjs`),_=require(`./Commands/DeployLoginCommand.cjs`),v=require(`./Commands/DeployInitCommand.cjs`),y=require(`./Commands/DeployServerCommand.cjs`),b=require(`./Commands/DeployCommand.cjs`),x=require(`./Commands/DeployStatusCommand.cjs`),S=require(`./Commands/DeployEnvCommand.cjs`),C=require(`./Commands/DeployRollbackCommand.cjs`),w=require(`./Commands/DeployProvisionCommand.cjs`),T=new e.Application;new class extends t.ConsoleKernel{registerCommands(){this.registerMany([new n.MigrateCommand(this.app),new r.MigrateRollbackCommand(this.app),new i.MigrateResetCommand(this.app),new a.MigrateRefreshCommand(this.app),new o.MigrateFreshCommand(this.app),new s.MigrateStatusCommand(this.app),new c.MakeMigrationCommand(this.app),new l.SeedCommand(this.app),new u.MakeSeederCommand(this.app),new d.MakeEventCommand(this.app),new f.MakeListenerCommand(this.app),new p.MakeControllerCommand(this.app),new m.EventListCommand(this.app),new h.EventCacheCommand(this.app),new g.EventClearCommand(this.app),new _.DeployLoginCommand,new v.DeployInitCommand,new y.DeployServerCommand,new b.DeployCommand,new x.DeployStatusCommand,new S.DeployEnvCommand,new C.DeployRollbackCommand,new w.DeployProvisionCommand])}}(T).run().catch(e=>{console.error(e),process.exit(1)});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{Application as e}from"../Foundation/Application.mjs";import{ConsoleKernel as t}from"./ConsoleKernel.mjs";import{MigrateCommand as n}from"./Commands/MigrateCommand.mjs";import{MigrateRollbackCommand as r}from"./Commands/MigrateRollbackCommand.mjs";import{MigrateResetCommand as i}from"./Commands/MigrateResetCommand.mjs";import{MigrateRefreshCommand as a}from"./Commands/MigrateRefreshCommand.mjs";import{MigrateFreshCommand as o}from"./Commands/MigrateFreshCommand.mjs";import{MigrateStatusCommand as s}from"./Commands/MigrateStatusCommand.mjs";import{MakeMigrationCommand as c}from"./Commands/MakeMigrationCommand.mjs";import{SeedCommand as l}from"./Commands/SeedCommand.mjs";import{MakeSeederCommand as u}from"./Commands/MakeSeederCommand.mjs";import{MakeEventCommand as d}from"./Commands/MakeEventCommand.mjs";import{MakeListenerCommand as f}from"./Commands/MakeListenerCommand.mjs";import{MakeControllerCommand as p}from"./Commands/MakeControllerCommand.mjs";import{EventListCommand as m}from"./Commands/EventListCommand.mjs";import{EventCacheCommand as h}from"./Commands/EventCacheCommand.mjs";import{EventClearCommand as g}from"./Commands/EventClearCommand.mjs";import{DeployLoginCommand as _}from"./Commands/DeployLoginCommand.mjs";import{DeployInitCommand as v}from"./Commands/DeployInitCommand.mjs";import{DeployServerCommand as y}from"./Commands/DeployServerCommand.mjs";import{DeployCommand as b}from"./Commands/DeployCommand.mjs";import{DeployStatusCommand as x}from"./Commands/DeployStatusCommand.mjs";import{DeployEnvCommand as S}from"./Commands/DeployEnvCommand.mjs";import{DeployRollbackCommand as C}from"./Commands/DeployRollbackCommand.mjs";import{DeployProvisionCommand as w}from"./Commands/DeployProvisionCommand.mjs";const T=new e;new class extends t{registerCommands(){this.registerMany([new n(this.app),new r(this.app),new i(this.app),new a(this.app),new o(this.app),new s(this.app),new c(this.app),new l(this.app),new u(this.app),new d(this.app),new f(this.app),new p(this.app),new m(this.app),new h(this.app),new g(this.app),new _,new v,new y,new b,new x,new S,new C,new w])}}(T).run().catch(e=>{console.error(e),process.exit(1)});export{};
|
|
3
|
+
//# sourceMappingURL=orchestr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestr.mjs","names":[],"sources":["../../src/Console/orchestr.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Orchestr CLI\n *\n * Command-line interface for Orchestr\n */\n\nimport { Application } from '@/Foundation/Application';\nimport { DeployCommand } from './Commands/DeployCommand';\nimport { DeployEnvCommand } from './Commands/DeployEnvCommand';\nimport { DeployInitCommand } from './Commands/DeployInitCommand';\nimport { DeployLoginCommand } from './Commands/DeployLoginCommand';\nimport { DeployProvisionCommand } from './Commands/DeployProvisionCommand';\nimport { DeployRollbackCommand } from './Commands/DeployRollbackCommand';\nimport { DeployServerCommand } from './Commands/DeployServerCommand';\nimport { DeployStatusCommand } from './Commands/DeployStatusCommand';\nimport { EventCacheCommand } from './Commands/EventCacheCommand';\nimport { EventClearCommand } from './Commands/EventClearCommand';\nimport { EventListCommand } from './Commands/EventListCommand';\nimport { MakeControllerCommand } from './Commands/MakeControllerCommand';\nimport { MakeEventCommand } from './Commands/MakeEventCommand';\nimport { MakeListenerCommand } from './Commands/MakeListenerCommand';\nimport { MakeMigrationCommand } from './Commands/MakeMigrationCommand';\nimport { MakeSeederCommand } from './Commands/MakeSeederCommand';\nimport { MigrateCommand } from './Commands/MigrateCommand';\nimport { MigrateFreshCommand } from './Commands/MigrateFreshCommand';\nimport { MigrateRefreshCommand } from './Commands/MigrateRefreshCommand';\nimport { MigrateResetCommand } from './Commands/MigrateResetCommand';\nimport { MigrateRollbackCommand } from './Commands/MigrateRollbackCommand';\nimport { MigrateStatusCommand } from './Commands/MigrateStatusCommand';\nimport { SeedCommand } from './Commands/SeedCommand';\nimport { ConsoleKernel } from './ConsoleKernel';\n\n// Create application instance\nconst app = new Application();\n\n// Create console kernel\nclass OrchestrKernel extends ConsoleKernel {\n protected registerCommands(): void {\n // Register migration commands\n this.registerMany([\n new MigrateCommand(this.app),\n new MigrateRollbackCommand(this.app),\n new MigrateResetCommand(this.app),\n new MigrateRefreshCommand(this.app),\n new MigrateFreshCommand(this.app),\n new MigrateStatusCommand(this.app),\n new MakeMigrationCommand(this.app),\n new SeedCommand(this.app),\n new MakeSeederCommand(this.app),\n new MakeEventCommand(this.app),\n new MakeListenerCommand(this.app),\n new MakeControllerCommand(this.app),\n new EventListCommand(this.app),\n new EventCacheCommand(this.app),\n new EventClearCommand(this.app),\n // Deploy commands\n new DeployLoginCommand(),\n new DeployInitCommand(),\n new DeployServerCommand(),\n new DeployCommand(),\n new DeployStatusCommand(),\n new DeployEnvCommand(),\n new DeployRollbackCommand(),\n new DeployProvisionCommand(),\n ]);\n }\n}\n\n// Run the CLI\nconst kernel = new OrchestrKernel(app);\nkernel.run().catch((error) => {\n console.error(error);\n process.exit(1);\n});\n"],"mappings":";itDAkCA,MAAM,EAAM,IAAI,EAqChB,IADmB,cAjCU,CAAc,CACzC,kBAAmC,CAEjC,KAAK,aAAa,CAChB,IAAI,EAAe,KAAK,IAAI,CAC5B,IAAI,EAAuB,KAAK,IAAI,CACpC,IAAI,EAAoB,KAAK,IAAI,CACjC,IAAI,EAAsB,KAAK,IAAI,CACnC,IAAI,EAAoB,KAAK,IAAI,CACjC,IAAI,EAAqB,KAAK,IAAI,CAClC,IAAI,EAAqB,KAAK,IAAI,CAClC,IAAI,EAAY,KAAK,IAAI,CACzB,IAAI,EAAkB,KAAK,IAAI,CAC/B,IAAI,EAAiB,KAAK,IAAI,CAC9B,IAAI,EAAoB,KAAK,IAAI,CACjC,IAAI,EAAsB,KAAK,IAAI,CACnC,IAAI,EAAiB,KAAK,IAAI,CAC9B,IAAI,EAAkB,KAAK,IAAI,CAC/B,IAAI,EAAkB,KAAK,IAAI,CAE/B,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACL,CAAC,GAK4B,EAC5B,CAAC,KAAK,CAAC,MAAO,GAAU,CAC5B,QAAQ,MAAM,EAAM,CACpB,QAAQ,KAAK,EAAE,EACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Container.mjs","names":[],"sources":["../../src/Container/Container.ts"],"sourcesContent":["import 'reflect-metadata';\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport type Abstract = string | symbol | Function;\nexport type Concrete<T = any> = ((container: Container) => T) | (new (...args: any[]) => T);\nexport type Binding = {\n concrete: Concrete;\n shared: boolean;\n};\n\n/**\n * Service Container - Laravel's IoC Container\n * Handles dependency injection and service resolution\n */\nexport class Container {\n private bindings: Map<Abstract, Binding> = new Map();\n private instances: Map<Abstract, any> = new Map();\n private aliases: Map<Abstract, Abstract> = new Map();\n private resolvedTypes: Map<Abstract, boolean> = new Map();\n\n /**\n * Register a binding with the container\n * Laravel: $app->bind(abstract, concrete)\n */\n bind<T>(abstract: Abstract, concrete: Concrete<T> | null = null, shared: boolean = false): void {\n if (concrete === null) {\n concrete = abstract as Concrete<T>;\n }\n\n this.bindings.set(abstract, { concrete, shared });\n\n // If already resolved and not shared, clear the instance\n if (this.resolvedTypes.has(abstract) && !shared) {\n this.instances.delete(abstract);\n this.resolvedTypes.delete(abstract);\n }\n }\n\n /**\n * Register a shared binding (singleton) in the container\n * Laravel: $app->singleton(abstract, concrete)\n */\n singleton<T>(abstract: Abstract, concrete: Concrete<T> | null = null): void {\n this.bind(abstract, concrete, true);\n }\n\n /**\n * Register an existing instance as shared in the container\n * Laravel: $app->instance(abstract, instance)\n */\n instance<T>(abstract: Abstract, instance: T): T {\n this.instances.set(abstract, instance);\n this.bindings.set(abstract, {\n concrete: () => instance,\n shared: true,\n });\n return instance;\n }\n\n /**\n * Alias a type to a different name\n * Laravel: $app->alias(abstract, alias)\n */\n alias(abstract: Abstract, alias: Abstract): void {\n this.aliases.set(alias, abstract);\n }\n\n /**\n * Resolve the given type from the container\n * Laravel: $app->make(abstract)\n */\n make<T>(abstract: Abstract, parameters: any[] = []): T {\n return this.resolve(abstract, parameters);\n }\n\n /**\n * Resolve the given type from the container\n */\n private resolve<T>(abstract: Abstract, parameters: any[] = []): T {\n // Get the real abstract if this is an alias\n abstract = this.getAlias(abstract);\n\n // If we have a shared instance, return it\n if (this.instances.has(abstract)) {\n return this.instances.get(abstract);\n }\n\n // Get the concrete implementation\n const concrete = this.getConcrete(abstract);\n\n // Build the concrete type\n let object: T;\n\n if (this.isBuildable(concrete, abstract)) {\n object = this.build(concrete, parameters);\n } else {\n object = this.make(concrete as Abstract, parameters);\n }\n\n // If the binding is shared, store the instance\n if (this.isShared(abstract)) {\n this.instances.set(abstract, object);\n }\n\n this.resolvedTypes.set(abstract, true);\n\n return object;\n }\n\n /**\n * Get the concrete type for a given abstract\n */\n private getConcrete(abstract: Abstract): Concrete {\n const binding = this.bindings.get(abstract);\n\n if (binding) {\n return binding.concrete;\n }\n\n // If no binding exists, assume the abstract is the concrete\n return abstract as Concrete;\n }\n\n /**\n * Get the alias for an abstract if available\n */\n private getAlias(abstract: Abstract): Abstract {\n return this.aliases.has(abstract) ? this.getAlias(this.aliases.get(abstract)!) : abstract;\n }\n\n /**\n * Determine if the given concrete is buildable\n */\n private isBuildable(concrete: Concrete, abstract: Abstract): boolean {\n return concrete === abstract || typeof concrete === 'function';\n }\n\n /**\n * Determine if a given type is shared\n */\n private isShared(abstract: Abstract): boolean {\n const binding = this.bindings.get(abstract);\n return binding ? binding.shared : false;\n }\n\n /**\n * Instantiate a concrete instance of the given type\n * Uses reflection to resolve constructor dependencies\n */\n private build<T>(concrete: Concrete<T>, parameters: any[] = []): T {\n // If concrete is a function (factory), call it\n if (typeof concrete === 'function' && concrete.prototype === undefined) {\n return (concrete as (container: Container) => T)(this);\n }\n\n // If concrete is a class, use reflection to get dependencies\n if (typeof concrete === 'function') {\n const dependencies = this.resolveDependencies(concrete, parameters);\n return new (concrete as new (...args: any[]) => T)(...dependencies);\n }\n\n throw new Error(`Target [${String(concrete)}] is not instantiable.`);\n }\n\n /**\n * Resolve all dependencies for a class constructor\n * Uses TypeScript's reflect-metadata to get parameter types\n */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n private resolveDependencies(concrete: Function, parameters: any[] = []): any[] {\n const paramTypes = Reflect.getMetadata('design:paramtypes', concrete) || [];\n\n return paramTypes.map((paramType: any, index: number) => {\n // If parameter was provided explicitly, use it\n if (parameters[index] !== undefined) {\n return parameters[index];\n }\n\n // If no type information, throw error\n if (!paramType || paramType === Object) {\n throw new Error(\n `Cannot resolve dependency at position ${index} for ${concrete.name}. ` +\n `Make sure TypeScript decorators are enabled and the class has proper type hints.`\n );\n }\n\n // Resolve the dependency from the container\n return this.make(paramType);\n });\n }\n\n /**\n * Determine if the given abstract type has been bound\n */\n bound(abstract: Abstract): boolean {\n return this.bindings.has(abstract) || this.instances.has(abstract) || this.aliases.has(abstract);\n }\n\n /**\n * Determine if the given abstract type has been resolved\n */\n resolved(abstract: Abstract): boolean {\n abstract = this.getAlias(abstract);\n return this.resolvedTypes.has(abstract) || this.instances.has(abstract);\n }\n\n /**\n * Flush the container of all bindings and resolved instances\n */\n flush(): void {\n this.bindings.clear();\n this.instances.clear();\n this.aliases.clear();\n this.resolvedTypes.clear();\n }\n\n /**\n * Call the given Closure / class@method and inject its dependencies\n * Laravel: $app->call(callable)\n */\n call<T = any>(callback: (...args: any[]) => T, parameters: any[] = []): T {\n const paramTypes = Reflect.getMetadata('design:paramtypes', callback) || [];\n const dependencies = paramTypes.map((paramType: any, index: number) => {\n if (parameters[index] !== undefined) {\n return parameters[index];\n }\n return this.make(paramType);\n });\n\n return callback(...dependencies);\n }\n}\n"],"mappings":"yBAcA,IAAa,EAAb,KAAuB,CACrB,SAA2C,IAAI,IAC/C,UAAwC,IAAI,IAC5C,QAA2C,IAAI,IAC/C,cAAgD,IAAI,IAMpD,KAAQ,EAAoB,EAA+B,KAAM,EAAkB,GAAa,CAC1F,IAAa,OACf,EAAW,GAGb,KAAK,SAAS,IAAI,EAAU,CAAE,WAAU,SAAQ,CAAC,CAG7C,KAAK,cAAc,IAAI,EAAS,EAAI,CAAC,IACvC,KAAK,UAAU,OAAO,EAAS,CAC/B,KAAK,cAAc,OAAO,EAAS,EAQvC,UAAa,EAAoB,EAA+B,KAAY,CAC1E,KAAK,KAAK,EAAU,EAAU,GAAK,CAOrC,SAAY,EAAoB,EAAgB,CAM9C,OALA,KAAK,UAAU,IAAI,EAAU,EAAS,CACtC,KAAK,SAAS,IAAI,EAAU,CAC1B,aAAgB,EAChB,OAAQ,GACT,CAAC,CACK,EAOT,MAAM,EAAoB,EAAuB,CAC/C,KAAK,QAAQ,IAAI,EAAO,EAAS,CAOnC,KAAQ,EAAoB,EAAoB,EAAE,CAAK,CACrD,OAAO,KAAK,QAAQ,EAAU,EAAW,CAM3C,QAAmB,EAAoB,EAAoB,EAAE,CAAK,CAKhE,GAHA,EAAW,KAAK,SAAS,EAAS,CAG9B,KAAK,UAAU,IAAI,EAAS,CAC9B,OAAO,KAAK,UAAU,IAAI,EAAS,CAIrC,IAAM,EAAW,KAAK,YAAY,EAAS,CAGvC,EAeJ,MAbA,CAGE,EAHE,KAAK,YAAY,EAAU,EAAS,CAC7B,KAAK,MAAM,EAAU,EAAW,CAEhC,KAAK,KAAK,EAAsB,EAAW,CAIlD,KAAK,SAAS,EAAS,EACzB,KAAK,UAAU,IAAI,EAAU,EAAO,CAGtC,KAAK,cAAc,IAAI,EAAU,GAAK,CAE/B,EAMT,YAAoB,EAA8B,CAChD,IAAM,EAAU,KAAK,SAAS,IAAI,EAAS,CAO3C,OALI,EACK,EAAQ,SAIV,EAMT,SAAiB,EAA8B,CAC7C,OAAO,KAAK,QAAQ,IAAI,EAAS,CAAG,KAAK,SAAS,KAAK,QAAQ,IAAI,EAAS,CAAE,CAAG,EAMnF,YAAoB,EAAoB,EAA6B,CACnE,OAAO,IAAa,GAAY,OAAO,GAAa,WAMtD,SAAiB,EAA6B,CAC5C,IAAM,EAAU,KAAK,SAAS,IAAI,EAAS,CAC3C,OAAO,EAAU,EAAQ,OAAS,GAOpC,MAAiB,EAAuB,EAAoB,EAAE,CAAK,CAEjE,GAAI,OAAO,GAAa,YAAc,EAAS,YAAc,IAAA,GAC3D,OAAQ,EAAyC,KAAK,CAIxD,GAAI,OAAO,GAAa,WAEtB,OAAO,IAAK,EAAuC,GAD9B,KAAK,oBAAoB,EAAU,
|
|
1
|
+
{"version":3,"file":"Container.mjs","names":[],"sources":["../../src/Container/Container.ts"],"sourcesContent":["import 'reflect-metadata';\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport type Abstract = string | symbol | Function;\nexport type Concrete<T = any> = ((container: Container) => T) | (new (...args: any[]) => T);\nexport type Binding = {\n concrete: Concrete;\n shared: boolean;\n};\n\n/**\n * Service Container - Laravel's IoC Container\n * Handles dependency injection and service resolution\n */\nexport class Container {\n private bindings: Map<Abstract, Binding> = new Map();\n private instances: Map<Abstract, any> = new Map();\n private aliases: Map<Abstract, Abstract> = new Map();\n private resolvedTypes: Map<Abstract, boolean> = new Map();\n\n /**\n * Register a binding with the container\n * Laravel: $app->bind(abstract, concrete)\n */\n bind<T>(abstract: Abstract, concrete: Concrete<T> | null = null, shared: boolean = false): void {\n if (concrete === null) {\n concrete = abstract as Concrete<T>;\n }\n\n this.bindings.set(abstract, { concrete, shared });\n\n // If already resolved and not shared, clear the instance\n if (this.resolvedTypes.has(abstract) && !shared) {\n this.instances.delete(abstract);\n this.resolvedTypes.delete(abstract);\n }\n }\n\n /**\n * Register a shared binding (singleton) in the container\n * Laravel: $app->singleton(abstract, concrete)\n */\n singleton<T>(abstract: Abstract, concrete: Concrete<T> | null = null): void {\n this.bind(abstract, concrete, true);\n }\n\n /**\n * Register an existing instance as shared in the container\n * Laravel: $app->instance(abstract, instance)\n */\n instance<T>(abstract: Abstract, instance: T): T {\n this.instances.set(abstract, instance);\n this.bindings.set(abstract, {\n concrete: () => instance,\n shared: true,\n });\n return instance;\n }\n\n /**\n * Alias a type to a different name\n * Laravel: $app->alias(abstract, alias)\n */\n alias(abstract: Abstract, alias: Abstract): void {\n this.aliases.set(alias, abstract);\n }\n\n /**\n * Resolve the given type from the container\n * Laravel: $app->make(abstract)\n */\n make<T>(abstract: Abstract, parameters: any[] = []): T {\n return this.resolve(abstract, parameters);\n }\n\n /**\n * Resolve the given type from the container\n */\n private resolve<T>(abstract: Abstract, parameters: any[] = []): T {\n // Get the real abstract if this is an alias\n abstract = this.getAlias(abstract);\n\n // If we have a shared instance, return it\n if (this.instances.has(abstract)) {\n return this.instances.get(abstract);\n }\n\n // Get the concrete implementation\n const concrete = this.getConcrete(abstract);\n\n // Build the concrete type\n let object: T;\n\n if (this.isBuildable(concrete, abstract)) {\n object = this.build(concrete, parameters);\n } else {\n object = this.make(concrete as Abstract, parameters);\n }\n\n // If the binding is shared, store the instance\n if (this.isShared(abstract)) {\n this.instances.set(abstract, object);\n }\n\n this.resolvedTypes.set(abstract, true);\n\n return object;\n }\n\n /**\n * Get the concrete type for a given abstract\n */\n private getConcrete(abstract: Abstract): Concrete {\n const binding = this.bindings.get(abstract);\n\n if (binding) {\n return binding.concrete;\n }\n\n // If no binding exists, assume the abstract is the concrete\n return abstract as Concrete;\n }\n\n /**\n * Get the alias for an abstract if available\n */\n private getAlias(abstract: Abstract): Abstract {\n return this.aliases.has(abstract) ? this.getAlias(this.aliases.get(abstract)!) : abstract;\n }\n\n /**\n * Determine if the given concrete is buildable\n */\n private isBuildable(concrete: Concrete, abstract: Abstract): boolean {\n return concrete === abstract || typeof concrete === 'function';\n }\n\n /**\n * Determine if a given type is shared\n */\n private isShared(abstract: Abstract): boolean {\n const binding = this.bindings.get(abstract);\n return binding ? binding.shared : false;\n }\n\n /**\n * Instantiate a concrete instance of the given type\n * Uses reflection to resolve constructor dependencies\n */\n private build<T>(concrete: Concrete<T>, parameters: any[] = []): T {\n // If concrete is a function (factory), call it\n if (typeof concrete === 'function' && concrete.prototype === undefined) {\n return (concrete as (container: Container) => T)(this);\n }\n\n // If concrete is a class, use reflection to get dependencies\n if (typeof concrete === 'function') {\n const dependencies = this.resolveDependencies(concrete, parameters);\n return new (concrete as new (...args: any[]) => T)(...dependencies);\n }\n\n throw new Error(`Target [${String(concrete)}] is not instantiable.`);\n }\n\n /**\n * Resolve all dependencies for a class constructor\n * Uses TypeScript's reflect-metadata to get parameter types\n */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n private resolveDependencies(concrete: Function, parameters: any[] = []): any[] {\n const paramTypes = Reflect.getMetadata('design:paramtypes', concrete) || [];\n\n return paramTypes.map((paramType: any, index: number) => {\n // If parameter was provided explicitly, use it\n if (parameters[index] !== undefined) {\n return parameters[index];\n }\n\n // If no type information, throw error\n if (!paramType || paramType === Object) {\n throw new Error(\n `Cannot resolve dependency at position ${index} for ${concrete.name}. ` +\n `Make sure TypeScript decorators are enabled and the class has proper type hints.`\n );\n }\n\n // Resolve the dependency from the container\n return this.make(paramType);\n });\n }\n\n /**\n * Determine if the given abstract type has been bound\n */\n bound(abstract: Abstract): boolean {\n return this.bindings.has(abstract) || this.instances.has(abstract) || this.aliases.has(abstract);\n }\n\n /**\n * Determine if the given abstract type has been resolved\n */\n resolved(abstract: Abstract): boolean {\n abstract = this.getAlias(abstract);\n return this.resolvedTypes.has(abstract) || this.instances.has(abstract);\n }\n\n /**\n * Flush the container of all bindings and resolved instances\n */\n flush(): void {\n this.bindings.clear();\n this.instances.clear();\n this.aliases.clear();\n this.resolvedTypes.clear();\n }\n\n /**\n * Call the given Closure / class@method and inject its dependencies\n * Laravel: $app->call(callable)\n */\n call<T = any>(callback: (...args: any[]) => T, parameters: any[] = []): T {\n const paramTypes = Reflect.getMetadata('design:paramtypes', callback) || [];\n const dependencies = paramTypes.map((paramType: any, index: number) => {\n if (parameters[index] !== undefined) {\n return parameters[index];\n }\n return this.make(paramType);\n });\n\n return callback(...dependencies);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);var e=class{client;rawClient;connected=!1;inTransaction=!1;transactionClient;constructor(e){this.config=e}async connect(){if(!this.connected)try{switch(this.config.driver){case`postgres`:await this.connectPostgres();break;case`mysql`:case`mysql2`:await this.connectMySQL();break;case`better-sqlite3`:case`sqlite`:await this.connectSQLite();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}this.connected=!0}catch(e){throw Error(`Failed to connect to database: ${e?.message||e}`,{cause:e})}}async connectPostgres(){let{drizzle:e}=await import(`drizzle-orm/postgres-js`),t=(await import(`postgres`)).default({host:this.config.host,port:this.config.port,database:this.config.database,username:this.config.username,password:this.config.password,max:this.config.poolMax||10});this.rawClient=t,this.client=e(t)}async connectMySQL(){let{drizzle:e}=await import(`drizzle-orm/mysql2`),t=await(await import(`mysql2/promise`)).createPool({host:this.config.host,port:this.config.port,database:this.config.database,user:this.config.username,password:this.config.password,connectionLimit:this.config.poolMax||10});this.rawClient=t,this.client=e(t)}async connectSQLite(){let{drizzle:e}=await import(`drizzle-orm/better-sqlite3`),t=new(await(import(`better-sqlite3`))).default(this.config.database);this.rawClient=t,this.client=e(t)}async disconnect(){if(this.connected){if(this.rawClient)switch(this.config.driver){case`postgres`:await this.rawClient.end?.();break;case`mysql`:case`mysql2`:await this.rawClient.end?.();break;case`better-sqlite3`:case`sqlite`:this.rawClient.close?.();break}this.connected=!1,this.client=null,this.rawClient=null}}async query(e,t=[]){this.ensureConnected();try{let n=this.inTransaction?this.transactionClient:this.rawClient,r=this.bindParameters(e,t),i;switch(this.config.driver){case`postgres`:i=await n.unsafe(r);break;case`mysql`:case`mysql2`:{let[e]=await n.execute(r);i=e;break}case`better-sqlite3`:case`sqlite`:i=n.prepare(r).all();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}return{rows:Array.isArray(i)?i:i.rows||[],rowCount:Array.isArray(i)?i.length:i.rowCount||0}}catch(t){throw Error(`Query failed: ${t?.message||t}\nSQL: ${e}`,{cause:t})}}async select(e,t=[]){return(await this.query(e,t)).rows}async insert(e,t=[]){this.ensureConnected();try{let n=this.inTransaction?this.transactionClient:this.rawClient,r=this.bindParameters(e,t),i;switch(this.config.driver){case`postgres`:i=await n.unsafe(r);break;case`mysql`:case`mysql2`:[i]=await n.execute(r);break;case`better-sqlite3`:case`sqlite`:i=n.prepare(r).run();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}return i.insertId||i.lastInsertRowid||i.rows?.[0]?.id}catch(t){throw Error(`Insert failed: ${t?.message||t}\nSQL: ${e}`,{cause:t})}}async update(e,t=[]){return(await this.query(e,t)).rowCount}async delete(e,t=[]){return(await this.query(e,t)).rowCount}async beginTransaction(){if(this.ensureConnected(),this.inTransaction)throw Error(`Transaction already in progress`);this.inTransaction=!0,await this.query(`BEGIN`)}async commit(){if(!this.inTransaction)throw Error(`No transaction in progress`);await this.query(`COMMIT`),this.inTransaction=!1,this.transactionClient=null}async rollback(){if(!this.inTransaction)throw Error(`No transaction in progress`);await this.query(`ROLLBACK`),this.inTransaction=!1,this.transactionClient=null}async transaction(e){await this.beginTransaction();try{let t=await e(this);return await this.commit(),t}catch(e){throw await this.rollback(),e}}isConnected(){return this.connected}getDriver(){return this.client}async getTableInfo(e){switch(this.ensureConnected(),this.config.driver){case`postgres`:return this.getPostgresTableInfo(e);case`mysql`:case`mysql2`:return this.getMySQLTableInfo(e);case`better-sqlite3`:case`sqlite`:return this.getSQLiteTableInfo(e);default:throw Error(`Table info not supported for this driver`)}}async getPostgresTableInfo(e){return this.select(`
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);var e=class{config;client;rawClient;connected=!1;inTransaction=!1;transactionClient;constructor(e){this.config=e}async connect(){if(!this.connected)try{switch(this.config.driver){case`postgres`:await this.connectPostgres();break;case`mysql`:case`mysql2`:await this.connectMySQL();break;case`better-sqlite3`:case`sqlite`:await this.connectSQLite();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}this.connected=!0}catch(e){throw Error(`Failed to connect to database: ${e?.message||e}`,{cause:e})}}async connectPostgres(){let{drizzle:e}=await import(`drizzle-orm/postgres-js`),t=(await import(`postgres`)).default({host:this.config.host,port:this.config.port,database:this.config.database,username:this.config.username,password:this.config.password,max:this.config.poolMax||10});this.rawClient=t,this.client=e(t)}async connectMySQL(){let{drizzle:e}=await import(`drizzle-orm/mysql2`),t=await(await import(`mysql2/promise`)).createPool({host:this.config.host,port:this.config.port,database:this.config.database,user:this.config.username,password:this.config.password,connectionLimit:this.config.poolMax||10});this.rawClient=t,this.client=e(t)}async connectSQLite(){let{drizzle:e}=await import(`drizzle-orm/better-sqlite3`),t=new(await(import(`better-sqlite3`))).default(this.config.database);this.rawClient=t,this.client=e(t)}async disconnect(){if(this.connected){if(this.rawClient)switch(this.config.driver){case`postgres`:await this.rawClient.end?.();break;case`mysql`:case`mysql2`:await this.rawClient.end?.();break;case`better-sqlite3`:case`sqlite`:this.rawClient.close?.();break}this.connected=!1,this.client=null,this.rawClient=null}}async query(e,t=[]){this.ensureConnected();try{let n=this.inTransaction?this.transactionClient:this.rawClient,r=this.bindParameters(e,t),i;switch(this.config.driver){case`postgres`:i=await n.unsafe(r);break;case`mysql`:case`mysql2`:{let[e]=await n.execute(r);i=e;break}case`better-sqlite3`:case`sqlite`:i=n.prepare(r).all();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}return{rows:Array.isArray(i)?i:i.rows||[],rowCount:Array.isArray(i)?i.length:i.rowCount||0}}catch(t){throw Error(`Query failed: ${t?.message||t}\nSQL: ${e}`,{cause:t})}}async select(e,t=[]){return(await this.query(e,t)).rows}async insert(e,t=[]){this.ensureConnected();try{let n=this.inTransaction?this.transactionClient:this.rawClient,r=this.bindParameters(e,t),i;switch(this.config.driver){case`postgres`:i=await n.unsafe(r);break;case`mysql`:case`mysql2`:[i]=await n.execute(r);break;case`better-sqlite3`:case`sqlite`:i=n.prepare(r).run();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}return i.insertId||i.lastInsertRowid||i.rows?.[0]?.id}catch(t){throw Error(`Insert failed: ${t?.message||t}\nSQL: ${e}`,{cause:t})}}async update(e,t=[]){return(await this.query(e,t)).rowCount}async delete(e,t=[]){return(await this.query(e,t)).rowCount}async beginTransaction(){if(this.ensureConnected(),this.inTransaction)throw Error(`Transaction already in progress`);this.inTransaction=!0,await this.query(`BEGIN`)}async commit(){if(!this.inTransaction)throw Error(`No transaction in progress`);await this.query(`COMMIT`),this.inTransaction=!1,this.transactionClient=null}async rollback(){if(!this.inTransaction)throw Error(`No transaction in progress`);await this.query(`ROLLBACK`),this.inTransaction=!1,this.transactionClient=null}async transaction(e){await this.beginTransaction();try{let t=await e(this);return await this.commit(),t}catch(e){throw await this.rollback(),e}}isConnected(){return this.connected}getDriver(){return this.client}async getTableInfo(e){switch(this.ensureConnected(),this.config.driver){case`postgres`:return this.getPostgresTableInfo(e);case`mysql`:case`mysql2`:return this.getMySQLTableInfo(e);case`better-sqlite3`:case`sqlite`:return this.getSQLiteTableInfo(e);default:throw Error(`Table info not supported for this driver`)}}async getPostgresTableInfo(e){return this.select(`
|
|
2
2
|
SELECT column_name, data_type, is_nullable, column_default
|
|
3
3
|
FROM information_schema.columns
|
|
4
4
|
WHERE table_name = ?
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var e=class{client;rawClient;connected=!1;inTransaction=!1;transactionClient;constructor(e){this.config=e}async connect(){if(!this.connected)try{switch(this.config.driver){case`postgres`:await this.connectPostgres();break;case`mysql`:case`mysql2`:await this.connectMySQL();break;case`better-sqlite3`:case`sqlite`:await this.connectSQLite();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}this.connected=!0}catch(e){throw Error(`Failed to connect to database: ${e?.message||e}`,{cause:e})}}async connectPostgres(){let{drizzle:e}=await import(`drizzle-orm/postgres-js`),t=(await import(`postgres`)).default({host:this.config.host,port:this.config.port,database:this.config.database,username:this.config.username,password:this.config.password,max:this.config.poolMax||10});this.rawClient=t,this.client=e(t)}async connectMySQL(){let{drizzle:e}=await import(`drizzle-orm/mysql2`),t=await(await import(`mysql2/promise`)).createPool({host:this.config.host,port:this.config.port,database:this.config.database,user:this.config.username,password:this.config.password,connectionLimit:this.config.poolMax||10});this.rawClient=t,this.client=e(t)}async connectSQLite(){let{drizzle:e}=await import(`drizzle-orm/better-sqlite3`),t=new(await(import(`better-sqlite3`))).default(this.config.database);this.rawClient=t,this.client=e(t)}async disconnect(){if(this.connected){if(this.rawClient)switch(this.config.driver){case`postgres`:await this.rawClient.end?.();break;case`mysql`:case`mysql2`:await this.rawClient.end?.();break;case`better-sqlite3`:case`sqlite`:this.rawClient.close?.();break}this.connected=!1,this.client=null,this.rawClient=null}}async query(e,t=[]){this.ensureConnected();try{let n=this.inTransaction?this.transactionClient:this.rawClient,r=this.bindParameters(e,t),i;switch(this.config.driver){case`postgres`:i=await n.unsafe(r);break;case`mysql`:case`mysql2`:{let[e]=await n.execute(r);i=e;break}case`better-sqlite3`:case`sqlite`:i=n.prepare(r).all();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}return{rows:Array.isArray(i)?i:i.rows||[],rowCount:Array.isArray(i)?i.length:i.rowCount||0}}catch(t){throw Error(`Query failed: ${t?.message||t}\nSQL: ${e}`,{cause:t})}}async select(e,t=[]){return(await this.query(e,t)).rows}async insert(e,t=[]){this.ensureConnected();try{let n=this.inTransaction?this.transactionClient:this.rawClient,r=this.bindParameters(e,t),i;switch(this.config.driver){case`postgres`:i=await n.unsafe(r);break;case`mysql`:case`mysql2`:[i]=await n.execute(r);break;case`better-sqlite3`:case`sqlite`:i=n.prepare(r).run();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}return i.insertId||i.lastInsertRowid||i.rows?.[0]?.id}catch(t){throw Error(`Insert failed: ${t?.message||t}\nSQL: ${e}`,{cause:t})}}async update(e,t=[]){return(await this.query(e,t)).rowCount}async delete(e,t=[]){return(await this.query(e,t)).rowCount}async beginTransaction(){if(this.ensureConnected(),this.inTransaction)throw Error(`Transaction already in progress`);this.inTransaction=!0,await this.query(`BEGIN`)}async commit(){if(!this.inTransaction)throw Error(`No transaction in progress`);await this.query(`COMMIT`),this.inTransaction=!1,this.transactionClient=null}async rollback(){if(!this.inTransaction)throw Error(`No transaction in progress`);await this.query(`ROLLBACK`),this.inTransaction=!1,this.transactionClient=null}async transaction(e){await this.beginTransaction();try{let t=await e(this);return await this.commit(),t}catch(e){throw await this.rollback(),e}}isConnected(){return this.connected}getDriver(){return this.client}async getTableInfo(e){switch(this.ensureConnected(),this.config.driver){case`postgres`:return this.getPostgresTableInfo(e);case`mysql`:case`mysql2`:return this.getMySQLTableInfo(e);case`better-sqlite3`:case`sqlite`:return this.getSQLiteTableInfo(e);default:throw Error(`Table info not supported for this driver`)}}async getPostgresTableInfo(e){return this.select(`
|
|
1
|
+
var e=class{config;client;rawClient;connected=!1;inTransaction=!1;transactionClient;constructor(e){this.config=e}async connect(){if(!this.connected)try{switch(this.config.driver){case`postgres`:await this.connectPostgres();break;case`mysql`:case`mysql2`:await this.connectMySQL();break;case`better-sqlite3`:case`sqlite`:await this.connectSQLite();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}this.connected=!0}catch(e){throw Error(`Failed to connect to database: ${e?.message||e}`,{cause:e})}}async connectPostgres(){let{drizzle:e}=await import(`drizzle-orm/postgres-js`),t=(await import(`postgres`)).default({host:this.config.host,port:this.config.port,database:this.config.database,username:this.config.username,password:this.config.password,max:this.config.poolMax||10});this.rawClient=t,this.client=e(t)}async connectMySQL(){let{drizzle:e}=await import(`drizzle-orm/mysql2`),t=await(await import(`mysql2/promise`)).createPool({host:this.config.host,port:this.config.port,database:this.config.database,user:this.config.username,password:this.config.password,connectionLimit:this.config.poolMax||10});this.rawClient=t,this.client=e(t)}async connectSQLite(){let{drizzle:e}=await import(`drizzle-orm/better-sqlite3`),t=new(await(import(`better-sqlite3`))).default(this.config.database);this.rawClient=t,this.client=e(t)}async disconnect(){if(this.connected){if(this.rawClient)switch(this.config.driver){case`postgres`:await this.rawClient.end?.();break;case`mysql`:case`mysql2`:await this.rawClient.end?.();break;case`better-sqlite3`:case`sqlite`:this.rawClient.close?.();break}this.connected=!1,this.client=null,this.rawClient=null}}async query(e,t=[]){this.ensureConnected();try{let n=this.inTransaction?this.transactionClient:this.rawClient,r=this.bindParameters(e,t),i;switch(this.config.driver){case`postgres`:i=await n.unsafe(r);break;case`mysql`:case`mysql2`:{let[e]=await n.execute(r);i=e;break}case`better-sqlite3`:case`sqlite`:i=n.prepare(r).all();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}return{rows:Array.isArray(i)?i:i.rows||[],rowCount:Array.isArray(i)?i.length:i.rowCount||0}}catch(t){throw Error(`Query failed: ${t?.message||t}\nSQL: ${e}`,{cause:t})}}async select(e,t=[]){return(await this.query(e,t)).rows}async insert(e,t=[]){this.ensureConnected();try{let n=this.inTransaction?this.transactionClient:this.rawClient,r=this.bindParameters(e,t),i;switch(this.config.driver){case`postgres`:i=await n.unsafe(r);break;case`mysql`:case`mysql2`:[i]=await n.execute(r);break;case`better-sqlite3`:case`sqlite`:i=n.prepare(r).run();break;default:throw Error(`Unsupported database driver: ${this.config.driver}`)}return i.insertId||i.lastInsertRowid||i.rows?.[0]?.id}catch(t){throw Error(`Insert failed: ${t?.message||t}\nSQL: ${e}`,{cause:t})}}async update(e,t=[]){return(await this.query(e,t)).rowCount}async delete(e,t=[]){return(await this.query(e,t)).rowCount}async beginTransaction(){if(this.ensureConnected(),this.inTransaction)throw Error(`Transaction already in progress`);this.inTransaction=!0,await this.query(`BEGIN`)}async commit(){if(!this.inTransaction)throw Error(`No transaction in progress`);await this.query(`COMMIT`),this.inTransaction=!1,this.transactionClient=null}async rollback(){if(!this.inTransaction)throw Error(`No transaction in progress`);await this.query(`ROLLBACK`),this.inTransaction=!1,this.transactionClient=null}async transaction(e){await this.beginTransaction();try{let t=await e(this);return await this.commit(),t}catch(e){throw await this.rollback(),e}}isConnected(){return this.connected}getDriver(){return this.client}async getTableInfo(e){switch(this.ensureConnected(),this.config.driver){case`postgres`:return this.getPostgresTableInfo(e);case`mysql`:case`mysql2`:return this.getMySQLTableInfo(e);case`better-sqlite3`:case`sqlite`:return this.getSQLiteTableInfo(e);default:throw Error(`Table info not supported for this driver`)}}async getPostgresTableInfo(e){return this.select(`
|
|
2
2
|
SELECT column_name, data_type, is_nullable, column_default
|
|
3
3
|
FROM information_schema.columns
|
|
4
4
|
WHERE table_name = ?
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrizzleAdapter.mjs","names":[],"sources":["../../../src/Database/Adapters/DrizzleAdapter.ts"],"sourcesContent":["/**\n * DrizzleAdapter\n *\n * Database adapter implementation using Drizzle ORM\n */\n\nimport { DatabaseAdapter, DatabaseConfig, QueryResult } from '@/Database/Contracts/DatabaseAdapter';\n\nexport class DrizzleAdapter implements DatabaseAdapter {\n protected client: any;\n protected rawClient: any;\n protected connected: boolean = false;\n protected inTransaction: boolean = false;\n protected transactionClient: any;\n\n constructor(protected config: DatabaseConfig) {}\n\n /**\n * Connect to the database\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n // Dynamically import the appropriate Drizzle driver\n switch (this.config.driver) {\n case 'postgres':\n await this.connectPostgres();\n break;\n case 'mysql':\n case 'mysql2':\n await this.connectMySQL();\n break;\n case 'better-sqlite3':\n case 'sqlite':\n await this.connectSQLite();\n break;\n default:\n throw new Error(`Unsupported database driver: ${this.config.driver}`);\n }\n\n this.connected = true;\n } catch (error: any) {\n throw new Error(`Failed to connect to database: ${error?.message || error}`, { cause: error });\n }\n }\n\n /**\n * Connect to PostgreSQL\n */\n protected async connectPostgres(): Promise<void> {\n const { drizzle } = await import('drizzle-orm/postgres-js');\n const postgres = await import('postgres');\n\n const rawClient = postgres.default({\n host: this.config.host,\n port: this.config.port,\n database: this.config.database,\n username: this.config.username,\n password: this.config.password,\n max: this.config.poolMax || 10,\n });\n\n this.rawClient = rawClient;\n this.client = drizzle(rawClient);\n }\n\n /**\n * Connect to MySQL\n */\n protected async connectMySQL(): Promise<void> {\n const { drizzle } = await import('drizzle-orm/mysql2');\n const mysql = await import('mysql2/promise');\n\n const rawClient = await mysql.createPool({\n host: this.config.host,\n port: this.config.port,\n database: this.config.database,\n user: this.config.username,\n password: this.config.password,\n connectionLimit: this.config.poolMax || 10,\n });\n\n this.rawClient = rawClient;\n this.client = drizzle(rawClient);\n }\n\n /**\n * Connect to SQLite\n */\n protected async connectSQLite(): Promise<void> {\n const { drizzle } = await import('drizzle-orm/better-sqlite3');\n const Database = await import('better-sqlite3');\n\n const rawClient = new Database.default(this.config.database);\n this.rawClient = rawClient;\n this.client = drizzle(rawClient);\n }\n\n /**\n * Disconnect from the database\n */\n async disconnect(): Promise<void> {\n if (!this.connected) {\n return;\n }\n\n // Close the raw client connection if possible\n if (this.rawClient) {\n switch (this.config.driver) {\n case 'postgres':\n await this.rawClient.end?.();\n break;\n case 'mysql':\n case 'mysql2':\n await this.rawClient.end?.();\n break;\n case 'better-sqlite3':\n case 'sqlite':\n this.rawClient.close?.();\n break;\n }\n }\n\n this.connected = false;\n this.client = null;\n this.rawClient = null;\n }\n\n /**\n * Execute a raw SQL query\n */\n async query<T = any>(sql: string, bindings: any[] = []): Promise<QueryResult<T>> {\n this.ensureConnected();\n\n try {\n const client = this.inTransaction ? this.transactionClient : this.rawClient;\n const boundSql = this.bindParameters(sql, bindings);\n\n let result: any;\n\n // Execute based on driver type\n switch (this.config.driver) {\n case 'postgres':\n result = await client.unsafe(boundSql);\n break;\n case 'mysql':\n case 'mysql2': {\n const [rows] = await client.execute(boundSql);\n result = rows;\n break;\n }\n case 'better-sqlite3':\n case 'sqlite':\n result = client.prepare(boundSql).all();\n break;\n default:\n throw new Error(`Unsupported database driver: ${this.config.driver}`);\n }\n\n return {\n rows: Array.isArray(result) ? result : result.rows || [],\n rowCount: Array.isArray(result) ? result.length : result.rowCount || 0,\n };\n } catch (error: any) {\n throw new Error(`Query failed: ${error?.message || error}\\nSQL: ${sql}`, { cause: error });\n }\n }\n\n /**\n * Execute a SELECT query\n */\n async select<T = any>(sql: string, bindings: any[] = []): Promise<T[]> {\n const result = await this.query<T>(sql, bindings);\n return result.rows;\n }\n\n /**\n * Execute an INSERT query\n */\n async insert(sql: string, bindings: any[] = []): Promise<any> {\n this.ensureConnected();\n\n try {\n const client = this.inTransaction ? this.transactionClient : this.rawClient;\n const boundSql = this.bindParameters(sql, bindings);\n\n let result: any;\n\n // Execute based on driver type\n switch (this.config.driver) {\n case 'postgres':\n result = await client.unsafe(boundSql);\n break;\n case 'mysql':\n case 'mysql2':\n [result] = await client.execute(boundSql);\n break;\n case 'better-sqlite3':\n case 'sqlite':\n result = client.prepare(boundSql).run();\n break;\n default:\n throw new Error(`Unsupported database driver: ${this.config.driver}`);\n }\n\n // Return the inserted ID\n return result.insertId || result.lastInsertRowid || result.rows?.[0]?.id;\n } catch (error: any) {\n throw new Error(`Insert failed: ${error?.message || error}\\nSQL: ${sql}`, { cause: error });\n }\n }\n\n /**\n * Execute an UPDATE query\n */\n async update(sql: string, bindings: any[] = []): Promise<number> {\n const result = await this.query(sql, bindings);\n return result.rowCount;\n }\n\n /**\n * Execute a DELETE query\n */\n async delete(sql: string, bindings: any[] = []): Promise<number> {\n const result = await this.query(sql, bindings);\n return result.rowCount;\n }\n\n /**\n * Begin a transaction\n */\n async beginTransaction(): Promise<void> {\n this.ensureConnected();\n\n if (this.inTransaction) {\n throw new Error('Transaction already in progress');\n }\n\n this.inTransaction = true;\n\n // For now, we'll use simple BEGIN/COMMIT/ROLLBACK\n // In a more sophisticated implementation, we'd use Drizzle's transaction API\n await this.query('BEGIN');\n }\n\n /**\n * Commit a transaction\n */\n async commit(): Promise<void> {\n if (!this.inTransaction) {\n throw new Error('No transaction in progress');\n }\n\n await this.query('COMMIT');\n this.inTransaction = false;\n this.transactionClient = null;\n }\n\n /**\n * Rollback a transaction\n */\n async rollback(): Promise<void> {\n if (!this.inTransaction) {\n throw new Error('No transaction in progress');\n }\n\n await this.query('ROLLBACK');\n this.inTransaction = false;\n this.transactionClient = null;\n }\n\n /**\n * Execute a callback within a transaction\n */\n async transaction<T>(callback: (adapter: DatabaseAdapter) => Promise<T>): Promise<T> {\n await this.beginTransaction();\n\n try {\n const result = await callback(this);\n await this.commit();\n return result;\n } catch (error) {\n await this.rollback();\n throw error;\n }\n }\n\n /**\n * Check if adapter is connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the underlying driver instance\n */\n getDriver(): any {\n return this.client;\n }\n\n /**\n * Get table information\n */\n async getTableInfo(tableName: string): Promise<any> {\n this.ensureConnected();\n\n // Implementation varies by driver\n switch (this.config.driver) {\n case 'postgres':\n return this.getPostgresTableInfo(tableName);\n case 'mysql':\n case 'mysql2':\n return this.getMySQLTableInfo(tableName);\n case 'better-sqlite3':\n case 'sqlite':\n return this.getSQLiteTableInfo(tableName);\n default:\n throw new Error('Table info not supported for this driver');\n }\n }\n\n /**\n * Get PostgreSQL table info\n */\n protected async getPostgresTableInfo(tableName: string): Promise<any> {\n const sql = `\n SELECT column_name, data_type, is_nullable, column_default\n FROM information_schema.columns\n WHERE table_name = ?\n ORDER BY ordinal_position\n `;\n return this.select(sql, [tableName]);\n }\n\n /**\n * Get MySQL table info\n */\n protected async getMySQLTableInfo(tableName: string): Promise<any> {\n const sql = `DESCRIBE ${tableName}`;\n return this.select(sql);\n }\n\n /**\n * Get SQLite table info\n */\n protected async getSQLiteTableInfo(tableName: string): Promise<any> {\n const sql = `PRAGMA table_info(${tableName})`;\n return this.select(sql);\n }\n\n /**\n * Get all table names\n */\n async getTables(): Promise<string[]> {\n this.ensureConnected();\n\n switch (this.config.driver) {\n case 'postgres':\n return this.getPostgresTables();\n case 'mysql':\n case 'mysql2':\n return this.getMySQLTables();\n case 'better-sqlite3':\n case 'sqlite':\n return this.getSQLiteTables();\n default:\n throw new Error('Get tables not supported for this driver');\n }\n }\n\n /**\n * Get PostgreSQL tables\n */\n protected async getPostgresTables(): Promise<string[]> {\n const sql = `\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_type = 'BASE TABLE'\n `;\n const result = await this.select<any>(sql);\n return result.map((row) => row.table_name);\n }\n\n /**\n * Get MySQL tables\n */\n protected async getMySQLTables(): Promise<string[]> {\n const sql = 'SHOW TABLES';\n const result = await this.select<any>(sql);\n return result.map((row) => Object.values(row)[0] as string);\n }\n\n /**\n * Get SQLite tables\n */\n protected async getSQLiteTables(): Promise<string[]> {\n const sql = `\n SELECT name\n FROM sqlite_master\n WHERE type = 'table'\n AND name NOT LIKE 'sqlite_%'\n `;\n const result = await this.select<any>(sql);\n return result.map((row) => row.name);\n }\n\n /**\n * Bind parameters to SQL query\n */\n protected bindParameters(sql: string, bindings: any[] = []): string {\n if (bindings.length === 0) {\n return sql;\n }\n\n // Replace ? placeholders with actual values\n // Note: This is a simple implementation. In production, use parameterized queries\n let index = 0;\n return sql.replace(/\\?/g, () => {\n const value = bindings[index++];\n\n if (value === null || value === undefined) {\n return 'NULL';\n }\n\n if (typeof value === 'string') {\n return `'${value.replace(/'/g, \"''\")}'`;\n }\n\n if (typeof value === 'boolean') {\n return value ? '1' : '0';\n }\n\n if (value instanceof Date) {\n return `'${value.toISOString()}'`;\n }\n\n return String(value);\n });\n }\n\n /**\n * Ensure the adapter is connected\n */\n protected ensureConnected(): void {\n if (!this.connected) {\n throw new Error('Database not connected. Call connect() first.');\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DrizzleAdapter.mjs","names":[],"sources":["../../../src/Database/Adapters/DrizzleAdapter.ts"],"sourcesContent":["/**\n * DrizzleAdapter\n *\n * Database adapter implementation using Drizzle ORM\n */\n\nimport { DatabaseAdapter, DatabaseConfig, QueryResult } from '@/Database/Contracts/DatabaseAdapter';\n\nexport class DrizzleAdapter implements DatabaseAdapter {\n protected client: any;\n protected rawClient: any;\n protected connected: boolean = false;\n protected inTransaction: boolean = false;\n protected transactionClient: any;\n\n constructor(protected config: DatabaseConfig) {}\n\n /**\n * Connect to the database\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n // Dynamically import the appropriate Drizzle driver\n switch (this.config.driver) {\n case 'postgres':\n await this.connectPostgres();\n break;\n case 'mysql':\n case 'mysql2':\n await this.connectMySQL();\n break;\n case 'better-sqlite3':\n case 'sqlite':\n await this.connectSQLite();\n break;\n default:\n throw new Error(`Unsupported database driver: ${this.config.driver}`);\n }\n\n this.connected = true;\n } catch (error: any) {\n throw new Error(`Failed to connect to database: ${error?.message || error}`, { cause: error });\n }\n }\n\n /**\n * Connect to PostgreSQL\n */\n protected async connectPostgres(): Promise<void> {\n const { drizzle } = await import('drizzle-orm/postgres-js');\n const postgres = await import('postgres');\n\n const rawClient = postgres.default({\n host: this.config.host,\n port: this.config.port,\n database: this.config.database,\n username: this.config.username,\n password: this.config.password,\n max: this.config.poolMax || 10,\n });\n\n this.rawClient = rawClient;\n this.client = drizzle(rawClient);\n }\n\n /**\n * Connect to MySQL\n */\n protected async connectMySQL(): Promise<void> {\n const { drizzle } = await import('drizzle-orm/mysql2');\n const mysql = await import('mysql2/promise');\n\n const rawClient = await mysql.createPool({\n host: this.config.host,\n port: this.config.port,\n database: this.config.database,\n user: this.config.username,\n password: this.config.password,\n connectionLimit: this.config.poolMax || 10,\n });\n\n this.rawClient = rawClient;\n this.client = drizzle(rawClient);\n }\n\n /**\n * Connect to SQLite\n */\n protected async connectSQLite(): Promise<void> {\n const { drizzle } = await import('drizzle-orm/better-sqlite3');\n const Database = await import('better-sqlite3');\n\n const rawClient = new Database.default(this.config.database);\n this.rawClient = rawClient;\n this.client = drizzle(rawClient);\n }\n\n /**\n * Disconnect from the database\n */\n async disconnect(): Promise<void> {\n if (!this.connected) {\n return;\n }\n\n // Close the raw client connection if possible\n if (this.rawClient) {\n switch (this.config.driver) {\n case 'postgres':\n await this.rawClient.end?.();\n break;\n case 'mysql':\n case 'mysql2':\n await this.rawClient.end?.();\n break;\n case 'better-sqlite3':\n case 'sqlite':\n this.rawClient.close?.();\n break;\n }\n }\n\n this.connected = false;\n this.client = null;\n this.rawClient = null;\n }\n\n /**\n * Execute a raw SQL query\n */\n async query<T = any>(sql: string, bindings: any[] = []): Promise<QueryResult<T>> {\n this.ensureConnected();\n\n try {\n const client = this.inTransaction ? this.transactionClient : this.rawClient;\n const boundSql = this.bindParameters(sql, bindings);\n\n let result: any;\n\n // Execute based on driver type\n switch (this.config.driver) {\n case 'postgres':\n result = await client.unsafe(boundSql);\n break;\n case 'mysql':\n case 'mysql2': {\n const [rows] = await client.execute(boundSql);\n result = rows;\n break;\n }\n case 'better-sqlite3':\n case 'sqlite':\n result = client.prepare(boundSql).all();\n break;\n default:\n throw new Error(`Unsupported database driver: ${this.config.driver}`);\n }\n\n return {\n rows: Array.isArray(result) ? result : result.rows || [],\n rowCount: Array.isArray(result) ? result.length : result.rowCount || 0,\n };\n } catch (error: any) {\n throw new Error(`Query failed: ${error?.message || error}\\nSQL: ${sql}`, { cause: error });\n }\n }\n\n /**\n * Execute a SELECT query\n */\n async select<T = any>(sql: string, bindings: any[] = []): Promise<T[]> {\n const result = await this.query<T>(sql, bindings);\n return result.rows;\n }\n\n /**\n * Execute an INSERT query\n */\n async insert(sql: string, bindings: any[] = []): Promise<any> {\n this.ensureConnected();\n\n try {\n const client = this.inTransaction ? this.transactionClient : this.rawClient;\n const boundSql = this.bindParameters(sql, bindings);\n\n let result: any;\n\n // Execute based on driver type\n switch (this.config.driver) {\n case 'postgres':\n result = await client.unsafe(boundSql);\n break;\n case 'mysql':\n case 'mysql2':\n [result] = await client.execute(boundSql);\n break;\n case 'better-sqlite3':\n case 'sqlite':\n result = client.prepare(boundSql).run();\n break;\n default:\n throw new Error(`Unsupported database driver: ${this.config.driver}`);\n }\n\n // Return the inserted ID\n return result.insertId || result.lastInsertRowid || result.rows?.[0]?.id;\n } catch (error: any) {\n throw new Error(`Insert failed: ${error?.message || error}\\nSQL: ${sql}`, { cause: error });\n }\n }\n\n /**\n * Execute an UPDATE query\n */\n async update(sql: string, bindings: any[] = []): Promise<number> {\n const result = await this.query(sql, bindings);\n return result.rowCount;\n }\n\n /**\n * Execute a DELETE query\n */\n async delete(sql: string, bindings: any[] = []): Promise<number> {\n const result = await this.query(sql, bindings);\n return result.rowCount;\n }\n\n /**\n * Begin a transaction\n */\n async beginTransaction(): Promise<void> {\n this.ensureConnected();\n\n if (this.inTransaction) {\n throw new Error('Transaction already in progress');\n }\n\n this.inTransaction = true;\n\n // For now, we'll use simple BEGIN/COMMIT/ROLLBACK\n // In a more sophisticated implementation, we'd use Drizzle's transaction API\n await this.query('BEGIN');\n }\n\n /**\n * Commit a transaction\n */\n async commit(): Promise<void> {\n if (!this.inTransaction) {\n throw new Error('No transaction in progress');\n }\n\n await this.query('COMMIT');\n this.inTransaction = false;\n this.transactionClient = null;\n }\n\n /**\n * Rollback a transaction\n */\n async rollback(): Promise<void> {\n if (!this.inTransaction) {\n throw new Error('No transaction in progress');\n }\n\n await this.query('ROLLBACK');\n this.inTransaction = false;\n this.transactionClient = null;\n }\n\n /**\n * Execute a callback within a transaction\n */\n async transaction<T>(callback: (adapter: DatabaseAdapter) => Promise<T>): Promise<T> {\n await this.beginTransaction();\n\n try {\n const result = await callback(this);\n await this.commit();\n return result;\n } catch (error) {\n await this.rollback();\n throw error;\n }\n }\n\n /**\n * Check if adapter is connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the underlying driver instance\n */\n getDriver(): any {\n return this.client;\n }\n\n /**\n * Get table information\n */\n async getTableInfo(tableName: string): Promise<any> {\n this.ensureConnected();\n\n // Implementation varies by driver\n switch (this.config.driver) {\n case 'postgres':\n return this.getPostgresTableInfo(tableName);\n case 'mysql':\n case 'mysql2':\n return this.getMySQLTableInfo(tableName);\n case 'better-sqlite3':\n case 'sqlite':\n return this.getSQLiteTableInfo(tableName);\n default:\n throw new Error('Table info not supported for this driver');\n }\n }\n\n /**\n * Get PostgreSQL table info\n */\n protected async getPostgresTableInfo(tableName: string): Promise<any> {\n const sql = `\n SELECT column_name, data_type, is_nullable, column_default\n FROM information_schema.columns\n WHERE table_name = ?\n ORDER BY ordinal_position\n `;\n return this.select(sql, [tableName]);\n }\n\n /**\n * Get MySQL table info\n */\n protected async getMySQLTableInfo(tableName: string): Promise<any> {\n const sql = `DESCRIBE ${tableName}`;\n return this.select(sql);\n }\n\n /**\n * Get SQLite table info\n */\n protected async getSQLiteTableInfo(tableName: string): Promise<any> {\n const sql = `PRAGMA table_info(${tableName})`;\n return this.select(sql);\n }\n\n /**\n * Get all table names\n */\n async getTables(): Promise<string[]> {\n this.ensureConnected();\n\n switch (this.config.driver) {\n case 'postgres':\n return this.getPostgresTables();\n case 'mysql':\n case 'mysql2':\n return this.getMySQLTables();\n case 'better-sqlite3':\n case 'sqlite':\n return this.getSQLiteTables();\n default:\n throw new Error('Get tables not supported for this driver');\n }\n }\n\n /**\n * Get PostgreSQL tables\n */\n protected async getPostgresTables(): Promise<string[]> {\n const sql = `\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_type = 'BASE TABLE'\n `;\n const result = await this.select<any>(sql);\n return result.map((row) => row.table_name);\n }\n\n /**\n * Get MySQL tables\n */\n protected async getMySQLTables(): Promise<string[]> {\n const sql = 'SHOW TABLES';\n const result = await this.select<any>(sql);\n return result.map((row) => Object.values(row)[0] as string);\n }\n\n /**\n * Get SQLite tables\n */\n protected async getSQLiteTables(): Promise<string[]> {\n const sql = `\n SELECT name\n FROM sqlite_master\n WHERE type = 'table'\n AND name NOT LIKE 'sqlite_%'\n `;\n const result = await this.select<any>(sql);\n return result.map((row) => row.name);\n }\n\n /**\n * Bind parameters to SQL query\n */\n protected bindParameters(sql: string, bindings: any[] = []): string {\n if (bindings.length === 0) {\n return sql;\n }\n\n // Replace ? placeholders with actual values\n // Note: This is a simple implementation. In production, use parameterized queries\n let index = 0;\n return sql.replace(/\\?/g, () => {\n const value = bindings[index++];\n\n if (value === null || value === undefined) {\n return 'NULL';\n }\n\n if (typeof value === 'string') {\n return `'${value.replace(/'/g, \"''\")}'`;\n }\n\n if (typeof value === 'boolean') {\n return value ? '1' : '0';\n }\n\n if (value instanceof Date) {\n return `'${value.toISOString()}'`;\n }\n\n return String(value);\n });\n }\n\n /**\n * Ensure the adapter is connected\n */\n protected ensureConnected(): void {\n if (!this.connected) {\n throw new Error('Database not connected. Call connect() first.');\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./Query/Builder.cjs`);var t=class{queryLog=[];loggingEnabled=!1;constructor(e,t){this.adapter=e,this.config=t}table(t){return new e.Builder(this.adapter).from(t)}async query(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.query(e,t))}async select(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.select(e,t))}async insert(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.insert(e,t))}async update(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.update(e,t))}async delete(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.delete(e,t))}async beginTransaction(){await this.adapter.beginTransaction()}async commit(){await this.adapter.commit()}async rollback(){await this.adapter.rollback()}async transaction(e){await this.beginTransaction();try{let t=await e(this);return await this.commit(),t}catch(e){throw await this.rollback(),e}}async connect(){await this.adapter.connect()}async disconnect(){await this.adapter.disconnect()}isConnected(){return this.adapter.isConnected()}async getTables(){return this.adapter.getTables()}getAdapter(){return this.adapter}getConfig(){return this.config}enableQueryLog(){this.loggingEnabled=!0}disableQueryLog(){this.loggingEnabled=!1}getQueryLog(){return this.queryLog}flushQueryLog(){this.queryLog=[]}async runQueryWithLogging(e,t,n){if(!this.loggingEnabled)return n();let r=Date.now();try{let i=await n(),a=Date.now()-r;return this.queryLog.push({query:e,bindings:t,time:a}),i}catch(n){let i=Date.now()-r;throw this.queryLog.push({query:e,bindings:t,time:i}),n}}};exports.Connection=t;
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./Query/Builder.cjs`);var t=class{adapter;config;queryLog=[];loggingEnabled=!1;constructor(e,t){this.adapter=e,this.config=t}table(t){return new e.Builder(this.adapter).from(t)}async query(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.query(e,t))}async select(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.select(e,t))}async insert(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.insert(e,t))}async update(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.update(e,t))}async delete(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.delete(e,t))}async beginTransaction(){await this.adapter.beginTransaction()}async commit(){await this.adapter.commit()}async rollback(){await this.adapter.rollback()}async transaction(e){await this.beginTransaction();try{let t=await e(this);return await this.commit(),t}catch(e){throw await this.rollback(),e}}async connect(){await this.adapter.connect()}async disconnect(){await this.adapter.disconnect()}isConnected(){return this.adapter.isConnected()}async getTables(){return this.adapter.getTables()}getAdapter(){return this.adapter}getConfig(){return this.config}enableQueryLog(){this.loggingEnabled=!0}disableQueryLog(){this.loggingEnabled=!1}getQueryLog(){return this.queryLog}flushQueryLog(){this.queryLog=[]}async runQueryWithLogging(e,t,n){if(!this.loggingEnabled)return n();let r=Date.now();try{let i=await n(),a=Date.now()-r;return this.queryLog.push({query:e,bindings:t,time:a}),i}catch(n){let i=Date.now()-r;throw this.queryLog.push({query:e,bindings:t,time:i}),n}}};exports.Connection=t;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Builder as e}from"./Query/Builder.mjs";var t=class{queryLog=[];loggingEnabled=!1;constructor(e,t){this.adapter=e,this.config=t}table(t){return new e(this.adapter).from(t)}async query(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.query(e,t))}async select(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.select(e,t))}async insert(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.insert(e,t))}async update(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.update(e,t))}async delete(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.delete(e,t))}async beginTransaction(){await this.adapter.beginTransaction()}async commit(){await this.adapter.commit()}async rollback(){await this.adapter.rollback()}async transaction(e){await this.beginTransaction();try{let t=await e(this);return await this.commit(),t}catch(e){throw await this.rollback(),e}}async connect(){await this.adapter.connect()}async disconnect(){await this.adapter.disconnect()}isConnected(){return this.adapter.isConnected()}async getTables(){return this.adapter.getTables()}getAdapter(){return this.adapter}getConfig(){return this.config}enableQueryLog(){this.loggingEnabled=!0}disableQueryLog(){this.loggingEnabled=!1}getQueryLog(){return this.queryLog}flushQueryLog(){this.queryLog=[]}async runQueryWithLogging(e,t,n){if(!this.loggingEnabled)return n();let r=Date.now();try{let i=await n(),a=Date.now()-r;return this.queryLog.push({query:e,bindings:t,time:a}),i}catch(n){let i=Date.now()-r;throw this.queryLog.push({query:e,bindings:t,time:i}),n}}};export{t as Connection};
|
|
1
|
+
import{Builder as e}from"./Query/Builder.mjs";var t=class{adapter;config;queryLog=[];loggingEnabled=!1;constructor(e,t){this.adapter=e,this.config=t}table(t){return new e(this.adapter).from(t)}async query(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.query(e,t))}async select(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.select(e,t))}async insert(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.insert(e,t))}async update(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.update(e,t))}async delete(e,t=[]){return this.runQueryWithLogging(e,t,()=>this.adapter.delete(e,t))}async beginTransaction(){await this.adapter.beginTransaction()}async commit(){await this.adapter.commit()}async rollback(){await this.adapter.rollback()}async transaction(e){await this.beginTransaction();try{let t=await e(this);return await this.commit(),t}catch(e){throw await this.rollback(),e}}async connect(){await this.adapter.connect()}async disconnect(){await this.adapter.disconnect()}isConnected(){return this.adapter.isConnected()}async getTables(){return this.adapter.getTables()}getAdapter(){return this.adapter}getConfig(){return this.config}enableQueryLog(){this.loggingEnabled=!0}disableQueryLog(){this.loggingEnabled=!1}getQueryLog(){return this.queryLog}flushQueryLog(){this.queryLog=[]}async runQueryWithLogging(e,t,n){if(!this.loggingEnabled)return n();let r=Date.now();try{let i=await n(),a=Date.now()-r;return this.queryLog.push({query:e,bindings:t,time:a}),i}catch(n){let i=Date.now()-r;throw this.queryLog.push({query:e,bindings:t,time:i}),n}}};export{t as Connection};
|
|
2
2
|
//# sourceMappingURL=Connection.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Connection.mjs","names":[],"sources":["../../src/Database/Connection.ts"],"sourcesContent":["/**\n * Connection Class\n *\n * Represents a database connection\n */\n\nimport { DatabaseAdapter, DatabaseConfig } from './Contracts/DatabaseAdapter';\nimport { Builder } from './Query/Builder';\n\nexport class Connection {\n protected queryLog: Array<{ query: string; bindings: any[]; time: number }> = [];\n protected loggingEnabled: boolean = false;\n\n constructor(\n protected adapter: DatabaseAdapter,\n protected config: DatabaseConfig\n ) {}\n\n /**\n * Get a query builder instance\n */\n table(tableName: string): Builder {\n return new Builder(this.adapter).from(tableName);\n }\n\n /**\n * Execute a raw SQL query\n */\n async query(sql: string, bindings: any[] = []): Promise<any> {\n return this.runQueryWithLogging(sql, bindings, () => this.adapter.query(sql, bindings));\n }\n\n /**\n * Execute a SELECT query\n */\n async select(sql: string, bindings: any[] = []): Promise<any[]> {\n return this.runQueryWithLogging(sql, bindings, () => this.adapter.select(sql, bindings));\n }\n\n /**\n * Execute an INSERT query\n */\n async insert(sql: string, bindings: any[] = []): Promise<any> {\n return this.runQueryWithLogging(sql, bindings, () => this.adapter.insert(sql, bindings));\n }\n\n /**\n * Execute an UPDATE query\n */\n async update(sql: string, bindings: any[] = []): Promise<number> {\n return this.runQueryWithLogging(sql, bindings, () => this.adapter.update(sql, bindings));\n }\n\n /**\n * Execute a DELETE query\n */\n async delete(sql: string, bindings: any[] = []): Promise<number> {\n return this.runQueryWithLogging(sql, bindings, () => this.adapter.delete(sql, bindings));\n }\n\n /**\n * Begin a transaction\n */\n async beginTransaction(): Promise<void> {\n await this.adapter.beginTransaction();\n }\n\n /**\n * Commit a transaction\n */\n async commit(): Promise<void> {\n await this.adapter.commit();\n }\n\n /**\n * Rollback a transaction\n */\n async rollback(): Promise<void> {\n await this.adapter.rollback();\n }\n\n /**\n * Execute a callback within a transaction\n */\n async transaction<T>(callback: (connection: Connection) => Promise<T>): Promise<T> {\n await this.beginTransaction();\n\n try {\n const result = await callback(this);\n await this.commit();\n return result;\n } catch (error) {\n await this.rollback();\n throw error;\n }\n }\n\n /**\n * Connect to the database\n */\n async connect(): Promise<void> {\n await this.adapter.connect();\n }\n\n /**\n * Disconnect from the database\n */\n async disconnect(): Promise<void> {\n await this.adapter.disconnect();\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.adapter.isConnected();\n }\n\n /**\n * Get all table names in the connected database\n */\n async getTables(): Promise<string[]> {\n return this.adapter.getTables();\n }\n\n /**\n * Get the underlying adapter\n */\n getAdapter(): DatabaseAdapter {\n return this.adapter;\n }\n\n /**\n * Get the configuration\n */\n getConfig(): DatabaseConfig {\n return this.config;\n }\n\n /**\n * Enable query logging\n */\n enableQueryLog(): void {\n this.loggingEnabled = true;\n }\n\n /**\n * Disable query logging\n */\n disableQueryLog(): void {\n this.loggingEnabled = false;\n }\n\n /**\n * Get the query log\n */\n getQueryLog(): Array<{ query: string; bindings: any[]; time: number }> {\n return this.queryLog;\n }\n\n /**\n * Clear the query log\n */\n flushQueryLog(): void {\n this.queryLog = [];\n }\n\n /**\n * Run a query with logging\n */\n protected async runQueryWithLogging<T>(query: string, bindings: any[], callback: () => Promise<T>): Promise<T> {\n if (!this.loggingEnabled) {\n return callback();\n }\n\n const start = Date.now();\n\n try {\n const result = await callback();\n const time = Date.now() - start;\n\n this.queryLog.push({ query, bindings, time });\n\n return result;\n } catch (error) {\n const time = Date.now() - start;\n this.queryLog.push({ query, bindings, time });\n throw error;\n }\n }\n}\n"],"mappings":"8CASA,IAAa,EAAb,KAAwB,
|
|
1
|
+
{"version":3,"file":"Connection.mjs","names":[],"sources":["../../src/Database/Connection.ts"],"sourcesContent":["/**\n * Connection Class\n *\n * Represents a database connection\n */\n\nimport { DatabaseAdapter, DatabaseConfig } from './Contracts/DatabaseAdapter';\nimport { Builder } from './Query/Builder';\n\nexport class Connection {\n protected queryLog: Array<{ query: string; bindings: any[]; time: number }> = [];\n protected loggingEnabled: boolean = false;\n\n constructor(\n protected adapter: DatabaseAdapter,\n protected config: DatabaseConfig\n ) {}\n\n /**\n * Get a query builder instance\n */\n table(tableName: string): Builder {\n return new Builder(this.adapter).from(tableName);\n }\n\n /**\n * Execute a raw SQL query\n */\n async query(sql: string, bindings: any[] = []): Promise<any> {\n return this.runQueryWithLogging(sql, bindings, () => this.adapter.query(sql, bindings));\n }\n\n /**\n * Execute a SELECT query\n */\n async select(sql: string, bindings: any[] = []): Promise<any[]> {\n return this.runQueryWithLogging(sql, bindings, () => this.adapter.select(sql, bindings));\n }\n\n /**\n * Execute an INSERT query\n */\n async insert(sql: string, bindings: any[] = []): Promise<any> {\n return this.runQueryWithLogging(sql, bindings, () => this.adapter.insert(sql, bindings));\n }\n\n /**\n * Execute an UPDATE query\n */\n async update(sql: string, bindings: any[] = []): Promise<number> {\n return this.runQueryWithLogging(sql, bindings, () => this.adapter.update(sql, bindings));\n }\n\n /**\n * Execute a DELETE query\n */\n async delete(sql: string, bindings: any[] = []): Promise<number> {\n return this.runQueryWithLogging(sql, bindings, () => this.adapter.delete(sql, bindings));\n }\n\n /**\n * Begin a transaction\n */\n async beginTransaction(): Promise<void> {\n await this.adapter.beginTransaction();\n }\n\n /**\n * Commit a transaction\n */\n async commit(): Promise<void> {\n await this.adapter.commit();\n }\n\n /**\n * Rollback a transaction\n */\n async rollback(): Promise<void> {\n await this.adapter.rollback();\n }\n\n /**\n * Execute a callback within a transaction\n */\n async transaction<T>(callback: (connection: Connection) => Promise<T>): Promise<T> {\n await this.beginTransaction();\n\n try {\n const result = await callback(this);\n await this.commit();\n return result;\n } catch (error) {\n await this.rollback();\n throw error;\n }\n }\n\n /**\n * Connect to the database\n */\n async connect(): Promise<void> {\n await this.adapter.connect();\n }\n\n /**\n * Disconnect from the database\n */\n async disconnect(): Promise<void> {\n await this.adapter.disconnect();\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.adapter.isConnected();\n }\n\n /**\n * Get all table names in the connected database\n */\n async getTables(): Promise<string[]> {\n return this.adapter.getTables();\n }\n\n /**\n * Get the underlying adapter\n */\n getAdapter(): DatabaseAdapter {\n return this.adapter;\n }\n\n /**\n * Get the configuration\n */\n getConfig(): DatabaseConfig {\n return this.config;\n }\n\n /**\n * Enable query logging\n */\n enableQueryLog(): void {\n this.loggingEnabled = true;\n }\n\n /**\n * Disable query logging\n */\n disableQueryLog(): void {\n this.loggingEnabled = false;\n }\n\n /**\n * Get the query log\n */\n getQueryLog(): Array<{ query: string; bindings: any[]; time: number }> {\n return this.queryLog;\n }\n\n /**\n * Clear the query log\n */\n flushQueryLog(): void {\n this.queryLog = [];\n }\n\n /**\n * Run a query with logging\n */\n protected async runQueryWithLogging<T>(query: string, bindings: any[], callback: () => Promise<T>): Promise<T> {\n if (!this.loggingEnabled) {\n return callback();\n }\n\n const start = Date.now();\n\n try {\n const result = await callback();\n const time = Date.now() - start;\n\n this.queryLog.push({ query, bindings, time });\n\n return result;\n } catch (error) {\n const time = Date.now() - start;\n this.queryLog.push({ query, bindings, time });\n throw error;\n }\n }\n}\n"],"mappings":"8CASA,IAAa,EAAb,KAAwB,CAKV,QACA,OALZ,SAA8E,EAAE,CAChF,eAAoC,GAEpC,YACE,EACA,EACA,CAFU,KAAA,QAAA,EACA,KAAA,OAAA,EAMZ,MAAM,EAA4B,CAChC,OAAO,IAAI,EAAQ,KAAK,QAAQ,CAAC,KAAK,EAAU,CAMlD,MAAM,MAAM,EAAa,EAAkB,EAAE,CAAgB,CAC3D,OAAO,KAAK,oBAAoB,EAAK,MAAgB,KAAK,QAAQ,MAAM,EAAK,EAAS,CAAC,CAMzF,MAAM,OAAO,EAAa,EAAkB,EAAE,CAAkB,CAC9D,OAAO,KAAK,oBAAoB,EAAK,MAAgB,KAAK,QAAQ,OAAO,EAAK,EAAS,CAAC,CAM1F,MAAM,OAAO,EAAa,EAAkB,EAAE,CAAgB,CAC5D,OAAO,KAAK,oBAAoB,EAAK,MAAgB,KAAK,QAAQ,OAAO,EAAK,EAAS,CAAC,CAM1F,MAAM,OAAO,EAAa,EAAkB,EAAE,CAAmB,CAC/D,OAAO,KAAK,oBAAoB,EAAK,MAAgB,KAAK,QAAQ,OAAO,EAAK,EAAS,CAAC,CAM1F,MAAM,OAAO,EAAa,EAAkB,EAAE,CAAmB,CAC/D,OAAO,KAAK,oBAAoB,EAAK,MAAgB,KAAK,QAAQ,OAAO,EAAK,EAAS,CAAC,CAM1F,MAAM,kBAAkC,CACtC,MAAM,KAAK,QAAQ,kBAAkB,CAMvC,MAAM,QAAwB,CAC5B,MAAM,KAAK,QAAQ,QAAQ,CAM7B,MAAM,UAA0B,CAC9B,MAAM,KAAK,QAAQ,UAAU,CAM/B,MAAM,YAAe,EAA8D,CACjF,MAAM,KAAK,kBAAkB,CAE7B,GAAI,CACF,IAAM,EAAS,MAAM,EAAS,KAAK,CAEnC,OADA,MAAM,KAAK,QAAQ,CACZ,QACA,EAAO,CAEd,MADA,MAAM,KAAK,UAAU,CACf,GAOV,MAAM,SAAyB,CAC7B,MAAM,KAAK,QAAQ,SAAS,CAM9B,MAAM,YAA4B,CAChC,MAAM,KAAK,QAAQ,YAAY,CAMjC,aAAuB,CACrB,OAAO,KAAK,QAAQ,aAAa,CAMnC,MAAM,WAA+B,CACnC,OAAO,KAAK,QAAQ,WAAW,CAMjC,YAA8B,CAC5B,OAAO,KAAK,QAMd,WAA4B,CAC1B,OAAO,KAAK,OAMd,gBAAuB,CACrB,KAAK,eAAiB,GAMxB,iBAAwB,CACtB,KAAK,eAAiB,GAMxB,aAAuE,CACrE,OAAO,KAAK,SAMd,eAAsB,CACpB,KAAK,SAAW,EAAE,CAMpB,MAAgB,oBAAuB,EAAe,EAAiB,EAAwC,CAC7G,GAAI,CAAC,KAAK,eACR,OAAO,GAAU,CAGnB,IAAM,EAAQ,KAAK,KAAK,CAExB,GAAI,CACF,IAAM,EAAS,MAAM,GAAU,CACzB,EAAO,KAAK,KAAK,CAAG,EAI1B,OAFA,KAAK,SAAS,KAAK,CAAE,QAAO,WAAU,OAAM,CAAC,CAEtC,QACA,EAAO,CACd,IAAM,EAAO,KAAK,KAAK,CAAG,EAE1B,MADA,KAAK,SAAS,KAAK,CAAE,QAAO,WAAU,OAAM,CAAC,CACvC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./Connection.cjs`);var t=class{connections=new Map;adapterFactories=new Map;constructor(e){this.config=e}registerAdapter(e,t){this.adapterFactories.set(e,t)}connection(e){let t=e||this.config.default;if(this.connections.has(t))return this.connections.get(t);let n=this.createConnection(t);return this.connections.set(t,n),n}createConnection(t){let n=this.config.connections[t];if(!n)throw Error(`Database connection [${t}] not configured.`);let r=this.adapterFactories.get(n.adapter);if(!r)throw Error(`Database adapter [${n.adapter}] not registered.`);return new e.Connection(r(n),n)}async disconnect(e){let t=e||this.config.default,n=this.connections.get(t);n&&(await n.disconnect(),this.connections.delete(t))}async disconnectAll(){let e=Array.from(this.connections.keys()).map(e=>this.disconnect(e));await Promise.all(e)}async purge(e){await this.disconnect(e)}getDefaultConnection(){return this.config.default}setDefaultConnection(e){this.config.default=e}getConnections(){return Object.keys(this.config.connections)}extend(e,t){this[e]=t}};exports.DatabaseManager=t;
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./Connection.cjs`);var t=class{config;connections=new Map;adapterFactories=new Map;constructor(e){this.config=e}registerAdapter(e,t){this.adapterFactories.set(e,t)}connection(e){let t=e||this.config.default;if(this.connections.has(t))return this.connections.get(t);let n=this.createConnection(t);return this.connections.set(t,n),n}createConnection(t){let n=this.config.connections[t];if(!n)throw Error(`Database connection [${t}] not configured.`);let r=this.adapterFactories.get(n.adapter);if(!r)throw Error(`Database adapter [${n.adapter}] not registered.`);return new e.Connection(r(n),n)}async disconnect(e){let t=e||this.config.default,n=this.connections.get(t);n&&(await n.disconnect(),this.connections.delete(t))}async disconnectAll(){let e=Array.from(this.connections.keys()).map(e=>this.disconnect(e));await Promise.all(e)}async purge(e){await this.disconnect(e)}getDefaultConnection(){return this.config.default}setDefaultConnection(e){this.config.default=e}getConnections(){return Object.keys(this.config.connections)}extend(e,t){this[e]=t}};exports.DatabaseManager=t;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Connection as e}from"./Connection.mjs";var t=class{connections=new Map;adapterFactories=new Map;constructor(e){this.config=e}registerAdapter(e,t){this.adapterFactories.set(e,t)}connection(e){let t=e||this.config.default;if(this.connections.has(t))return this.connections.get(t);let n=this.createConnection(t);return this.connections.set(t,n),n}createConnection(t){let n=this.config.connections[t];if(!n)throw Error(`Database connection [${t}] not configured.`);let r=this.adapterFactories.get(n.adapter);if(!r)throw Error(`Database adapter [${n.adapter}] not registered.`);return new e(r(n),n)}async disconnect(e){let t=e||this.config.default,n=this.connections.get(t);n&&(await n.disconnect(),this.connections.delete(t))}async disconnectAll(){let e=Array.from(this.connections.keys()).map(e=>this.disconnect(e));await Promise.all(e)}async purge(e){await this.disconnect(e)}getDefaultConnection(){return this.config.default}setDefaultConnection(e){this.config.default=e}getConnections(){return Object.keys(this.config.connections)}extend(e,t){this[e]=t}};export{t as DatabaseManager};
|
|
1
|
+
import{Connection as e}from"./Connection.mjs";var t=class{config;connections=new Map;adapterFactories=new Map;constructor(e){this.config=e}registerAdapter(e,t){this.adapterFactories.set(e,t)}connection(e){let t=e||this.config.default;if(this.connections.has(t))return this.connections.get(t);let n=this.createConnection(t);return this.connections.set(t,n),n}createConnection(t){let n=this.config.connections[t];if(!n)throw Error(`Database connection [${t}] not configured.`);let r=this.adapterFactories.get(n.adapter);if(!r)throw Error(`Database adapter [${n.adapter}] not registered.`);return new e(r(n),n)}async disconnect(e){let t=e||this.config.default,n=this.connections.get(t);n&&(await n.disconnect(),this.connections.delete(t))}async disconnectAll(){let e=Array.from(this.connections.keys()).map(e=>this.disconnect(e));await Promise.all(e)}async purge(e){await this.disconnect(e)}getDefaultConnection(){return this.config.default}setDefaultConnection(e){this.config.default=e}getConnections(){return Object.keys(this.config.connections)}extend(e,t){this[e]=t}};export{t as DatabaseManager};
|
|
2
2
|
//# sourceMappingURL=DatabaseManager.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatabaseManager.mjs","names":[],"sources":["../../src/Database/DatabaseManager.ts"],"sourcesContent":["/**\n * DatabaseManager Class\n *\n * Manages multiple database connections\n */\n\nimport { Connection } from './Connection';\nimport { DatabaseAdapter, DatabaseConfig } from './Contracts/DatabaseAdapter';\n\nexport interface DatabaseConnectionConfig extends DatabaseConfig {\n adapter: string;\n}\n\nexport interface DatabaseManagerConfig {\n default: string;\n connections: Record<string, DatabaseConnectionConfig>;\n}\n\nexport class DatabaseManager {\n protected connections: Map<string, Connection> = new Map();\n protected adapterFactories: Map<string, (config: DatabaseConfig) => DatabaseAdapter> = new Map();\n\n constructor(protected config: DatabaseManagerConfig) {}\n\n /**\n * Register an adapter factory\n */\n registerAdapter(name: string, factory: (config: DatabaseConfig) => DatabaseAdapter): void {\n this.adapterFactories.set(name, factory);\n }\n\n /**\n * Get a database connection\n */\n connection(name?: string): Connection {\n const connectionName = name || this.config.default;\n\n // Return existing connection if available\n if (this.connections.has(connectionName)) {\n return this.connections.get(connectionName)!;\n }\n\n // Create new connection\n const connection = this.createConnection(connectionName);\n this.connections.set(connectionName, connection);\n\n return connection;\n }\n\n /**\n * Create a new connection\n */\n protected createConnection(name: string): Connection {\n const config = this.config.connections[name];\n\n if (!config) {\n throw new Error(`Database connection [${name}] not configured.`);\n }\n\n const adapterFactory = this.adapterFactories.get(config.adapter);\n\n if (!adapterFactory) {\n throw new Error(`Database adapter [${config.adapter}] not registered.`);\n }\n\n const adapter = adapterFactory(config);\n return new Connection(adapter, config);\n }\n\n /**\n * Disconnect a connection\n */\n async disconnect(name?: string): Promise<void> {\n const connectionName = name || this.config.default;\n const connection = this.connections.get(connectionName);\n\n if (connection) {\n await connection.disconnect();\n this.connections.delete(connectionName);\n }\n }\n\n /**\n * Disconnect all connections\n */\n async disconnectAll(): Promise<void> {\n const promises = Array.from(this.connections.keys()).map((name) => this.disconnect(name));\n await Promise.all(promises);\n }\n\n /**\n * Purge a connection (disconnect and remove from cache)\n */\n async purge(name?: string): Promise<void> {\n await this.disconnect(name);\n }\n\n /**\n * Get the default connection name\n */\n getDefaultConnection(): string {\n return this.config.default;\n }\n\n /**\n * Set the default connection name\n */\n setDefaultConnection(name: string): void {\n this.config.default = name;\n }\n\n /**\n * Get all connection names\n */\n getConnections(): string[] {\n return Object.keys(this.config.connections);\n }\n\n /**\n * Extend the database manager with a macro\n */\n extend(name: string, resolver: () => any): void {\n (this as any)[name] = resolver;\n }\n}\n"],"mappings":"8CAkBA,IAAa,EAAb,KAA6B,
|
|
1
|
+
{"version":3,"file":"DatabaseManager.mjs","names":[],"sources":["../../src/Database/DatabaseManager.ts"],"sourcesContent":["/**\n * DatabaseManager Class\n *\n * Manages multiple database connections\n */\n\nimport { Connection } from './Connection';\nimport { DatabaseAdapter, DatabaseConfig } from './Contracts/DatabaseAdapter';\n\nexport interface DatabaseConnectionConfig extends DatabaseConfig {\n adapter: string;\n}\n\nexport interface DatabaseManagerConfig {\n default: string;\n connections: Record<string, DatabaseConnectionConfig>;\n}\n\nexport class DatabaseManager {\n protected connections: Map<string, Connection> = new Map();\n protected adapterFactories: Map<string, (config: DatabaseConfig) => DatabaseAdapter> = new Map();\n\n constructor(protected config: DatabaseManagerConfig) {}\n\n /**\n * Register an adapter factory\n */\n registerAdapter(name: string, factory: (config: DatabaseConfig) => DatabaseAdapter): void {\n this.adapterFactories.set(name, factory);\n }\n\n /**\n * Get a database connection\n */\n connection(name?: string): Connection {\n const connectionName = name || this.config.default;\n\n // Return existing connection if available\n if (this.connections.has(connectionName)) {\n return this.connections.get(connectionName)!;\n }\n\n // Create new connection\n const connection = this.createConnection(connectionName);\n this.connections.set(connectionName, connection);\n\n return connection;\n }\n\n /**\n * Create a new connection\n */\n protected createConnection(name: string): Connection {\n const config = this.config.connections[name];\n\n if (!config) {\n throw new Error(`Database connection [${name}] not configured.`);\n }\n\n const adapterFactory = this.adapterFactories.get(config.adapter);\n\n if (!adapterFactory) {\n throw new Error(`Database adapter [${config.adapter}] not registered.`);\n }\n\n const adapter = adapterFactory(config);\n return new Connection(adapter, config);\n }\n\n /**\n * Disconnect a connection\n */\n async disconnect(name?: string): Promise<void> {\n const connectionName = name || this.config.default;\n const connection = this.connections.get(connectionName);\n\n if (connection) {\n await connection.disconnect();\n this.connections.delete(connectionName);\n }\n }\n\n /**\n * Disconnect all connections\n */\n async disconnectAll(): Promise<void> {\n const promises = Array.from(this.connections.keys()).map((name) => this.disconnect(name));\n await Promise.all(promises);\n }\n\n /**\n * Purge a connection (disconnect and remove from cache)\n */\n async purge(name?: string): Promise<void> {\n await this.disconnect(name);\n }\n\n /**\n * Get the default connection name\n */\n getDefaultConnection(): string {\n return this.config.default;\n }\n\n /**\n * Set the default connection name\n */\n setDefaultConnection(name: string): void {\n this.config.default = name;\n }\n\n /**\n * Get all connection names\n */\n getConnections(): string[] {\n return Object.keys(this.config.connections);\n }\n\n /**\n * Extend the database manager with a macro\n */\n extend(name: string, resolver: () => any): void {\n (this as any)[name] = resolver;\n }\n}\n"],"mappings":"8CAkBA,IAAa,EAAb,KAA6B,CAIL,OAHtB,YAAiD,IAAI,IACrD,iBAAuF,IAAI,IAE3F,YAAY,EAAyC,CAA/B,KAAA,OAAA,EAKtB,gBAAgB,EAAc,EAA4D,CACxF,KAAK,iBAAiB,IAAI,EAAM,EAAQ,CAM1C,WAAW,EAA2B,CACpC,IAAM,EAAiB,GAAQ,KAAK,OAAO,QAG3C,GAAI,KAAK,YAAY,IAAI,EAAe,CACtC,OAAO,KAAK,YAAY,IAAI,EAAe,CAI7C,IAAM,EAAa,KAAK,iBAAiB,EAAe,CAGxD,OAFA,KAAK,YAAY,IAAI,EAAgB,EAAW,CAEzC,EAMT,iBAA2B,EAA0B,CACnD,IAAM,EAAS,KAAK,OAAO,YAAY,GAEvC,GAAI,CAAC,EACH,MAAU,MAAM,wBAAwB,EAAK,mBAAmB,CAGlE,IAAM,EAAiB,KAAK,iBAAiB,IAAI,EAAO,QAAQ,CAEhE,GAAI,CAAC,EACH,MAAU,MAAM,qBAAqB,EAAO,QAAQ,mBAAmB,CAIzE,OAAO,IAAI,EADK,EAAe,EACF,CAAE,EAAO,CAMxC,MAAM,WAAW,EAA8B,CAC7C,IAAM,EAAiB,GAAQ,KAAK,OAAO,QACrC,EAAa,KAAK,YAAY,IAAI,EAAe,CAEnD,IACF,MAAM,EAAW,YAAY,CAC7B,KAAK,YAAY,OAAO,EAAe,EAO3C,MAAM,eAA+B,CACnC,IAAM,EAAW,MAAM,KAAK,KAAK,YAAY,MAAM,CAAC,CAAC,IAAK,GAAS,KAAK,WAAW,EAAK,CAAC,CACzF,MAAM,QAAQ,IAAI,EAAS,CAM7B,MAAM,MAAM,EAA8B,CACxC,MAAM,KAAK,WAAW,EAAK,CAM7B,sBAA+B,CAC7B,OAAO,KAAK,OAAO,QAMrB,qBAAqB,EAAoB,CACvC,KAAK,OAAO,QAAU,EAMxB,gBAA2B,CACzB,OAAO,OAAO,KAAK,KAAK,OAAO,YAAY,CAM7C,OAAO,EAAc,EAA2B,CAC9C,KAAc,GAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ensemble.mjs","names":[],"sources":["../../../src/Database/Ensemble/Ensemble.ts"],"sourcesContent":["/**\n * Ensemble Class\n *\n * Base class for Ensemble models with ActiveRecord pattern\n * In Orchestr, your data models are called Ensembles - groups that work in harmony\n */\n\nimport { Connection } from '@/Database/Connection';\nimport { DatabaseManager } from '@/Database/DatabaseManager';\nimport { HasRelationshipsMixin } from './Concerns/HasRelationships';\nimport { EnsembleBuilder } from './EnsembleBuilder';\nimport {\n ModelRetrieved,\n ModelCreating,\n ModelCreated,\n ModelUpdating,\n ModelUpdated,\n ModelSaving,\n ModelSaved,\n ModelDeleting,\n ModelDeleted,\n} from './Events';\n\nexport abstract class Ensemble extends HasRelationshipsMixin {\n /**\n * The connection resolver instance\n */\n protected static connectionResolver: DatabaseManager;\n\n /**\n * The table associated with the model\n */\n protected table?: string;\n\n /**\n * The primary key for the model\n */\n protected primaryKey: string = 'id';\n\n /**\n * Indicates if the IDs are auto-incrementing\n */\n protected incrementing: boolean = true;\n\n /**\n * The data type of the primary key\n */\n protected keyType: string = 'int';\n\n /**\n * The attributes that are mass assignable (instance property).\n *\n * Subclasses may also declare `static fillable: string[]` instead.\n * Static properties are resolved at construction time so they are safe\n * to use even when a subclass constructor has not yet run its own field\n * initialisers.\n */\n protected fillable: string[] = [];\n\n /**\n * The attributes that aren't mass assignable (instance property).\n *\n * Subclasses may also declare `static guarded: string[]` instead of\n * (or in addition to) the instance property.\n */\n protected guarded: string[] = ['*'];\n\n /**\n * Static fillable list. Subclasses that declare `static fillable` here\n * will have those attributes made mass-assignable without needing a\n * constructor override.\n */\n static fillable?: string[];\n\n /**\n * Static guarded list. Subclasses that declare `static guarded` here\n * will have those attributes protected from mass assignment without\n * needing a constructor override.\n */\n static guarded?: string[];\n\n /**\n * The attributes that should be hidden for serialization\n */\n protected hidden: string[] = [];\n\n /**\n * The attributes that should be visible for serialization\n */\n protected visible: string[] = [];\n\n /**\n * The accessors to append to the model's array form\n */\n protected appends: string[] = [];\n\n /**\n * The attributes that should be cast\n */\n protected casts: Record<string, string> = {};\n\n /**\n * Indicates if the model should be timestamped\n */\n protected timestamps: boolean = true;\n\n /**\n * The name of the \"created at\" column\n */\n protected static CREATED_AT: string = 'created_at';\n\n /**\n * The name of the \"updated at\" column\n */\n protected static UPDATED_AT: string = 'updated_at';\n\n /**\n * The name of the \"deleted at\" column (for soft deletes)\n */\n protected static DELETED_AT: string = 'deleted_at';\n\n /**\n * The model's attributes\n */\n protected attributes: Record<string, any> = {};\n\n /**\n * The model's original attributes\n */\n protected original: Record<string, any> = {};\n\n /**\n * Indicates if the model exists in the database\n */\n public exists: boolean = false;\n\n /**\n * Indicates if the model was inserted during this request\n */\n public wasRecentlyCreated: boolean = false;\n\n /**\n * The connection name for the model\n */\n protected connection?: string;\n\n /**\n * Enable dynamic relationship access (user.posts instead of user.posts().get())\n * Set to true to enable PHP-like __get behavior for relationships\n */\n protected dynamicRelations: boolean = false;\n\n /**\n * Create a new Eloquent model instance\n */\n constructor(attributes: Record<string, any> = {}, fromDatabase: boolean = false) {\n super();\n if (fromDatabase) {\n // When hydrating from database, set all attributes directly\n this.setRawAttributes(attributes);\n } else {\n // When creating manually, respect fillable/guarded\n this.fill(attributes);\n }\n }\n\n /**\n * Fill the model with an array of attributes\n */\n fill(attributes: Record<string, any>): this {\n for (const [key, value] of Object.entries(attributes)) {\n if (this.isFillable(key)) {\n this.setAttribute(key, value);\n }\n }\n return this;\n }\n\n /**\n * Set a given attribute on the model\n */\n setAttribute(key: string, value: any): this {\n // Check for mutator\n const mutator = `set${this.studly(key)}Attribute`;\n if (typeof (this as any)[mutator] === 'function') {\n (this as any)[mutator](value);\n return this;\n }\n\n this.attributes[key] = value;\n return this;\n }\n\n /**\n * Set the array of model attributes (bypasses fillable/guarded)\n * Used when hydrating from database\n */\n setRawAttributes(attributes: Record<string, any>): this {\n this.attributes = attributes;\n return this;\n }\n\n /**\n * Get an attribute from the model\n */\n getAttribute(key: string): any {\n if (!key) {\n return undefined;\n }\n\n // Check if we have an accessor\n const accessor = `get${this.studly(key)}Attribute`;\n if (typeof (this as any)[accessor] === 'function') {\n return (this as any)[accessor]();\n }\n\n // Get the attribute value\n const value = this.attributes[key];\n\n // Cast the attribute if needed\n if (this.hasCast(key)) {\n return this.castAttribute(key, value);\n }\n\n return value;\n }\n\n /**\n * Determine if the given attribute may be mass assigned.\n *\n * Resolution order for `fillable` and `guarded`:\n * 1. Static property on the concrete class (e.g. `static fillable = [...]`)\n * – safe because static properties exist before any constructor runs.\n * 2. Instance property (`this.fillable` / `this.guarded`) – populated either\n * by Ensemble's own field initialiser or by a subclass constructor\n * workaround that calls `this.fill()` a second time after `super()`.\n *\n * If the concrete class defines `static fillable`, it takes full precedence\n * over the instance property (matching Laravel's behaviour where a non-empty\n * fillable list is the authoritative allow-list).\n */\n protected isFillable(key: string): boolean {\n const ctor = this.constructor as typeof Ensemble;\n\n // Prefer static fillable if the subclass has defined one on itself\n // (not inherited – check own property to avoid reading Ensemble's\n // `undefined` declaration as a truthy value).\n const staticFillable: string[] | undefined = Object.prototype.hasOwnProperty.call(ctor, 'fillable')\n ? ctor.fillable\n : undefined;\n\n const effectiveFillable: string[] = staticFillable ?? this.fillable;\n\n if (effectiveFillable.length > 0) {\n return effectiveFillable.includes(key);\n }\n\n // No fillable list – fall back to guarded logic.\n const staticGuarded: string[] | undefined = Object.prototype.hasOwnProperty.call(ctor, 'guarded')\n ? ctor.guarded\n : undefined;\n\n const effectiveGuarded: string[] = staticGuarded ?? this.guarded;\n\n if (effectiveGuarded.length > 0 && !effectiveGuarded.includes('*')) {\n return !effectiveGuarded.includes(key);\n }\n\n return effectiveGuarded[0] !== '*';\n }\n\n /**\n * Determine if a get mutator exists for an attribute\n */\n protected hasGetMutator(key: string): boolean {\n return typeof (this as any)[`get${this.studly(key)}Attribute`] === 'function';\n }\n\n /**\n * Determine if a set mutator exists for an attribute\n */\n protected hasSetMutator(key: string): boolean {\n return typeof (this as any)[`set${this.studly(key)}Attribute`] === 'function';\n }\n\n /**\n * Determine if a cast is defined for an attribute\n */\n protected hasCast(key: string): boolean {\n return key in this.casts;\n }\n\n /**\n * Cast an attribute to a native PHP type\n */\n protected castAttribute(key: string, value: any): any {\n if (value === null) {\n return value;\n }\n\n const castType = this.casts[key];\n\n switch (castType) {\n case 'int':\n case 'integer':\n return parseInt(value);\n case 'real':\n case 'float':\n case 'double':\n return parseFloat(value);\n case 'string':\n return String(value);\n case 'bool':\n case 'boolean':\n return Boolean(value);\n case 'object':\n return typeof value === 'string' ? JSON.parse(value) : value;\n case 'array':\n case 'json':\n return typeof value === 'string' ? JSON.parse(value) : value;\n case 'collection':\n return typeof value === 'string' ? JSON.parse(value) : value;\n case 'date':\n case 'datetime':\n case 'timestamp':\n return value instanceof Date ? value : new Date(value);\n default:\n return value;\n }\n }\n\n /**\n * Convert the model to a plain object\n */\n toObject(): Record<string, any> {\n const attributes: Record<string, any> = {};\n\n for (const key of Object.keys(this.attributes)) {\n if (this.isVisible(key)) {\n attributes[key] = this.getAttribute(key);\n }\n }\n\n // Add appended accessors\n for (const key of this.appends) {\n attributes[key] = this.getAttribute(key);\n }\n\n // Add loaded relationships\n for (const [key, value] of Object.entries(this.relations)) {\n if (Array.isArray(value)) {\n attributes[key] = value.map((model) => model.toObject());\n } else if (value && typeof value.toObject === 'function') {\n attributes[key] = value.toObject();\n } else {\n attributes[key] = value;\n }\n }\n\n return attributes;\n }\n\n /**\n * Convert the model to JSON\n */\n toJSON(): Record<string, any> {\n return this.toObject();\n }\n\n /**\n * Determine if an attribute is visible\n */\n protected isVisible(key: string): boolean {\n if (this.visible.length > 0) {\n return this.visible.includes(key);\n }\n\n return !this.hidden.includes(key);\n }\n\n /**\n * Get the table associated with the model\n */\n getTable(): string {\n if (this.table) {\n return this.table;\n }\n\n // Convert class name to snake_case plural\n // e.g., User -> users, BlogPost -> blog_posts\n const className = this.constructor.name;\n return this.pluralize(this.snake(className));\n }\n\n /**\n * Get the primary key for the model\n */\n getKeyName(): string {\n return this.primaryKey;\n }\n\n /**\n * Get the value of the model's primary key\n */\n getKey(): any {\n return this.getAttribute(this.getKeyName());\n }\n\n /**\n * Set the connection resolver instance\n */\n static setConnectionResolver(resolver: DatabaseManager): void {\n (Ensemble as any).connectionResolver = resolver;\n }\n\n /**\n * Get the database connection for the model\n */\n getConnection(): Connection {\n return (this.constructor as typeof Ensemble).connectionResolver.connection(this.connection);\n }\n\n /**\n * Begin querying the model\n */\n static query<T extends Ensemble>(this: { new (): T }): EnsembleBuilder<T> {\n const instance = new this();\n return new EnsembleBuilder<T>(instance.getConnection().getAdapter(), instance);\n }\n\n /**\n * Get all of the models from the database\n */\n static async all<T extends Ensemble>(this: { new (): T }, columns: string[] = ['*']): Promise<T[]> {\n return (this as any)\n .query()\n .select(...columns)\n .get();\n }\n\n /**\n * Find a model by its primary key\n */\n static async find<T extends Ensemble>(this: { new (): T }, id: any, columns: string[] = ['*']): Promise<T | null> {\n return (this as any)\n .query()\n .select(...columns)\n .find(id);\n }\n\n /**\n * Find a model by its primary key or throw an exception\n */\n static async findOrFail<T extends Ensemble>(this: { new (): T }, id: any, columns: string[] = ['*']): Promise<T> {\n const model = await (this as any).find(id, columns);\n if (!model) {\n throw new Error(`Ensemble not found with id: ${id}`);\n }\n return model;\n }\n\n /**\n * Find multiple models by their primary keys\n */\n static async findMany<T extends Ensemble>(this: { new (): T }, ids: any[], columns: string[] = ['*']): Promise<T[]> {\n const instance = new this();\n return (this as any)\n .query()\n .select(...columns)\n .whereIn(instance.getKeyName(), ids)\n .get();\n }\n\n /**\n * Create a new instance and save it to the database\n */\n static async create<T extends Ensemble>(\n this: { new (attrs?: Record<string, any>): T },\n attributes: Record<string, any>\n ): Promise<T> {\n const instance = new this(attributes);\n await instance.save();\n return instance;\n }\n\n /**\n * Update or create a model matching the attributes\n */\n static async updateOrCreate<T extends Ensemble>(\n this: { new (): T },\n attributes: Record<string, any>,\n values: Record<string, any> = {}\n ): Promise<T> {\n const instance = await (this as any).query().where(attributes).first();\n\n if (instance) {\n instance.fill(values);\n await instance.save();\n return instance;\n }\n\n return (this as any).create({ ...attributes, ...values });\n }\n\n /**\n * Save the model to the database\n */\n async save(): Promise<boolean> {\n // Fire saving event\n if ((await this.fireModelEvent('saving')) === false) {\n return false;\n }\n\n if (this.exists) {\n return this.performUpdate();\n }\n\n return this.performInsert();\n }\n\n /**\n * Perform a model insert operation\n */\n protected async performInsert(): Promise<boolean> {\n // Fire creating event\n if ((await this.fireModelEvent('creating')) === false) {\n return false;\n }\n\n const attributes = this.getAttributesForInsert();\n\n if (this.timestamps) {\n this.updateTimestamps();\n }\n\n const connection = this.getConnection();\n const table = this.getTable();\n\n const id = await connection.table(table).insertGetId(attributes);\n\n if (this.incrementing) {\n this.setAttribute(this.getKeyName(), id);\n }\n\n this.exists = true;\n this.wasRecentlyCreated = true;\n this.syncOriginal();\n\n // Fire created event\n await this.fireModelEvent('created');\n\n // Fire saved event\n await this.fireModelEvent('saved');\n\n return true;\n }\n\n /**\n * Perform a model update operation\n */\n protected async performUpdate(): Promise<boolean> {\n const dirty = this.getDirty();\n\n if (Object.keys(dirty).length === 0) {\n return true;\n }\n\n // Fire updating event\n if ((await this.fireModelEvent('updating')) === false) {\n return false;\n }\n\n if (this.timestamps) {\n this.updateTimestamps();\n }\n\n const connection = this.getConnection();\n const table = this.getTable();\n\n await connection.table(table).where(this.getKeyName(), '=', this.getKey()).update(dirty);\n\n this.syncOriginal();\n\n // Fire updated event\n await this.fireModelEvent('updated');\n\n // Fire saved event\n await this.fireModelEvent('saved');\n\n return true;\n }\n\n /**\n * Update the model's timestamps\n */\n protected updateTimestamps(): void {\n const time = new Date();\n\n const updatedAtColumn = (this.constructor as typeof Ensemble).UPDATED_AT;\n if (updatedAtColumn && !this.isDirty(updatedAtColumn)) {\n this.setAttribute(updatedAtColumn, time);\n }\n\n const createdAtColumn = (this.constructor as typeof Ensemble).CREATED_AT;\n if (!this.exists && createdAtColumn && !this.isDirty(createdAtColumn)) {\n this.setAttribute(createdAtColumn, time);\n }\n }\n\n /**\n * Get the attributes that have been changed\n */\n getDirty(): Record<string, any> {\n const dirty: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(this.attributes)) {\n if (!this.originalIsEquivalent(key, value)) {\n dirty[key] = value;\n }\n }\n\n return dirty;\n }\n\n /**\n * Determine if the given attribute has been changed\n */\n isDirty(attribute?: string): boolean {\n if (!attribute) {\n return Object.keys(this.getDirty()).length > 0;\n }\n\n return attribute in this.getDirty();\n }\n\n /**\n * Determine if the original value is equivalent to the current value\n */\n protected originalIsEquivalent(key: string, current: any): boolean {\n if (!(key in this.original)) {\n return false;\n }\n\n const original = this.original[key];\n\n if (current === original) {\n return true;\n }\n\n if (current === null) {\n return false;\n }\n\n if (this.isDateAttribute(key)) {\n return this.compareDates(current, original);\n }\n\n return String(current) === String(original);\n }\n\n /**\n * Determine if the given attribute is a date or date castable\n */\n protected isDateAttribute(key: string): boolean {\n const cast = this.casts[key];\n return cast === 'date' || cast === 'datetime' || cast === 'timestamp';\n }\n\n /**\n * Compare two dates\n */\n protected compareDates(current: any, original: any): boolean {\n const currentDate = current instanceof Date ? current : new Date(current);\n const originalDate = original instanceof Date ? original : new Date(original);\n return currentDate.getTime() === originalDate.getTime();\n }\n\n /**\n * Get the attributes for insert\n */\n protected getAttributesForInsert(): Record<string, any> {\n return { ...this.attributes };\n }\n\n /**\n * Sync the original attributes with the current\n */\n protected syncOriginal(): this {\n this.original = { ...this.attributes };\n return this;\n }\n\n /**\n * Delete the model from the database\n */\n async delete(): Promise<boolean> {\n if (!this.exists) {\n return false;\n }\n\n // Fire deleting event\n if ((await this.fireModelEvent('deleting')) === false) {\n return false;\n }\n\n const connection = this.getConnection();\n const table = this.getTable();\n\n await connection.table(table).where(this.getKeyName(), '=', this.getKey()).delete();\n\n this.exists = false;\n\n // Fire deleted event\n await this.fireModelEvent('deleted');\n\n return true;\n }\n\n /**\n * Reload the current model instance from the database\n */\n async refresh(): Promise<this> {\n if (!this.exists) {\n return this;\n }\n\n const fresh = await (this.constructor as any).find(this.getKey());\n\n if (!fresh) {\n throw new Error('Ensemble not found');\n }\n\n this.attributes = (fresh as any).attributes;\n this.syncOriginal();\n\n return this;\n }\n\n /**\n * Convert a string to studly case\n */\n protected studly(value: string): string {\n return value\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n }\n\n /**\n * Convert a string to snake case\n */\n protected snake(value: string): string {\n return value\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n }\n\n /**\n * Pluralize a string (simple implementation)\n */\n protected pluralize(value: string): string {\n if (value.endsWith('y')) {\n return value.slice(0, -1) + 'ies';\n }\n if (value.endsWith('s')) {\n return value + 'es';\n }\n return value + 's';\n }\n\n /**\n * Create a new query instance for the model\n */\n newQuery(): EnsembleBuilder<any> {\n return (this.constructor as any).query();\n }\n\n /**\n * Create a new instance of the given model\n */\n newInstance(attributes: Record<string, any> = {}, exists: boolean = false): this {\n const ModelClass = this.constructor as new (attributes: Record<string, any>, fromDatabase: boolean) => this;\n const instance = new ModelClass(attributes, exists);\n instance.exists = exists;\n\n if (exists) {\n instance.syncOriginal();\n }\n\n return instance;\n }\n\n /**\n * Get the name of the \"updated at\" column\n */\n getUpdatedAtColumn(): string | null {\n return this.timestamps ? (this.constructor as typeof Ensemble).UPDATED_AT : null;\n }\n\n /**\n * Get the name of the \"created at\" column\n */\n getCreatedAtColumn(): string | null {\n return this.timestamps ? (this.constructor as typeof Ensemble).CREATED_AT : null;\n }\n\n /**\n * Fire the given model event\n *\n * @param event - Event name (saving, saved, creating, created, etc.)\n * @returns false if event is halting and a listener returned false, undefined otherwise\n */\n protected async fireModelEvent(event: string): Promise<boolean | undefined> {\n // Try to get the event dispatcher\n let dispatcher: any;\n try {\n // Import the Dispatcher and get from static resolver if available\n const { Dispatcher } = await import('@/Events/Dispatcher');\n const { Facade } = await import('@/Support/Facade');\n\n try {\n dispatcher = Facade.getFacadeApplication()?.make?.('events');\n } catch {\n // No dispatcher registered\n }\n } catch (error) {\n // Event system not set up, skip firing events\n return undefined;\n }\n\n if (!dispatcher || typeof dispatcher.dispatch !== 'function') {\n return undefined;\n }\n\n // Map event names to event classes\n const eventMap: Record<string, any> = {\n retrieved: ModelRetrieved,\n creating: ModelCreating,\n created: ModelCreated,\n updating: ModelUpdating,\n updated: ModelUpdated,\n saving: ModelSaving,\n saved: ModelSaved,\n deleting: ModelDeleting,\n deleted: ModelDeleted,\n };\n\n const EventClass = eventMap[event];\n if (!EventClass) {\n return undefined;\n }\n\n const eventInstance = new EventClass(this);\n\n // For halting events (creating, updating, saving, deleting), use until()\n // which returns the first non-null result (false halts the operation)\n if (['creating', 'updating', 'saving', 'deleting'].includes(event)) {\n const result = await dispatcher.until?.(eventInstance);\n // If any listener returns false, halt the operation\n if (result === false) {\n return false;\n }\n } else {\n // For non-halting events, just dispatch normally\n await dispatcher.dispatch(eventInstance);\n }\n\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Ensemble.mjs","names":[],"sources":["../../../src/Database/Ensemble/Ensemble.ts"],"sourcesContent":["/**\n * Ensemble Class\n *\n * Base class for Ensemble models with ActiveRecord pattern\n * In Orchestr, your data models are called Ensembles - groups that work in harmony\n */\n\nimport { Connection } from '@/Database/Connection';\nimport { DatabaseManager } from '@/Database/DatabaseManager';\nimport { HasRelationshipsMixin } from './Concerns/HasRelationships';\nimport { EnsembleBuilder } from './EnsembleBuilder';\nimport {\n ModelRetrieved,\n ModelCreating,\n ModelCreated,\n ModelUpdating,\n ModelUpdated,\n ModelSaving,\n ModelSaved,\n ModelDeleting,\n ModelDeleted,\n} from './Events';\n\nexport abstract class Ensemble extends HasRelationshipsMixin {\n /**\n * The connection resolver instance\n */\n protected static connectionResolver: DatabaseManager;\n\n /**\n * The table associated with the model\n */\n protected table?: string;\n\n /**\n * The primary key for the model\n */\n protected primaryKey: string = 'id';\n\n /**\n * Indicates if the IDs are auto-incrementing\n */\n protected incrementing: boolean = true;\n\n /**\n * The data type of the primary key\n */\n protected keyType: string = 'int';\n\n /**\n * The attributes that are mass assignable (instance property).\n *\n * Subclasses may also declare `static fillable: string[]` instead.\n * Static properties are resolved at construction time so they are safe\n * to use even when a subclass constructor has not yet run its own field\n * initialisers.\n */\n protected fillable: string[] = [];\n\n /**\n * The attributes that aren't mass assignable (instance property).\n *\n * Subclasses may also declare `static guarded: string[]` instead of\n * (or in addition to) the instance property.\n */\n protected guarded: string[] = ['*'];\n\n /**\n * Static fillable list. Subclasses that declare `static fillable` here\n * will have those attributes made mass-assignable without needing a\n * constructor override.\n */\n static fillable?: string[];\n\n /**\n * Static guarded list. Subclasses that declare `static guarded` here\n * will have those attributes protected from mass assignment without\n * needing a constructor override.\n */\n static guarded?: string[];\n\n /**\n * The attributes that should be hidden for serialization\n */\n protected hidden: string[] = [];\n\n /**\n * The attributes that should be visible for serialization\n */\n protected visible: string[] = [];\n\n /**\n * The accessors to append to the model's array form\n */\n protected appends: string[] = [];\n\n /**\n * The attributes that should be cast\n */\n protected casts: Record<string, string> = {};\n\n /**\n * Indicates if the model should be timestamped\n */\n protected timestamps: boolean = true;\n\n /**\n * The name of the \"created at\" column\n */\n protected static CREATED_AT: string = 'created_at';\n\n /**\n * The name of the \"updated at\" column\n */\n protected static UPDATED_AT: string = 'updated_at';\n\n /**\n * The name of the \"deleted at\" column (for soft deletes)\n */\n protected static DELETED_AT: string = 'deleted_at';\n\n /**\n * The model's attributes\n */\n protected attributes: Record<string, any> = {};\n\n /**\n * The model's original attributes\n */\n protected original: Record<string, any> = {};\n\n /**\n * Indicates if the model exists in the database\n */\n public exists: boolean = false;\n\n /**\n * Indicates if the model was inserted during this request\n */\n public wasRecentlyCreated: boolean = false;\n\n /**\n * The connection name for the model\n */\n protected connection?: string;\n\n /**\n * Enable dynamic relationship access (user.posts instead of user.posts().get())\n * Set to true to enable PHP-like __get behavior for relationships\n */\n protected dynamicRelations: boolean = false;\n\n /**\n * Create a new Eloquent model instance\n */\n constructor(attributes: Record<string, any> = {}, fromDatabase: boolean = false) {\n super();\n if (fromDatabase) {\n // When hydrating from database, set all attributes directly\n this.setRawAttributes(attributes);\n } else {\n // When creating manually, respect fillable/guarded\n this.fill(attributes);\n }\n }\n\n /**\n * Fill the model with an array of attributes\n */\n fill(attributes: Record<string, any>): this {\n for (const [key, value] of Object.entries(attributes)) {\n if (this.isFillable(key)) {\n this.setAttribute(key, value);\n }\n }\n return this;\n }\n\n /**\n * Set a given attribute on the model\n */\n setAttribute(key: string, value: any): this {\n // Check for mutator\n const mutator = `set${this.studly(key)}Attribute`;\n if (typeof (this as any)[mutator] === 'function') {\n (this as any)[mutator](value);\n return this;\n }\n\n this.attributes[key] = value;\n return this;\n }\n\n /**\n * Set the array of model attributes (bypasses fillable/guarded)\n * Used when hydrating from database\n */\n setRawAttributes(attributes: Record<string, any>): this {\n this.attributes = attributes;\n return this;\n }\n\n /**\n * Get an attribute from the model\n */\n getAttribute(key: string): any {\n if (!key) {\n return undefined;\n }\n\n // Check if we have an accessor\n const accessor = `get${this.studly(key)}Attribute`;\n if (typeof (this as any)[accessor] === 'function') {\n return (this as any)[accessor]();\n }\n\n // Get the attribute value\n const value = this.attributes[key];\n\n // Cast the attribute if needed\n if (this.hasCast(key)) {\n return this.castAttribute(key, value);\n }\n\n return value;\n }\n\n /**\n * Determine if the given attribute may be mass assigned.\n *\n * Resolution order for `fillable` and `guarded`:\n * 1. Static property on the concrete class (e.g. `static fillable = [...]`)\n * – safe because static properties exist before any constructor runs.\n * 2. Instance property (`this.fillable` / `this.guarded`) – populated either\n * by Ensemble's own field initialiser or by a subclass constructor\n * workaround that calls `this.fill()` a second time after `super()`.\n *\n * If the concrete class defines `static fillable`, it takes full precedence\n * over the instance property (matching Laravel's behaviour where a non-empty\n * fillable list is the authoritative allow-list).\n */\n protected isFillable(key: string): boolean {\n const ctor = this.constructor as typeof Ensemble;\n\n // Prefer static fillable if the subclass has defined one on itself\n // (not inherited – check own property to avoid reading Ensemble's\n // `undefined` declaration as a truthy value).\n const staticFillable: string[] | undefined = Object.prototype.hasOwnProperty.call(ctor, 'fillable')\n ? ctor.fillable\n : undefined;\n\n const effectiveFillable: string[] = staticFillable ?? this.fillable;\n\n if (effectiveFillable.length > 0) {\n return effectiveFillable.includes(key);\n }\n\n // No fillable list – fall back to guarded logic.\n const staticGuarded: string[] | undefined = Object.prototype.hasOwnProperty.call(ctor, 'guarded')\n ? ctor.guarded\n : undefined;\n\n const effectiveGuarded: string[] = staticGuarded ?? this.guarded;\n\n if (effectiveGuarded.length > 0 && !effectiveGuarded.includes('*')) {\n return !effectiveGuarded.includes(key);\n }\n\n return effectiveGuarded[0] !== '*';\n }\n\n /**\n * Determine if a get mutator exists for an attribute\n */\n protected hasGetMutator(key: string): boolean {\n return typeof (this as any)[`get${this.studly(key)}Attribute`] === 'function';\n }\n\n /**\n * Determine if a set mutator exists for an attribute\n */\n protected hasSetMutator(key: string): boolean {\n return typeof (this as any)[`set${this.studly(key)}Attribute`] === 'function';\n }\n\n /**\n * Determine if a cast is defined for an attribute\n */\n protected hasCast(key: string): boolean {\n return key in this.casts;\n }\n\n /**\n * Cast an attribute to a native PHP type\n */\n protected castAttribute(key: string, value: any): any {\n if (value === null) {\n return value;\n }\n\n const castType = this.casts[key];\n\n switch (castType) {\n case 'int':\n case 'integer':\n return parseInt(value);\n case 'real':\n case 'float':\n case 'double':\n return parseFloat(value);\n case 'string':\n return String(value);\n case 'bool':\n case 'boolean':\n return Boolean(value);\n case 'object':\n return typeof value === 'string' ? JSON.parse(value) : value;\n case 'array':\n case 'json':\n return typeof value === 'string' ? JSON.parse(value) : value;\n case 'collection':\n return typeof value === 'string' ? JSON.parse(value) : value;\n case 'date':\n case 'datetime':\n case 'timestamp':\n return value instanceof Date ? value : new Date(value);\n default:\n return value;\n }\n }\n\n /**\n * Convert the model to a plain object\n */\n toObject(): Record<string, any> {\n const attributes: Record<string, any> = {};\n\n for (const key of Object.keys(this.attributes)) {\n if (this.isVisible(key)) {\n attributes[key] = this.getAttribute(key);\n }\n }\n\n // Add appended accessors\n for (const key of this.appends) {\n attributes[key] = this.getAttribute(key);\n }\n\n // Add loaded relationships\n for (const [key, value] of Object.entries(this.relations)) {\n if (Array.isArray(value)) {\n attributes[key] = value.map((model) => model.toObject());\n } else if (value && typeof value.toObject === 'function') {\n attributes[key] = value.toObject();\n } else {\n attributes[key] = value;\n }\n }\n\n return attributes;\n }\n\n /**\n * Convert the model to JSON\n */\n toJSON(): Record<string, any> {\n return this.toObject();\n }\n\n /**\n * Determine if an attribute is visible\n */\n protected isVisible(key: string): boolean {\n if (this.visible.length > 0) {\n return this.visible.includes(key);\n }\n\n return !this.hidden.includes(key);\n }\n\n /**\n * Get the table associated with the model\n */\n getTable(): string {\n if (this.table) {\n return this.table;\n }\n\n // Convert class name to snake_case plural\n // e.g., User -> users, BlogPost -> blog_posts\n const className = this.constructor.name;\n return this.pluralize(this.snake(className));\n }\n\n /**\n * Get the primary key for the model\n */\n getKeyName(): string {\n return this.primaryKey;\n }\n\n /**\n * Get the value of the model's primary key\n */\n getKey(): any {\n return this.getAttribute(this.getKeyName());\n }\n\n /**\n * Set the connection resolver instance\n */\n static setConnectionResolver(resolver: DatabaseManager): void {\n (Ensemble as any).connectionResolver = resolver;\n }\n\n /**\n * Get the database connection for the model\n */\n getConnection(): Connection {\n return (this.constructor as typeof Ensemble).connectionResolver.connection(this.connection);\n }\n\n /**\n * Begin querying the model\n */\n static query<T extends Ensemble>(this: { new (): T }): EnsembleBuilder<T> {\n const instance = new this();\n return new EnsembleBuilder<T>(instance.getConnection().getAdapter(), instance);\n }\n\n /**\n * Get all of the models from the database\n */\n static async all<T extends Ensemble>(this: { new (): T }, columns: string[] = ['*']): Promise<T[]> {\n return (this as any)\n .query()\n .select(...columns)\n .get();\n }\n\n /**\n * Find a model by its primary key\n */\n static async find<T extends Ensemble>(this: { new (): T }, id: any, columns: string[] = ['*']): Promise<T | null> {\n return (this as any)\n .query()\n .select(...columns)\n .find(id);\n }\n\n /**\n * Find a model by its primary key or throw an exception\n */\n static async findOrFail<T extends Ensemble>(this: { new (): T }, id: any, columns: string[] = ['*']): Promise<T> {\n const model = await (this as any).find(id, columns);\n if (!model) {\n throw new Error(`Ensemble not found with id: ${id}`);\n }\n return model;\n }\n\n /**\n * Find multiple models by their primary keys\n */\n static async findMany<T extends Ensemble>(this: { new (): T }, ids: any[], columns: string[] = ['*']): Promise<T[]> {\n const instance = new this();\n return (this as any)\n .query()\n .select(...columns)\n .whereIn(instance.getKeyName(), ids)\n .get();\n }\n\n /**\n * Create a new instance and save it to the database\n */\n static async create<T extends Ensemble>(\n this: { new (attrs?: Record<string, any>): T },\n attributes: Record<string, any>\n ): Promise<T> {\n const instance = new this(attributes);\n await instance.save();\n return instance;\n }\n\n /**\n * Update or create a model matching the attributes\n */\n static async updateOrCreate<T extends Ensemble>(\n this: { new (): T },\n attributes: Record<string, any>,\n values: Record<string, any> = {}\n ): Promise<T> {\n const instance = await (this as any).query().where(attributes).first();\n\n if (instance) {\n instance.fill(values);\n await instance.save();\n return instance;\n }\n\n return (this as any).create({ ...attributes, ...values });\n }\n\n /**\n * Save the model to the database\n */\n async save(): Promise<boolean> {\n // Fire saving event\n if ((await this.fireModelEvent('saving')) === false) {\n return false;\n }\n\n if (this.exists) {\n return this.performUpdate();\n }\n\n return this.performInsert();\n }\n\n /**\n * Perform a model insert operation\n */\n protected async performInsert(): Promise<boolean> {\n // Fire creating event\n if ((await this.fireModelEvent('creating')) === false) {\n return false;\n }\n\n const attributes = this.getAttributesForInsert();\n\n if (this.timestamps) {\n this.updateTimestamps();\n }\n\n const connection = this.getConnection();\n const table = this.getTable();\n\n const id = await connection.table(table).insertGetId(attributes);\n\n if (this.incrementing) {\n this.setAttribute(this.getKeyName(), id);\n }\n\n this.exists = true;\n this.wasRecentlyCreated = true;\n this.syncOriginal();\n\n // Fire created event\n await this.fireModelEvent('created');\n\n // Fire saved event\n await this.fireModelEvent('saved');\n\n return true;\n }\n\n /**\n * Perform a model update operation\n */\n protected async performUpdate(): Promise<boolean> {\n const dirty = this.getDirty();\n\n if (Object.keys(dirty).length === 0) {\n return true;\n }\n\n // Fire updating event\n if ((await this.fireModelEvent('updating')) === false) {\n return false;\n }\n\n if (this.timestamps) {\n this.updateTimestamps();\n }\n\n const connection = this.getConnection();\n const table = this.getTable();\n\n await connection.table(table).where(this.getKeyName(), '=', this.getKey()).update(dirty);\n\n this.syncOriginal();\n\n // Fire updated event\n await this.fireModelEvent('updated');\n\n // Fire saved event\n await this.fireModelEvent('saved');\n\n return true;\n }\n\n /**\n * Update the model's timestamps\n */\n protected updateTimestamps(): void {\n const time = new Date();\n\n const updatedAtColumn = (this.constructor as typeof Ensemble).UPDATED_AT;\n if (updatedAtColumn && !this.isDirty(updatedAtColumn)) {\n this.setAttribute(updatedAtColumn, time);\n }\n\n const createdAtColumn = (this.constructor as typeof Ensemble).CREATED_AT;\n if (!this.exists && createdAtColumn && !this.isDirty(createdAtColumn)) {\n this.setAttribute(createdAtColumn, time);\n }\n }\n\n /**\n * Get the attributes that have been changed\n */\n getDirty(): Record<string, any> {\n const dirty: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(this.attributes)) {\n if (!this.originalIsEquivalent(key, value)) {\n dirty[key] = value;\n }\n }\n\n return dirty;\n }\n\n /**\n * Determine if the given attribute has been changed\n */\n isDirty(attribute?: string): boolean {\n if (!attribute) {\n return Object.keys(this.getDirty()).length > 0;\n }\n\n return attribute in this.getDirty();\n }\n\n /**\n * Determine if the original value is equivalent to the current value\n */\n protected originalIsEquivalent(key: string, current: any): boolean {\n if (!(key in this.original)) {\n return false;\n }\n\n const original = this.original[key];\n\n if (current === original) {\n return true;\n }\n\n if (current === null) {\n return false;\n }\n\n if (this.isDateAttribute(key)) {\n return this.compareDates(current, original);\n }\n\n return String(current) === String(original);\n }\n\n /**\n * Determine if the given attribute is a date or date castable\n */\n protected isDateAttribute(key: string): boolean {\n const cast = this.casts[key];\n return cast === 'date' || cast === 'datetime' || cast === 'timestamp';\n }\n\n /**\n * Compare two dates\n */\n protected compareDates(current: any, original: any): boolean {\n const currentDate = current instanceof Date ? current : new Date(current);\n const originalDate = original instanceof Date ? original : new Date(original);\n return currentDate.getTime() === originalDate.getTime();\n }\n\n /**\n * Get the attributes for insert\n */\n protected getAttributesForInsert(): Record<string, any> {\n return { ...this.attributes };\n }\n\n /**\n * Sync the original attributes with the current\n */\n protected syncOriginal(): this {\n this.original = { ...this.attributes };\n return this;\n }\n\n /**\n * Delete the model from the database\n */\n async delete(): Promise<boolean> {\n if (!this.exists) {\n return false;\n }\n\n // Fire deleting event\n if ((await this.fireModelEvent('deleting')) === false) {\n return false;\n }\n\n const connection = this.getConnection();\n const table = this.getTable();\n\n await connection.table(table).where(this.getKeyName(), '=', this.getKey()).delete();\n\n this.exists = false;\n\n // Fire deleted event\n await this.fireModelEvent('deleted');\n\n return true;\n }\n\n /**\n * Reload the current model instance from the database\n */\n async refresh(): Promise<this> {\n if (!this.exists) {\n return this;\n }\n\n const fresh = await (this.constructor as any).find(this.getKey());\n\n if (!fresh) {\n throw new Error('Ensemble not found');\n }\n\n this.attributes = (fresh as any).attributes;\n this.syncOriginal();\n\n return this;\n }\n\n /**\n * Convert a string to studly case\n */\n protected studly(value: string): string {\n return value\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n }\n\n /**\n * Convert a string to snake case\n */\n protected snake(value: string): string {\n return value\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n }\n\n /**\n * Pluralize a string (simple implementation)\n */\n protected pluralize(value: string): string {\n if (value.endsWith('y')) {\n return value.slice(0, -1) + 'ies';\n }\n if (value.endsWith('s')) {\n return value + 'es';\n }\n return value + 's';\n }\n\n /**\n * Create a new query instance for the model\n */\n newQuery(): EnsembleBuilder<any> {\n return (this.constructor as any).query();\n }\n\n /**\n * Create a new instance of the given model\n */\n newInstance(attributes: Record<string, any> = {}, exists: boolean = false): this {\n const ModelClass = this.constructor as new (attributes: Record<string, any>, fromDatabase: boolean) => this;\n const instance = new ModelClass(attributes, exists);\n instance.exists = exists;\n\n if (exists) {\n instance.syncOriginal();\n }\n\n return instance;\n }\n\n /**\n * Get the name of the \"updated at\" column\n */\n getUpdatedAtColumn(): string | null {\n return this.timestamps ? (this.constructor as typeof Ensemble).UPDATED_AT : null;\n }\n\n /**\n * Get the name of the \"created at\" column\n */\n getCreatedAtColumn(): string | null {\n return this.timestamps ? (this.constructor as typeof Ensemble).CREATED_AT : null;\n }\n\n /**\n * Fire the given model event\n *\n * @param event - Event name (saving, saved, creating, created, etc.)\n * @returns false if event is halting and a listener returned false, undefined otherwise\n */\n protected async fireModelEvent(event: string): Promise<boolean | undefined> {\n // Try to get the event dispatcher\n let dispatcher: any;\n try {\n // Import the Dispatcher and get from static resolver if available\n const { Dispatcher } = await import('@/Events/Dispatcher');\n const { Facade } = await import('@/Support/Facade');\n\n try {\n dispatcher = Facade.getFacadeApplication()?.make?.('events');\n } catch {\n // No dispatcher registered\n }\n } catch (error) {\n // Event system not set up, skip firing events\n return undefined;\n }\n\n if (!dispatcher || typeof dispatcher.dispatch !== 'function') {\n return undefined;\n }\n\n // Map event names to event classes\n const eventMap: Record<string, any> = {\n retrieved: ModelRetrieved,\n creating: ModelCreating,\n created: ModelCreated,\n updating: ModelUpdating,\n updated: ModelUpdated,\n saving: ModelSaving,\n saved: ModelSaved,\n deleting: ModelDeleting,\n deleted: ModelDeleted,\n };\n\n const EventClass = eventMap[event];\n if (!EventClass) {\n return undefined;\n }\n\n const eventInstance = new EventClass(this);\n\n // For halting events (creating, updating, saving, deleting), use until()\n // which returns the first non-null result (false halts the operation)\n if (['creating', 'updating', 'saving', 'deleting'].includes(event)) {\n const result = await dispatcher.until?.(eventInstance);\n // If any listener returns false, halt the operation\n if (result === false) {\n return false;\n }\n } else {\n // For non-halting events, just dispatch normally\n await dispatcher.dispatch(eventInstance);\n }\n\n return undefined;\n }\n}\n"],"mappings":"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"}
|