@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":"Builder.mjs","names":[],"sources":["../../../src/Database/Query/Builder.ts"],"sourcesContent":["/**\n * Query Builder\n *\n * Fluent query builder for constructing database queries\n */\n\nimport { DatabaseAdapter } from '@/Database/Contracts/DatabaseAdapter';\nimport {\n QueryBuilderInterface,\n WhereOperator,\n OrderDirection,\n JoinType,\n WhereClause,\n JoinClause,\n OrderByClause,\n} from '@/Database/Contracts/QueryBuilderInterface';\nimport { Expression } from './Expression';\n\nexport class Builder<T = any> implements QueryBuilderInterface<T> {\n protected _columns: string[] = ['*'];\n protected _distinct: boolean = false;\n protected _table?: string;\n protected _wheres: WhereClause[] = [];\n protected _joins: JoinClause[] = [];\n protected _orders: OrderByClause[] = [];\n protected _groups: string[] = [];\n protected _havings: any[] = [];\n protected _limit?: number;\n protected _offset?: number;\n protected _bindings: any[] = [];\n protected _returning?: string[];\n\n constructor(protected adapter: DatabaseAdapter) {}\n\n /**\n * Set the columns to be selected\n */\n select(...columns: string[]): this {\n this._columns = columns.length > 0 ? columns : ['*'];\n return this;\n }\n\n /**\n * Add a raw select expression\n */\n selectRaw(sql: string, bindings: any[] = []): this {\n this._columns.push(new Expression(sql) as any);\n this._bindings.push(...bindings);\n return this;\n }\n\n /**\n * Force the query to only return distinct results\n */\n distinct(): this {\n this._distinct = true;\n return this;\n }\n\n /**\n * Set the table which the query is targeting\n */\n from(table: string): this {\n this._table = table;\n return this;\n }\n\n /**\n * Add a basic where clause\n */\n where(column: string, operator?: WhereOperator | any, value?: any): this {\n // Handle where(column, value) syntax\n if (arguments.length === 2) {\n value = operator;\n operator = '=';\n }\n\n this._wheres.push({\n column,\n operator: operator as WhereOperator,\n value,\n boolean: 'and',\n });\n\n if (value !== undefined && value !== null) {\n this._bindings.push(value);\n }\n\n return this;\n }\n\n /**\n * Add an \"or where\" clause\n */\n orWhere(column: string, operator?: WhereOperator | any, value?: any): this {\n if (arguments.length === 2) {\n value = operator;\n operator = '=';\n }\n\n this._wheres.push({\n column,\n operator: operator as WhereOperator,\n value,\n boolean: 'or',\n });\n\n if (value !== undefined && value !== null) {\n this._bindings.push(value);\n }\n\n return this;\n }\n\n /**\n * Add a where in clause\n */\n whereIn(column: string, values: any[]): this {\n this._wheres.push({\n column,\n operator: 'in',\n value: values,\n boolean: 'and',\n });\n\n this._bindings.push(...values);\n return this;\n }\n\n /**\n * Add a where not in clause\n */\n whereNotIn(column: string, values: any[]): this {\n this._wheres.push({\n column,\n operator: 'not in',\n value: values,\n boolean: 'and',\n });\n\n this._bindings.push(...values);\n return this;\n }\n\n /**\n * Add a where null clause\n */\n whereNull(column: string): this {\n this._wheres.push({\n column,\n operator: 'is null',\n value: null,\n boolean: 'and',\n });\n\n return this;\n }\n\n /**\n * Add a where not null clause\n */\n whereNotNull(column: string): this {\n this._wheres.push({\n column,\n operator: 'is not null',\n value: null,\n boolean: 'and',\n });\n\n return this;\n }\n\n /**\n * Add a where between clause\n */\n whereBetween(column: string, values: [any, any]): this {\n this._wheres.push({\n column,\n operator: 'between',\n value: values,\n boolean: 'and',\n });\n\n this._bindings.push(...values);\n return this;\n }\n\n /**\n * Add a raw where clause\n */\n whereRaw(sql: string, bindings: any[] = []): this {\n this._wheres.push({\n column: new Expression(sql) as any,\n operator: 'raw',\n value: null,\n boolean: 'and',\n });\n\n this._bindings.push(...bindings);\n return this;\n }\n\n /**\n * Add a join clause\n */\n join(table: string, first: string, operator: string = '=', second?: string): this {\n this._joins.push({\n type: 'inner',\n table,\n first,\n operator,\n second,\n });\n\n return this;\n }\n\n /**\n * Add a left join clause\n */\n leftJoin(table: string, first: string, operator: string = '=', second?: string): this {\n this._joins.push({\n type: 'left',\n table,\n first,\n operator,\n second,\n });\n\n return this;\n }\n\n /**\n * Add a right join clause\n */\n rightJoin(table: string, first: string, operator: string = '=', second?: string): this {\n this._joins.push({\n type: 'right',\n table,\n first,\n operator,\n second,\n });\n\n return this;\n }\n\n /**\n * Add an order by clause\n */\n orderBy(column: string, direction: OrderDirection = 'asc'): this {\n this._orders.push({ column, direction });\n return this;\n }\n\n /**\n * Order by latest (descending created_at)\n */\n latest(column: string = 'created_at'): this {\n return this.orderBy(column, 'desc');\n }\n\n /**\n * Order by oldest (ascending created_at)\n */\n oldest(column: string = 'created_at'): this {\n return this.orderBy(column, 'asc');\n }\n\n /**\n * Add a group by clause\n */\n groupBy(...columns: string[]): this {\n this._groups.push(...columns);\n return this;\n }\n\n /**\n * Add a having clause\n */\n having(column: string, operator?: string, value?: any): this {\n if (arguments.length === 2) {\n value = operator;\n operator = '=';\n }\n\n this._havings.push({ column, operator, value });\n\n if (value !== undefined && value !== null) {\n this._bindings.push(value);\n }\n\n return this;\n }\n\n /**\n * Set the limit\n */\n limit(value: number): this {\n this._limit = value;\n return this;\n }\n\n /**\n * Alias for limit\n */\n take(value: number): this {\n return this.limit(value);\n }\n\n /**\n * Set the offset\n */\n offset(value: number): this {\n this._offset = value;\n return this;\n }\n\n /**\n * Alias for offset\n */\n skip(value: number): this {\n return this.offset(value);\n }\n\n /**\n * Get all records\n */\n async get(): Promise<T[]> {\n const sql = this.toSql();\n const results = await this.adapter.select<T>(sql, this.getBindings());\n return results;\n }\n\n /**\n * Get the first record\n */\n async first(): Promise<T | null> {\n const results = await this.limit(1).get();\n return results[0] || null;\n }\n\n /**\n * Find a record by ID\n */\n async find(id: any): Promise<T | null> {\n return this.where('id', '=', id).first();\n }\n\n /**\n * Get a single column's value\n */\n async value(column: string): Promise<any> {\n const result = await this.select(column).first();\n return result ? (result as any)[column] : null;\n }\n\n /**\n * Get an array of column values\n */\n async pluck(column: string): Promise<any[]> {\n const results = await this.select(column).get();\n return results.map((row) => (row as any)[column]);\n }\n\n /**\n * Determine if any rows exist\n */\n async exists(): Promise<boolean> {\n const count = await this.count();\n return count > 0;\n }\n\n /**\n * Get the count of records\n */\n async count(column: string = '*'): Promise<number> {\n return this.aggregate('COUNT', column);\n }\n\n /**\n * Get the maximum value of a column\n */\n async max(column: string): Promise<number | null> {\n return this.aggregate('MAX', column);\n }\n\n /**\n * Get the minimum value of a column\n */\n async min(column: string): Promise<number | null> {\n return this.aggregate('MIN', column);\n }\n\n /**\n * Get the average value of a column\n */\n async avg(column: string): Promise<number | null> {\n return this.aggregate('AVG', column);\n }\n\n /**\n * Get the sum of a column's values\n */\n async sum(column: string): Promise<number> {\n return this.aggregate('SUM', column) || 0;\n }\n\n /**\n * Execute an aggregate function\n */\n protected async aggregate(func: string, column: string): Promise<any> {\n const previousColumns = this._columns;\n const previousBindings = this._bindings.slice();\n\n this.selectRaw(`${func}(${column}) as aggregate`);\n\n const result = await this.first();\n\n this._columns = previousColumns;\n this._bindings = previousBindings;\n\n return result ? (result as any)['aggregate'] : null;\n }\n\n /**\n * Insert a new record\n */\n insert(values: Record<string, any> | Record<string, any>[]): Promise<boolean> & {\n returning(columns?: string | string[]): Promise<any | any[]>;\n } {\n const returningFn = (columns?: string | string[]) => this.insertReturning(values, columns);\n const exec = () => this.executeInsert(values);\n const chain: any = {\n returning: returningFn,\n then: (onfulfilled: any, onrejected: any) => exec().then(onfulfilled, onrejected),\n catch: (onrejected: any) => exec().catch(onrejected),\n finally: (onfinally: any) => exec().finally(onfinally),\n };\n return chain as Promise<boolean> & { returning: typeof returningFn };\n }\n\n protected async executeInsert(values: Record<string, any> | Record<string, any>[]): Promise<boolean> {\n if (!this._table) {\n throw new Error('Cannot insert without specifying a table');\n }\n\n const records = Array.isArray(values) ? values : [values];\n if (records.length === 0) {\n return true;\n }\n\n const columns = Object.keys(records[0]);\n const placeholders = records.map(() => `(${columns.map(() => '?').join(', ')})`).join(', ');\n const bindings = records.flatMap((record) => columns.map((col) => record[col]));\n const sql = `INSERT INTO ${this._table} (${columns.join(', ')}) VALUES ${placeholders}`;\n await this.adapter.insert(sql, bindings);\n return true;\n }\n\n /**\n * Specify returning columns for insert/update operations\n */\n returning(columns?: string | string[]): this {\n if (!columns) {\n this._returning = ['*'];\n } else if (Array.isArray(columns)) {\n this._returning = columns;\n } else {\n this._returning = [columns];\n }\n return this;\n }\n\n /**\n * Insert and return selected columns\n * - Single insert: returns one row (object)\n * - Bulk insert: returns array of rows\n * - Fallbacks for drivers without RETURNING (e.g., MySQL)\n */\n async insertReturning(\n values: Record<string, any> | Record<string, any>[],\n columns?: string | string[]\n ): Promise<any | any[]> {\n if (!this._table) {\n throw new Error('Cannot insert without specifying a table');\n }\n\n const records = Array.isArray(values) ? values : [values];\n if (records.length === 0) {\n return Array.isArray(values) ? [] : null;\n }\n\n const insertCols = Object.keys(records[0]);\n const placeholders = records.map(() => `(${insertCols.map(() => '?').join(', ')})`).join(', ');\n const bindings = records.flatMap((record) => insertCols.map((col) => record[col]));\n\n const retCols =\n columns === undefined\n ? this._returning && this._returning.length > 0\n ? this._returning\n : ['*']\n : Array.isArray(columns)\n ? columns\n : [columns];\n\n const sqlWithReturning = `INSERT INTO ${this._table} (${insertCols.join(', ')}) VALUES ${placeholders} RETURNING ${retCols.join(\n ', '\n )}`;\n\n try {\n const rows = await this.adapter.select<any>(sqlWithReturning, bindings);\n // Reset returning state after use\n this._returning = undefined;\n return records.length === 1 ? (rows[0] ?? null) : rows;\n } catch (error) {\n // Fallback for drivers without RETURNING (e.g., MySQL)\n const sqlNoReturning = `INSERT INTO ${this._table} (${insertCols.join(', ')}) VALUES ${placeholders}`;\n const insertResult = await this.adapter.insert(sqlNoReturning, bindings);\n\n // Only supported fallback: single-row insert by primary key ID\n if (records.length === 1) {\n const id = insertResult;\n // If no id is obtainable, return minimal best-effort (null)\n if (id === undefined || id === null) {\n this._returning = undefined;\n return null;\n }\n\n const selectCols = retCols.join(', ');\n const row = await this.adapter.select<any>(`SELECT ${selectCols} FROM ${this._table} WHERE id = ? LIMIT 1`, [\n id,\n ]);\n this._returning = undefined;\n return row[0] ?? null;\n }\n\n // Bulk insert not supported on drivers without RETURNING\n throw new Error(\n 'returning() is not supported for bulk inserts on this driver. Insert succeeded without returning rows.'\n );\n }\n }\n\n /**\n * Insert a new record and get the ID\n */\n async insertGetId(values: Record<string, any>, sequence?: string): Promise<any> {\n if (!this._table) {\n throw new Error('Cannot insert without specifying a table');\n }\n\n const columns = Object.keys(values);\n const placeholders = columns.map(() => '?').join(', ');\n const bindings = columns.map((col) => values[col]);\n\n const sql = `INSERT INTO ${this._table} (${columns.join(', ')}) VALUES (${placeholders})`;\n\n return await this.adapter.insert(sql, bindings);\n }\n\n /**\n * Update records\n */\n async update(values: Record<string, any>): Promise<number> {\n if (!this._table) {\n throw new Error('Cannot update without specifying a table');\n }\n\n const sets = Object.keys(values)\n .map((key) => `${key} = ?`)\n .join(', ');\n\n const bindings = [...Object.values(values), ...this.getBindings()];\n\n let sql = `UPDATE ${this._table} SET ${sets}`;\n\n if (this._wheres.length > 0) {\n sql += ' WHERE ' + this.compileWheres();\n }\n\n return await this.adapter.update(sql, bindings);\n }\n\n /**\n * Delete records\n */\n async delete(): Promise<number> {\n if (!this._table) {\n throw new Error('Cannot delete without specifying a table');\n }\n\n let sql = `DELETE FROM ${this._table}`;\n\n if (this._wheres.length > 0) {\n sql += ' WHERE ' + this.compileWheres();\n }\n\n return await this.adapter.delete(sql, this.getBindings());\n }\n\n /**\n * Truncate the table\n */\n async truncate(): Promise<void> {\n if (!this._table) {\n throw new Error('Cannot truncate without specifying a table');\n }\n\n const sql = `TRUNCATE TABLE ${this._table}`;\n await this.adapter.query(sql);\n }\n\n /**\n * Get the SQL query string\n */\n toSql(): string {\n if (!this._table) {\n throw new Error('Cannot generate SQL without specifying a table');\n }\n\n let sql = 'SELECT ';\n\n if (this._distinct) {\n sql += 'DISTINCT ';\n }\n\n sql += this.compileColumns();\n sql += ` FROM ${this._table}`;\n\n if (this._joins.length > 0) {\n sql += ' ' + this.compileJoins();\n }\n\n if (this._wheres.length > 0) {\n sql += ' WHERE ' + this.compileWheres();\n }\n\n if (this._groups.length > 0) {\n sql += ' GROUP BY ' + this._groups.join(', ');\n }\n\n if (this._havings.length > 0) {\n sql += ' HAVING ' + this.compileHavings();\n }\n\n if (this._orders.length > 0) {\n sql += ' ORDER BY ' + this.compileOrders();\n }\n\n if (this._limit !== undefined) {\n sql += ` LIMIT ${this._limit}`;\n }\n\n if (this._offset !== undefined) {\n sql += ` OFFSET ${this._offset}`;\n }\n\n return sql;\n }\n\n /**\n * Compile the columns\n */\n protected compileColumns(): string {\n return this._columns\n .map((col) => (typeof col === 'object' && col && 'getValue' in col ? (col as Expression).getValue() : col))\n .join(', ');\n }\n\n /**\n * Compile the where clauses\n */\n protected compileWheres(): string {\n return this._wheres\n .map((where, index) => {\n const boolean = index === 0 ? '' : ` ${where.boolean.toUpperCase()} `;\n\n if (where.operator === 'raw') {\n return (\n boolean +\n (typeof where.column === 'object' && where.column && 'getValue' in where.column\n ? (where.column as Expression).getValue()\n : where.column)\n );\n }\n\n if (where.operator === 'in' || where.operator === 'not in') {\n const placeholders = (where.value as any[]).map(() => '?').join(', ');\n return `${boolean}${where.column} ${where.operator.toUpperCase()} (${placeholders})`;\n }\n\n if (where.operator === 'between') {\n return `${boolean}${where.column} BETWEEN ? AND ?`;\n }\n\n if (where.operator === 'is null' || where.operator === 'is not null') {\n return `${boolean}${where.column} ${where.operator.toUpperCase()}`;\n }\n\n return `${boolean}${where.column} ${where.operator} ?`;\n })\n .join('');\n }\n\n /**\n * Compile the join clauses\n */\n protected compileJoins(): string {\n return this._joins\n .map((join) => {\n const type = join.type.toUpperCase();\n return `${type} JOIN ${join.table} ON ${join.first} ${join.operator} ${join.second}`;\n })\n .join(' ');\n }\n\n /**\n * Compile the order by clauses\n */\n protected compileOrders(): string {\n return this._orders.map((order) => `${order.column} ${order.direction.toUpperCase()}`).join(', ');\n }\n\n /**\n * Compile the having clauses\n */\n protected compileHavings(): string {\n return this._havings\n .map((having, index) => {\n const boolean = index === 0 ? '' : ' AND ';\n return `${boolean}${having.column} ${having.operator} ?`;\n })\n .join('');\n }\n\n /**\n * Get the bindings for the query\n */\n getBindings(): any[] {\n return this._bindings;\n }\n\n /**\n * Clone the query builder\n */\n clone(): Builder<T> {\n const cloned = new Builder<T>(this.adapter);\n cloned._columns = [...this._columns];\n cloned._distinct = this._distinct;\n cloned._table = this._table;\n cloned._wheres = [...this._wheres];\n cloned._joins = [...this._joins];\n cloned._orders = [...this._orders];\n cloned._groups = [...this._groups];\n cloned._havings = [...this._havings];\n cloned._limit = this._limit;\n cloned._offset = this._offset;\n cloned._bindings = [...this._bindings];\n return cloned;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Builder.mjs","names":[],"sources":["../../../src/Database/Query/Builder.ts"],"sourcesContent":["/**\n * Query Builder\n *\n * Fluent query builder for constructing database queries\n */\n\nimport { DatabaseAdapter } from '@/Database/Contracts/DatabaseAdapter';\nimport {\n QueryBuilderInterface,\n WhereOperator,\n OrderDirection,\n JoinType,\n WhereClause,\n JoinClause,\n OrderByClause,\n} from '@/Database/Contracts/QueryBuilderInterface';\nimport { Expression } from './Expression';\n\nexport class Builder<T = any> implements QueryBuilderInterface<T> {\n protected _columns: string[] = ['*'];\n protected _distinct: boolean = false;\n protected _table?: string;\n protected _wheres: WhereClause[] = [];\n protected _joins: JoinClause[] = [];\n protected _orders: OrderByClause[] = [];\n protected _groups: string[] = [];\n protected _havings: any[] = [];\n protected _limit?: number;\n protected _offset?: number;\n protected _bindings: any[] = [];\n protected _returning?: string[];\n\n constructor(protected adapter: DatabaseAdapter) {}\n\n /**\n * Set the columns to be selected\n */\n select(...columns: string[]): this {\n this._columns = columns.length > 0 ? columns : ['*'];\n return this;\n }\n\n /**\n * Add a raw select expression\n */\n selectRaw(sql: string, bindings: any[] = []): this {\n this._columns.push(new Expression(sql) as any);\n this._bindings.push(...bindings);\n return this;\n }\n\n /**\n * Force the query to only return distinct results\n */\n distinct(): this {\n this._distinct = true;\n return this;\n }\n\n /**\n * Set the table which the query is targeting\n */\n from(table: string): this {\n this._table = table;\n return this;\n }\n\n /**\n * Add a basic where clause\n */\n where(column: string, operator?: WhereOperator | any, value?: any): this {\n // Handle where(column, value) syntax\n if (arguments.length === 2) {\n value = operator;\n operator = '=';\n }\n\n this._wheres.push({\n column,\n operator: operator as WhereOperator,\n value,\n boolean: 'and',\n });\n\n if (value !== undefined && value !== null) {\n this._bindings.push(value);\n }\n\n return this;\n }\n\n /**\n * Add an \"or where\" clause\n */\n orWhere(column: string, operator?: WhereOperator | any, value?: any): this {\n if (arguments.length === 2) {\n value = operator;\n operator = '=';\n }\n\n this._wheres.push({\n column,\n operator: operator as WhereOperator,\n value,\n boolean: 'or',\n });\n\n if (value !== undefined && value !== null) {\n this._bindings.push(value);\n }\n\n return this;\n }\n\n /**\n * Add a where in clause\n */\n whereIn(column: string, values: any[]): this {\n this._wheres.push({\n column,\n operator: 'in',\n value: values,\n boolean: 'and',\n });\n\n this._bindings.push(...values);\n return this;\n }\n\n /**\n * Add a where not in clause\n */\n whereNotIn(column: string, values: any[]): this {\n this._wheres.push({\n column,\n operator: 'not in',\n value: values,\n boolean: 'and',\n });\n\n this._bindings.push(...values);\n return this;\n }\n\n /**\n * Add a where null clause\n */\n whereNull(column: string): this {\n this._wheres.push({\n column,\n operator: 'is null',\n value: null,\n boolean: 'and',\n });\n\n return this;\n }\n\n /**\n * Add a where not null clause\n */\n whereNotNull(column: string): this {\n this._wheres.push({\n column,\n operator: 'is not null',\n value: null,\n boolean: 'and',\n });\n\n return this;\n }\n\n /**\n * Add a where between clause\n */\n whereBetween(column: string, values: [any, any]): this {\n this._wheres.push({\n column,\n operator: 'between',\n value: values,\n boolean: 'and',\n });\n\n this._bindings.push(...values);\n return this;\n }\n\n /**\n * Add a raw where clause\n */\n whereRaw(sql: string, bindings: any[] = []): this {\n this._wheres.push({\n column: new Expression(sql) as any,\n operator: 'raw',\n value: null,\n boolean: 'and',\n });\n\n this._bindings.push(...bindings);\n return this;\n }\n\n /**\n * Add a join clause\n */\n join(table: string, first: string, operator: string = '=', second?: string): this {\n this._joins.push({\n type: 'inner',\n table,\n first,\n operator,\n second,\n });\n\n return this;\n }\n\n /**\n * Add a left join clause\n */\n leftJoin(table: string, first: string, operator: string = '=', second?: string): this {\n this._joins.push({\n type: 'left',\n table,\n first,\n operator,\n second,\n });\n\n return this;\n }\n\n /**\n * Add a right join clause\n */\n rightJoin(table: string, first: string, operator: string = '=', second?: string): this {\n this._joins.push({\n type: 'right',\n table,\n first,\n operator,\n second,\n });\n\n return this;\n }\n\n /**\n * Add an order by clause\n */\n orderBy(column: string, direction: OrderDirection = 'asc'): this {\n this._orders.push({ column, direction });\n return this;\n }\n\n /**\n * Order by latest (descending created_at)\n */\n latest(column: string = 'created_at'): this {\n return this.orderBy(column, 'desc');\n }\n\n /**\n * Order by oldest (ascending created_at)\n */\n oldest(column: string = 'created_at'): this {\n return this.orderBy(column, 'asc');\n }\n\n /**\n * Add a group by clause\n */\n groupBy(...columns: string[]): this {\n this._groups.push(...columns);\n return this;\n }\n\n /**\n * Add a having clause\n */\n having(column: string, operator?: string, value?: any): this {\n if (arguments.length === 2) {\n value = operator;\n operator = '=';\n }\n\n this._havings.push({ column, operator, value });\n\n if (value !== undefined && value !== null) {\n this._bindings.push(value);\n }\n\n return this;\n }\n\n /**\n * Set the limit\n */\n limit(value: number): this {\n this._limit = value;\n return this;\n }\n\n /**\n * Alias for limit\n */\n take(value: number): this {\n return this.limit(value);\n }\n\n /**\n * Set the offset\n */\n offset(value: number): this {\n this._offset = value;\n return this;\n }\n\n /**\n * Alias for offset\n */\n skip(value: number): this {\n return this.offset(value);\n }\n\n /**\n * Get all records\n */\n async get(): Promise<T[]> {\n const sql = this.toSql();\n const results = await this.adapter.select<T>(sql, this.getBindings());\n return results;\n }\n\n /**\n * Get the first record\n */\n async first(): Promise<T | null> {\n const results = await this.limit(1).get();\n return results[0] || null;\n }\n\n /**\n * Find a record by ID\n */\n async find(id: any): Promise<T | null> {\n return this.where('id', '=', id).first();\n }\n\n /**\n * Get a single column's value\n */\n async value(column: string): Promise<any> {\n const result = await this.select(column).first();\n return result ? (result as any)[column] : null;\n }\n\n /**\n * Get an array of column values\n */\n async pluck(column: string): Promise<any[]> {\n const results = await this.select(column).get();\n return results.map((row) => (row as any)[column]);\n }\n\n /**\n * Determine if any rows exist\n */\n async exists(): Promise<boolean> {\n const count = await this.count();\n return count > 0;\n }\n\n /**\n * Get the count of records\n */\n async count(column: string = '*'): Promise<number> {\n return this.aggregate('COUNT', column);\n }\n\n /**\n * Get the maximum value of a column\n */\n async max(column: string): Promise<number | null> {\n return this.aggregate('MAX', column);\n }\n\n /**\n * Get the minimum value of a column\n */\n async min(column: string): Promise<number | null> {\n return this.aggregate('MIN', column);\n }\n\n /**\n * Get the average value of a column\n */\n async avg(column: string): Promise<number | null> {\n return this.aggregate('AVG', column);\n }\n\n /**\n * Get the sum of a column's values\n */\n async sum(column: string): Promise<number> {\n return this.aggregate('SUM', column) || 0;\n }\n\n /**\n * Execute an aggregate function\n */\n protected async aggregate(func: string, column: string): Promise<any> {\n const previousColumns = this._columns;\n const previousBindings = this._bindings.slice();\n\n this.selectRaw(`${func}(${column}) as aggregate`);\n\n const result = await this.first();\n\n this._columns = previousColumns;\n this._bindings = previousBindings;\n\n return result ? (result as any)['aggregate'] : null;\n }\n\n /**\n * Insert a new record\n */\n insert(values: Record<string, any> | Record<string, any>[]): Promise<boolean> & {\n returning(columns?: string | string[]): Promise<any | any[]>;\n } {\n const returningFn = (columns?: string | string[]) => this.insertReturning(values, columns);\n const exec = () => this.executeInsert(values);\n const chain: any = {\n returning: returningFn,\n then: (onfulfilled: any, onrejected: any) => exec().then(onfulfilled, onrejected),\n catch: (onrejected: any) => exec().catch(onrejected),\n finally: (onfinally: any) => exec().finally(onfinally),\n };\n return chain as Promise<boolean> & { returning: typeof returningFn };\n }\n\n protected async executeInsert(values: Record<string, any> | Record<string, any>[]): Promise<boolean> {\n if (!this._table) {\n throw new Error('Cannot insert without specifying a table');\n }\n\n const records = Array.isArray(values) ? values : [values];\n if (records.length === 0) {\n return true;\n }\n\n const columns = Object.keys(records[0]);\n const placeholders = records.map(() => `(${columns.map(() => '?').join(', ')})`).join(', ');\n const bindings = records.flatMap((record) => columns.map((col) => record[col]));\n const sql = `INSERT INTO ${this._table} (${columns.join(', ')}) VALUES ${placeholders}`;\n await this.adapter.insert(sql, bindings);\n return true;\n }\n\n /**\n * Specify returning columns for insert/update operations\n */\n returning(columns?: string | string[]): this {\n if (!columns) {\n this._returning = ['*'];\n } else if (Array.isArray(columns)) {\n this._returning = columns;\n } else {\n this._returning = [columns];\n }\n return this;\n }\n\n /**\n * Insert and return selected columns\n * - Single insert: returns one row (object)\n * - Bulk insert: returns array of rows\n * - Fallbacks for drivers without RETURNING (e.g., MySQL)\n */\n async insertReturning(\n values: Record<string, any> | Record<string, any>[],\n columns?: string | string[]\n ): Promise<any | any[]> {\n if (!this._table) {\n throw new Error('Cannot insert without specifying a table');\n }\n\n const records = Array.isArray(values) ? values : [values];\n if (records.length === 0) {\n return Array.isArray(values) ? [] : null;\n }\n\n const insertCols = Object.keys(records[0]);\n const placeholders = records.map(() => `(${insertCols.map(() => '?').join(', ')})`).join(', ');\n const bindings = records.flatMap((record) => insertCols.map((col) => record[col]));\n\n const retCols =\n columns === undefined\n ? this._returning && this._returning.length > 0\n ? this._returning\n : ['*']\n : Array.isArray(columns)\n ? columns\n : [columns];\n\n const sqlWithReturning = `INSERT INTO ${this._table} (${insertCols.join(', ')}) VALUES ${placeholders} RETURNING ${retCols.join(\n ', '\n )}`;\n\n try {\n const rows = await this.adapter.select<any>(sqlWithReturning, bindings);\n // Reset returning state after use\n this._returning = undefined;\n return records.length === 1 ? (rows[0] ?? null) : rows;\n } catch (error) {\n // Fallback for drivers without RETURNING (e.g., MySQL)\n const sqlNoReturning = `INSERT INTO ${this._table} (${insertCols.join(', ')}) VALUES ${placeholders}`;\n const insertResult = await this.adapter.insert(sqlNoReturning, bindings);\n\n // Only supported fallback: single-row insert by primary key ID\n if (records.length === 1) {\n const id = insertResult;\n // If no id is obtainable, return minimal best-effort (null)\n if (id === undefined || id === null) {\n this._returning = undefined;\n return null;\n }\n\n const selectCols = retCols.join(', ');\n const row = await this.adapter.select<any>(`SELECT ${selectCols} FROM ${this._table} WHERE id = ? LIMIT 1`, [\n id,\n ]);\n this._returning = undefined;\n return row[0] ?? null;\n }\n\n // Bulk insert not supported on drivers without RETURNING\n throw new Error(\n 'returning() is not supported for bulk inserts on this driver. Insert succeeded without returning rows.'\n );\n }\n }\n\n /**\n * Insert a new record and get the ID\n */\n async insertGetId(values: Record<string, any>, sequence?: string): Promise<any> {\n if (!this._table) {\n throw new Error('Cannot insert without specifying a table');\n }\n\n const columns = Object.keys(values);\n const placeholders = columns.map(() => '?').join(', ');\n const bindings = columns.map((col) => values[col]);\n\n const sql = `INSERT INTO ${this._table} (${columns.join(', ')}) VALUES (${placeholders})`;\n\n return await this.adapter.insert(sql, bindings);\n }\n\n /**\n * Update records\n */\n async update(values: Record<string, any>): Promise<number> {\n if (!this._table) {\n throw new Error('Cannot update without specifying a table');\n }\n\n const sets = Object.keys(values)\n .map((key) => `${key} = ?`)\n .join(', ');\n\n const bindings = [...Object.values(values), ...this.getBindings()];\n\n let sql = `UPDATE ${this._table} SET ${sets}`;\n\n if (this._wheres.length > 0) {\n sql += ' WHERE ' + this.compileWheres();\n }\n\n return await this.adapter.update(sql, bindings);\n }\n\n /**\n * Delete records\n */\n async delete(): Promise<number> {\n if (!this._table) {\n throw new Error('Cannot delete without specifying a table');\n }\n\n let sql = `DELETE FROM ${this._table}`;\n\n if (this._wheres.length > 0) {\n sql += ' WHERE ' + this.compileWheres();\n }\n\n return await this.adapter.delete(sql, this.getBindings());\n }\n\n /**\n * Truncate the table\n */\n async truncate(): Promise<void> {\n if (!this._table) {\n throw new Error('Cannot truncate without specifying a table');\n }\n\n const sql = `TRUNCATE TABLE ${this._table}`;\n await this.adapter.query(sql);\n }\n\n /**\n * Get the SQL query string\n */\n toSql(): string {\n if (!this._table) {\n throw new Error('Cannot generate SQL without specifying a table');\n }\n\n let sql = 'SELECT ';\n\n if (this._distinct) {\n sql += 'DISTINCT ';\n }\n\n sql += this.compileColumns();\n sql += ` FROM ${this._table}`;\n\n if (this._joins.length > 0) {\n sql += ' ' + this.compileJoins();\n }\n\n if (this._wheres.length > 0) {\n sql += ' WHERE ' + this.compileWheres();\n }\n\n if (this._groups.length > 0) {\n sql += ' GROUP BY ' + this._groups.join(', ');\n }\n\n if (this._havings.length > 0) {\n sql += ' HAVING ' + this.compileHavings();\n }\n\n if (this._orders.length > 0) {\n sql += ' ORDER BY ' + this.compileOrders();\n }\n\n if (this._limit !== undefined) {\n sql += ` LIMIT ${this._limit}`;\n }\n\n if (this._offset !== undefined) {\n sql += ` OFFSET ${this._offset}`;\n }\n\n return sql;\n }\n\n /**\n * Compile the columns\n */\n protected compileColumns(): string {\n return this._columns\n .map((col) => (typeof col === 'object' && col && 'getValue' in col ? (col as Expression).getValue() : col))\n .join(', ');\n }\n\n /**\n * Compile the where clauses\n */\n protected compileWheres(): string {\n return this._wheres\n .map((where, index) => {\n const boolean = index === 0 ? '' : ` ${where.boolean.toUpperCase()} `;\n\n if (where.operator === 'raw') {\n return (\n boolean +\n (typeof where.column === 'object' && where.column && 'getValue' in where.column\n ? (where.column as Expression).getValue()\n : where.column)\n );\n }\n\n if (where.operator === 'in' || where.operator === 'not in') {\n const placeholders = (where.value as any[]).map(() => '?').join(', ');\n return `${boolean}${where.column} ${where.operator.toUpperCase()} (${placeholders})`;\n }\n\n if (where.operator === 'between') {\n return `${boolean}${where.column} BETWEEN ? AND ?`;\n }\n\n if (where.operator === 'is null' || where.operator === 'is not null') {\n return `${boolean}${where.column} ${where.operator.toUpperCase()}`;\n }\n\n return `${boolean}${where.column} ${where.operator} ?`;\n })\n .join('');\n }\n\n /**\n * Compile the join clauses\n */\n protected compileJoins(): string {\n return this._joins\n .map((join) => {\n const type = join.type.toUpperCase();\n return `${type} JOIN ${join.table} ON ${join.first} ${join.operator} ${join.second}`;\n })\n .join(' ');\n }\n\n /**\n * Compile the order by clauses\n */\n protected compileOrders(): string {\n return this._orders.map((order) => `${order.column} ${order.direction.toUpperCase()}`).join(', ');\n }\n\n /**\n * Compile the having clauses\n */\n protected compileHavings(): string {\n return this._havings\n .map((having, index) => {\n const boolean = index === 0 ? '' : ' AND ';\n return `${boolean}${having.column} ${having.operator} ?`;\n })\n .join('');\n }\n\n /**\n * Get the bindings for the query\n */\n getBindings(): any[] {\n return this._bindings;\n }\n\n /**\n * Clone the query builder\n */\n clone(): Builder<T> {\n const cloned = new Builder<T>(this.adapter);\n cloned._columns = [...this._columns];\n cloned._distinct = this._distinct;\n cloned._table = this._table;\n cloned._wheres = [...this._wheres];\n cloned._joins = [...this._joins];\n cloned._orders = [...this._orders];\n cloned._groups = [...this._groups];\n cloned._havings = [...this._havings];\n cloned._limit = this._limit;\n cloned._offset = this._offset;\n cloned._bindings = [...this._bindings];\n return cloned;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);var e=class{constructor(e){this.value=e}getValue(){return this.value}toString(){return this.value}};function t(t){return new e(t)}exports.Expression=e,exports.raw=t;
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);var e=class{value;constructor(e){this.value=e}getValue(){return this.value}toString(){return this.value}};function t(t){return new e(t)}exports.Expression=e,exports.raw=t;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=class{constructor(e){this.value=e}getValue(){return this.value}toString(){return this.value}};function t(t){return new e(t)}export{e as Expression,t as raw};
|
|
1
|
+
var e=class{value;constructor(e){this.value=e}getValue(){return this.value}toString(){return this.value}};function t(t){return new e(t)}export{e as Expression,t as raw};
|
|
2
2
|
//# sourceMappingURL=Expression.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Expression.mjs","names":[],"sources":["../../../src/Database/Query/Expression.ts"],"sourcesContent":["/**\n * Expression Class\n *\n * Represents a raw SQL expression\n */\n\nexport class Expression {\n constructor(private readonly value: string) {}\n\n /**\n * Get the value of the expression\n */\n getValue(): string {\n return this.value;\n }\n\n /**\n * Convert the expression to a string\n */\n toString(): string {\n return this.value;\n }\n}\n\n/**\n * Create a new raw expression\n */\nexport function raw(value: string): Expression {\n return new Expression(value);\n}\n"],"mappings":"AAMA,IAAa,EAAb,KAAwB,
|
|
1
|
+
{"version":3,"file":"Expression.mjs","names":[],"sources":["../../../src/Database/Query/Expression.ts"],"sourcesContent":["/**\n * Expression Class\n *\n * Represents a raw SQL expression\n */\n\nexport class Expression {\n constructor(private readonly value: string) {}\n\n /**\n * Get the value of the expression\n */\n getValue(): string {\n return this.value;\n }\n\n /**\n * Convert the expression to a string\n */\n toString(): string {\n return this.value;\n }\n}\n\n/**\n * Create a new raw expression\n */\nexport function raw(value: string): Expression {\n return new Expression(value);\n}\n"],"mappings":"AAMA,IAAa,EAAb,KAAwB,CACO,MAA7B,YAAY,EAAgC,CAAf,KAAA,MAAA,EAK7B,UAAmB,CACjB,OAAO,KAAK,MAMd,UAAmB,CACjB,OAAO,KAAK,QAOhB,SAAgB,EAAI,EAA2B,CAC7C,OAAO,IAAI,EAAW,EAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`../../_virtual/_rolldown/runtime.cjs`);let t=require(`path`);t=e.__toESM(t);let n=require(`fs`);n=e.__toESM(n);var r=class{constructor(e,t){this.connection=e,this.paths=t}async run(e){let t;t=e?new e:new(await(this.resolveDatabaseSeeder())),t.setConnection(this.connection),await t.run()}async runByName(e){let t=await this.resolveSeeder(e);await this.run(t)}async resolveDatabaseSeeder(){for(let e of this.paths){let r=t.join(e,`DatabaseSeeder`);if(n.existsSync(r+`.ts`))return await this.importSeeder(r+`.ts`);if(n.existsSync(r+`.js`))return await this.importSeeder(r+`.js`)}throw Error(`DatabaseSeeder not found`)}async resolveSeeder(e){for(let r of this.paths){let i=t.join(r,e);if(n.existsSync(i+`.ts`))return await this.importSeeder(i+`.ts`);if(n.existsSync(i+`.js`))return await this.importSeeder(i+`.js`)}throw Error(`Seeder not found: ${e}`)}async importSeeder(e){let t=await import(e),n=t.default||Object.values(t)[0];if(!n)throw Error(`No seeder class found in: ${e}`);return n}setPaths(e){this.paths=e}getPaths(){return this.paths}};exports.SeederRunner=r;
|
|
1
|
+
const e=require(`../../_virtual/_rolldown/runtime.cjs`);let t=require(`path`);t=e.__toESM(t,1);let n=require(`fs`);n=e.__toESM(n,1);var r=class{connection;paths;constructor(e,t){this.connection=e,this.paths=t}async run(e){let t;t=e?new e:new(await(this.resolveDatabaseSeeder())),t.setConnection(this.connection),await t.run()}async runByName(e){let t=await this.resolveSeeder(e);await this.run(t)}async resolveDatabaseSeeder(){for(let e of this.paths){let r=t.join(e,`DatabaseSeeder`);if(n.existsSync(r+`.ts`))return await this.importSeeder(r+`.ts`);if(n.existsSync(r+`.js`))return await this.importSeeder(r+`.js`)}throw Error(`DatabaseSeeder not found`)}async resolveSeeder(e){for(let r of this.paths){let i=t.join(r,e);if(n.existsSync(i+`.ts`))return await this.importSeeder(i+`.ts`);if(n.existsSync(i+`.js`))return await this.importSeeder(i+`.js`)}throw Error(`Seeder not found: ${e}`)}async importSeeder(e){let t=await import(e),n=t.default||Object.values(t)[0];if(!n)throw Error(`No seeder class found in: ${e}`);return n}setPaths(e){this.paths=e}getPaths(){return this.paths}};exports.SeederRunner=r;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import*as e from"path";import*as t from"fs";var n=class{constructor(e,t){this.connection=e,this.paths=t}async run(e){let t;t=e?new e:new(await(this.resolveDatabaseSeeder())),t.setConnection(this.connection),await t.run()}async runByName(e){let t=await this.resolveSeeder(e);await this.run(t)}async resolveDatabaseSeeder(){for(let n of this.paths){let r=e.join(n,`DatabaseSeeder`);if(t.existsSync(r+`.ts`))return await this.importSeeder(r+`.ts`);if(t.existsSync(r+`.js`))return await this.importSeeder(r+`.js`)}throw Error(`DatabaseSeeder not found`)}async resolveSeeder(n){for(let r of this.paths){let i=e.join(r,n);if(t.existsSync(i+`.ts`))return await this.importSeeder(i+`.ts`);if(t.existsSync(i+`.js`))return await this.importSeeder(i+`.js`)}throw Error(`Seeder not found: ${n}`)}async importSeeder(e){let t=await import(e),n=t.default||Object.values(t)[0];if(!n)throw Error(`No seeder class found in: ${e}`);return n}setPaths(e){this.paths=e}getPaths(){return this.paths}};export{n as SeederRunner};
|
|
1
|
+
import*as e from"path";import*as t from"fs";var n=class{connection;paths;constructor(e,t){this.connection=e,this.paths=t}async run(e){let t;t=e?new e:new(await(this.resolveDatabaseSeeder())),t.setConnection(this.connection),await t.run()}async runByName(e){let t=await this.resolveSeeder(e);await this.run(t)}async resolveDatabaseSeeder(){for(let n of this.paths){let r=e.join(n,`DatabaseSeeder`);if(t.existsSync(r+`.ts`))return await this.importSeeder(r+`.ts`);if(t.existsSync(r+`.js`))return await this.importSeeder(r+`.js`)}throw Error(`DatabaseSeeder not found`)}async resolveSeeder(n){for(let r of this.paths){let i=e.join(r,n);if(t.existsSync(i+`.ts`))return await this.importSeeder(i+`.ts`);if(t.existsSync(i+`.js`))return await this.importSeeder(i+`.js`)}throw Error(`Seeder not found: ${n}`)}async importSeeder(e){let t=await import(e),n=t.default||Object.values(t)[0];if(!n)throw Error(`No seeder class found in: ${e}`);return n}setPaths(e){this.paths=e}getPaths(){return this.paths}};export{n as SeederRunner};
|
|
2
2
|
//# sourceMappingURL=SeederRunner.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SeederRunner.mjs","names":[],"sources":["../../../src/Database/Seeders/SeederRunner.ts"],"sourcesContent":["/**\n * SeederRunner\n *\n * Runs database seeders\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { Connection } from '@/Database/Connection';\nimport { Seeder } from './Seeder';\n\nexport class SeederRunner {\n constructor(\n protected connection: Connection,\n protected paths: string[]\n ) {}\n\n /**\n * Run a specific seeder class\n */\n async run(seederClass?: new () => Seeder): Promise<void> {\n let seeder: Seeder;\n\n if (seederClass) {\n seeder = new seederClass();\n } else {\n // Try to find DatabaseSeeder\n const DatabaseSeeder = await this.resolveDatabaseSeeder();\n seeder = new DatabaseSeeder();\n }\n\n seeder.setConnection(this.connection);\n await seeder.run();\n }\n\n /**\n * Run a seeder by name\n */\n async runByName(name: string): Promise<void> {\n const SeederClass = await this.resolveSeeder(name);\n await this.run(SeederClass);\n }\n\n /**\n * Resolve the DatabaseSeeder class\n */\n protected async resolveDatabaseSeeder(): Promise<new () => Seeder> {\n for (const searchPath of this.paths) {\n const databaseSeederPath = path.join(searchPath, 'DatabaseSeeder');\n\n // Try with .ts extension\n if (fs.existsSync(databaseSeederPath + '.ts')) {\n return await this.importSeeder(databaseSeederPath + '.ts');\n }\n\n // Try with .js extension\n if (fs.existsSync(databaseSeederPath + '.js')) {\n return await this.importSeeder(databaseSeederPath + '.js');\n }\n }\n\n throw new Error('DatabaseSeeder not found');\n }\n\n /**\n * Resolve a seeder class by name\n */\n protected async resolveSeeder(name: string): Promise<new () => Seeder> {\n for (const searchPath of this.paths) {\n const seederPath = path.join(searchPath, name);\n\n // Try with .ts extension\n if (fs.existsSync(seederPath + '.ts')) {\n return await this.importSeeder(seederPath + '.ts');\n }\n\n // Try with .js extension\n if (fs.existsSync(seederPath + '.js')) {\n return await this.importSeeder(seederPath + '.js');\n }\n }\n\n throw new Error(`Seeder not found: ${name}`);\n }\n\n /**\n * Import a seeder file\n */\n protected async importSeeder(filePath: string): Promise<new () => Seeder> {\n const seederModule = await import(filePath);\n\n // Get the default export or the first class export\n const SeederClass = seederModule.default || Object.values(seederModule)[0];\n\n if (!SeederClass) {\n throw new Error(`No seeder class found in: ${filePath}`);\n }\n\n return SeederClass as new () => Seeder;\n }\n\n /**\n * Set the seeder paths\n */\n setPaths(paths: string[]): void {\n this.paths = paths;\n }\n\n /**\n * Get the seeder paths\n */\n getPaths(): string[] {\n return this.paths;\n }\n}\n"],"mappings":"4CAWA,IAAa,EAAb,KAA0B,
|
|
1
|
+
{"version":3,"file":"SeederRunner.mjs","names":[],"sources":["../../../src/Database/Seeders/SeederRunner.ts"],"sourcesContent":["/**\n * SeederRunner\n *\n * Runs database seeders\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { Connection } from '@/Database/Connection';\nimport { Seeder } from './Seeder';\n\nexport class SeederRunner {\n constructor(\n protected connection: Connection,\n protected paths: string[]\n ) {}\n\n /**\n * Run a specific seeder class\n */\n async run(seederClass?: new () => Seeder): Promise<void> {\n let seeder: Seeder;\n\n if (seederClass) {\n seeder = new seederClass();\n } else {\n // Try to find DatabaseSeeder\n const DatabaseSeeder = await this.resolveDatabaseSeeder();\n seeder = new DatabaseSeeder();\n }\n\n seeder.setConnection(this.connection);\n await seeder.run();\n }\n\n /**\n * Run a seeder by name\n */\n async runByName(name: string): Promise<void> {\n const SeederClass = await this.resolveSeeder(name);\n await this.run(SeederClass);\n }\n\n /**\n * Resolve the DatabaseSeeder class\n */\n protected async resolveDatabaseSeeder(): Promise<new () => Seeder> {\n for (const searchPath of this.paths) {\n const databaseSeederPath = path.join(searchPath, 'DatabaseSeeder');\n\n // Try with .ts extension\n if (fs.existsSync(databaseSeederPath + '.ts')) {\n return await this.importSeeder(databaseSeederPath + '.ts');\n }\n\n // Try with .js extension\n if (fs.existsSync(databaseSeederPath + '.js')) {\n return await this.importSeeder(databaseSeederPath + '.js');\n }\n }\n\n throw new Error('DatabaseSeeder not found');\n }\n\n /**\n * Resolve a seeder class by name\n */\n protected async resolveSeeder(name: string): Promise<new () => Seeder> {\n for (const searchPath of this.paths) {\n const seederPath = path.join(searchPath, name);\n\n // Try with .ts extension\n if (fs.existsSync(seederPath + '.ts')) {\n return await this.importSeeder(seederPath + '.ts');\n }\n\n // Try with .js extension\n if (fs.existsSync(seederPath + '.js')) {\n return await this.importSeeder(seederPath + '.js');\n }\n }\n\n throw new Error(`Seeder not found: ${name}`);\n }\n\n /**\n * Import a seeder file\n */\n protected async importSeeder(filePath: string): Promise<new () => Seeder> {\n const seederModule = await import(filePath);\n\n // Get the default export or the first class export\n const SeederClass = seederModule.default || Object.values(seederModule)[0];\n\n if (!SeederClass) {\n throw new Error(`No seeder class found in: ${filePath}`);\n }\n\n return SeederClass as new () => Seeder;\n }\n\n /**\n * Set the seeder paths\n */\n setPaths(paths: string[]): void {\n this.paths = paths;\n }\n\n /**\n * Get the seeder paths\n */\n getPaths(): string[] {\n return this.paths;\n }\n}\n"],"mappings":"4CAWA,IAAa,EAAb,KAA0B,CAEZ,WACA,MAFZ,YACE,EACA,EACA,CAFU,KAAA,WAAA,EACA,KAAA,MAAA,EAMZ,MAAM,IAAI,EAA+C,CACvD,IAAI,EAEJ,AAKE,EALE,EACO,IAAI,EAIJ,IAAI,MADgB,KAAK,uBAAuB,GAI3D,EAAO,cAAc,KAAK,WAAW,CACrC,MAAM,EAAO,KAAK,CAMpB,MAAM,UAAU,EAA6B,CAC3C,IAAM,EAAc,MAAM,KAAK,cAAc,EAAK,CAClD,MAAM,KAAK,IAAI,EAAY,CAM7B,MAAgB,uBAAmD,CACjE,IAAK,IAAM,KAAc,KAAK,MAAO,CACnC,IAAM,EAAqB,EAAK,KAAK,EAAY,iBAAiB,CAGlE,GAAI,EAAG,WAAW,EAAqB,MAAM,CAC3C,OAAO,MAAM,KAAK,aAAa,EAAqB,MAAM,CAI5D,GAAI,EAAG,WAAW,EAAqB,MAAM,CAC3C,OAAO,MAAM,KAAK,aAAa,EAAqB,MAAM,CAI9D,MAAU,MAAM,2BAA2B,CAM7C,MAAgB,cAAc,EAAyC,CACrE,IAAK,IAAM,KAAc,KAAK,MAAO,CACnC,IAAM,EAAa,EAAK,KAAK,EAAY,EAAK,CAG9C,GAAI,EAAG,WAAW,EAAa,MAAM,CACnC,OAAO,MAAM,KAAK,aAAa,EAAa,MAAM,CAIpD,GAAI,EAAG,WAAW,EAAa,MAAM,CACnC,OAAO,MAAM,KAAK,aAAa,EAAa,MAAM,CAItD,MAAU,MAAM,qBAAqB,IAAO,CAM9C,MAAgB,aAAa,EAA6C,CACxE,IAAM,EAAe,MAAM,OAAO,GAG5B,EAAc,EAAa,SAAW,OAAO,OAAO,EAAa,CAAC,GAExE,GAAI,CAAC,EACH,MAAU,MAAM,6BAA6B,IAAW,CAG1D,OAAO,EAMT,SAAS,EAAuB,CAC9B,KAAK,MAAQ,EAMf,UAAqB,CACnB,OAAO,KAAK"}
|
package/dist/Deploy/Deployer.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./SSHConnection.cjs`);var t=class{constructor(e){this.client=e}async deployToServer(t,n){let{tarPath:r,timestamp:i,deploymentUuid:a,projectSlug:o,keyPath:s,migrate:c}=n,l=new e.SSHConnection({host:t.host,user:t.ssh_user,port:t.port,keyPath:s}),u=t.deploy_path,d=`${u}/releases/${i}`,f=`${u}/current`,p=`${u}/shared/.env`,m=`${u}/shared/storage`,h=`${d}/deploy.tar.gz`,g=[],_=(e,t)=>{t&&g.push(`→ ${t}`);let n=l.exec(e,{silent:!0});n.trim()&&g.push(n.trim())};try{return _(`mkdir -p "${d}"`,`Creating release directory`),g.push(`→ Uploading build artifact`),l.upload(r,h),_(`tar -xzf "${h}" -C "${d}" && rm "${h}"`,`Extracting`),_(`cd "${d}" && npm install --omit=dev --no-audit --no-fund 2>&1`,`Installing dependencies`),_(`[ -f "${p}" ] && ln -sf "${p}" "${d}/.env" || true`,`Linking .env`),_(`[ -d "${m}" ] && ln -sf "${m}" "${d}/storage" || true`,`Linking storage`),c&&_(`cd "${d}" && npx orchestr migrate 2>&1`,`Running migrations`),_(`ln -sfn "${d}" "${f}"`,`Activating release`),_(`cd "${f}" && ECOSYSTEM=$([ -f ecosystem.config.cjs ] && echo ecosystem.config.cjs || echo ecosystem.config.js) && (pm2 reload "$ECOSYSTEM" --update-env 2>&1 || pm2 start "$ECOSYSTEM" 2>&1)`,`Reloading PM2`),_(`ls -dt "${u}/releases"/*/ 2>/dev/null | tail -n +6 | xargs rm -rf 2>/dev/null || true`,`Cleaning old releases`),await this.client.updateDeployment(o,a,{status:`active`,log:g.join(`
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./SSHConnection.cjs`);var t=class{client;constructor(e){this.client=e}async deployToServer(t,n){let{tarPath:r,timestamp:i,deploymentUuid:a,projectSlug:o,keyPath:s,migrate:c}=n,l=new e.SSHConnection({host:t.host,user:t.ssh_user,port:t.port,keyPath:s}),u=t.deploy_path,d=`${u}/releases/${i}`,f=`${u}/current`,p=`${u}/shared/.env`,m=`${u}/shared/storage`,h=`${d}/deploy.tar.gz`,g=[],_=(e,t)=>{t&&g.push(`→ ${t}`);let n=l.exec(e,{silent:!0});n.trim()&&g.push(n.trim())};try{return _(`mkdir -p "${d}"`,`Creating release directory`),g.push(`→ Uploading build artifact`),l.upload(r,h),_(`tar -xzf "${h}" -C "${d}" && rm "${h}"`,`Extracting`),_(`cd "${d}" && npm install --omit=dev --no-audit --no-fund 2>&1`,`Installing dependencies`),_(`[ -f "${p}" ] && ln -sf "${p}" "${d}/.env" || true`,`Linking .env`),_(`[ -d "${m}" ] && ln -sf "${m}" "${d}/storage" || true`,`Linking storage`),c&&_(`cd "${d}" && npx orchestr migrate 2>&1`,`Running migrations`),_(`ln -sfn "${d}" "${f}"`,`Activating release`),_(`cd "${f}" && ECOSYSTEM=$([ -f ecosystem.config.cjs ] && echo ecosystem.config.cjs || echo ecosystem.config.js) && (pm2 reload "$ECOSYSTEM" --update-env 2>&1 || pm2 start "$ECOSYSTEM" 2>&1)`,`Reloading PM2`),_(`ls -dt "${u}/releases"/*/ 2>/dev/null | tail -n +6 | xargs rm -rf 2>/dev/null || true`,`Cleaning old releases`),await this.client.updateDeployment(o,a,{status:`active`,log:g.join(`
|
|
2
2
|
`)}),g.join(`
|
|
3
3
|
`)}catch(e){let t=e.message;throw g.push(`✗ Error: ${t}`),await this.client.updateDeployment(o,a,{status:`failed`,log:g.join(`
|
|
4
4
|
`)}).catch(()=>{}),Error(g.join(`
|
package/dist/Deploy/Deployer.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{SSHConnection as e}from"./SSHConnection.mjs";var t=class{constructor(e){this.client=e}async deployToServer(t,n){let{tarPath:r,timestamp:i,deploymentUuid:a,projectSlug:o,keyPath:s,migrate:c}=n,l=new e({host:t.host,user:t.ssh_user,port:t.port,keyPath:s}),u=t.deploy_path,d=`${u}/releases/${i}`,f=`${u}/current`,p=`${u}/shared/.env`,m=`${u}/shared/storage`,h=`${d}/deploy.tar.gz`,g=[],_=(e,t)=>{t&&g.push(`→ ${t}`);let n=l.exec(e,{silent:!0});n.trim()&&g.push(n.trim())};try{return _(`mkdir -p "${d}"`,`Creating release directory`),g.push(`→ Uploading build artifact`),l.upload(r,h),_(`tar -xzf "${h}" -C "${d}" && rm "${h}"`,`Extracting`),_(`cd "${d}" && npm install --omit=dev --no-audit --no-fund 2>&1`,`Installing dependencies`),_(`[ -f "${p}" ] && ln -sf "${p}" "${d}/.env" || true`,`Linking .env`),_(`[ -d "${m}" ] && ln -sf "${m}" "${d}/storage" || true`,`Linking storage`),c&&_(`cd "${d}" && npx orchestr migrate 2>&1`,`Running migrations`),_(`ln -sfn "${d}" "${f}"`,`Activating release`),_(`cd "${f}" && ECOSYSTEM=$([ -f ecosystem.config.cjs ] && echo ecosystem.config.cjs || echo ecosystem.config.js) && (pm2 reload "$ECOSYSTEM" --update-env 2>&1 || pm2 start "$ECOSYSTEM" 2>&1)`,`Reloading PM2`),_(`ls -dt "${u}/releases"/*/ 2>/dev/null | tail -n +6 | xargs rm -rf 2>/dev/null || true`,`Cleaning old releases`),await this.client.updateDeployment(o,a,{status:`active`,log:g.join(`
|
|
1
|
+
import{SSHConnection as e}from"./SSHConnection.mjs";var t=class{client;constructor(e){this.client=e}async deployToServer(t,n){let{tarPath:r,timestamp:i,deploymentUuid:a,projectSlug:o,keyPath:s,migrate:c}=n,l=new e({host:t.host,user:t.ssh_user,port:t.port,keyPath:s}),u=t.deploy_path,d=`${u}/releases/${i}`,f=`${u}/current`,p=`${u}/shared/.env`,m=`${u}/shared/storage`,h=`${d}/deploy.tar.gz`,g=[],_=(e,t)=>{t&&g.push(`→ ${t}`);let n=l.exec(e,{silent:!0});n.trim()&&g.push(n.trim())};try{return _(`mkdir -p "${d}"`,`Creating release directory`),g.push(`→ Uploading build artifact`),l.upload(r,h),_(`tar -xzf "${h}" -C "${d}" && rm "${h}"`,`Extracting`),_(`cd "${d}" && npm install --omit=dev --no-audit --no-fund 2>&1`,`Installing dependencies`),_(`[ -f "${p}" ] && ln -sf "${p}" "${d}/.env" || true`,`Linking .env`),_(`[ -d "${m}" ] && ln -sf "${m}" "${d}/storage" || true`,`Linking storage`),c&&_(`cd "${d}" && npx orchestr migrate 2>&1`,`Running migrations`),_(`ln -sfn "${d}" "${f}"`,`Activating release`),_(`cd "${f}" && ECOSYSTEM=$([ -f ecosystem.config.cjs ] && echo ecosystem.config.cjs || echo ecosystem.config.js) && (pm2 reload "$ECOSYSTEM" --update-env 2>&1 || pm2 start "$ECOSYSTEM" 2>&1)`,`Reloading PM2`),_(`ls -dt "${u}/releases"/*/ 2>/dev/null | tail -n +6 | xargs rm -rf 2>/dev/null || true`,`Cleaning old releases`),await this.client.updateDeployment(o,a,{status:`active`,log:g.join(`
|
|
2
2
|
`)}),g.join(`
|
|
3
3
|
`)}catch(e){let t=e.message;throw g.push(`✗ Error: ${t}`),await this.client.updateDeployment(o,a,{status:`failed`,log:g.join(`
|
|
4
4
|
`)}).catch(()=>{}),Error(g.join(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Deployer.mjs","names":[],"sources":["../../src/Deploy/Deployer.ts"],"sourcesContent":["/**\n * Deployer\n *\n * SSH deployment pipeline — upload tarball, extract, npm ci,\n * symlink shared resources, atomic symlink swap, PM2 reload.\n */\n\nimport { execSync } from 'child_process';\nimport { SSHConnection } from './SSHConnection';\nimport { SymphonyClient } from './SymphonyClient';\n\nexport interface ServerConfig {\n id: number;\n name: string;\n host: string;\n port: number;\n ssh_user: string;\n deploy_path: string;\n}\n\nexport interface DeployOptions {\n projectSlug: string;\n tarPath: string;\n timestamp: string;\n deploymentUuid: string;\n keyPath?: string;\n migrate?: boolean;\n}\n\nexport class Deployer {\n constructor(private readonly client: SymphonyClient) {}\n\n /**\n * Deploy to a single server. Returns log output.\n */\n async deployToServer(server: ServerConfig, options: DeployOptions): Promise<string> {\n const { tarPath, timestamp, deploymentUuid, projectSlug, keyPath, migrate } = options;\n const ssh = new SSHConnection({\n host: server.host,\n user: server.ssh_user,\n port: server.port,\n keyPath,\n });\n\n const deployPath = server.deploy_path;\n const releasePath = `${deployPath}/releases/${timestamp}`;\n const currentPath = `${deployPath}/current`;\n const sharedEnvPath = `${deployPath}/shared/.env`;\n const sharedStoragePath = `${deployPath}/shared/storage`;\n const remoteTar = `${releasePath}/deploy.tar.gz`;\n\n const log: string[] = [];\n const run = (cmd: string, label?: string) => {\n if (label) log.push(`→ ${label}`);\n const out = ssh.exec(cmd, { silent: true });\n if (out.trim()) log.push(out.trim());\n };\n\n try {\n // 1. Create release directory\n run(`mkdir -p \"${releasePath}\"`, 'Creating release directory');\n\n // 2. Upload tarball\n log.push('→ Uploading build artifact');\n ssh.upload(tarPath, remoteTar);\n\n // 3. Extract\n run(`tar -xzf \"${remoteTar}\" -C \"${releasePath}\" && rm \"${remoteTar}\"`, 'Extracting');\n\n // 4. Install production dependencies\n run(`cd \"${releasePath}\" && npm install --omit=dev --no-audit --no-fund 2>&1`, 'Installing dependencies');\n\n // 5. Link shared .env (if exists)\n run(`[ -f \"${sharedEnvPath}\" ] && ln -sf \"${sharedEnvPath}\" \"${releasePath}/.env\" || true`, 'Linking .env');\n\n // 6. Link shared storage (if exists)\n run(\n `[ -d \"${sharedStoragePath}\" ] && ln -sf \"${sharedStoragePath}\" \"${releasePath}/storage\" || true`,\n 'Linking storage'\n );\n\n // 7. Run migrations if requested\n if (migrate) {\n run(`cd \"${releasePath}\" && npx orchestr migrate 2>&1`, 'Running migrations');\n }\n\n // 8. Atomic symlink swap\n run(`ln -sfn \"${releasePath}\" \"${currentPath}\"`, 'Activating release');\n\n // 9. Reload PM2 (or start if first deploy)\n // Detect ecosystem config — prefer .cjs (ESM projects), fall back to .js\n run(\n `cd \"${currentPath}\" && ECOSYSTEM=$([ -f ecosystem.config.cjs ] && echo ecosystem.config.cjs || echo ecosystem.config.js) && (pm2 reload \"$ECOSYSTEM\" --update-env 2>&1 || pm2 start \"$ECOSYSTEM\" 2>&1)`,\n 'Reloading PM2'\n );\n\n // 10. Clean old releases (keep last 5)\n run(\n `ls -dt \"${deployPath}/releases\"/*/ 2>/dev/null | tail -n +6 | xargs rm -rf 2>/dev/null || true`,\n 'Cleaning old releases'\n );\n\n // Update deployment status to active\n await this.client.updateDeployment(projectSlug, deploymentUuid, {\n status: 'active',\n log: log.join('\\n'),\n });\n\n return log.join('\\n');\n } catch (error) {\n const errMsg = (error as Error).message;\n log.push(`✗ Error: ${errMsg}`);\n\n // Update deployment status to failed\n await this.client\n .updateDeployment(projectSlug, deploymentUuid, {\n status: 'failed',\n log: log.join('\\n'),\n })\n .catch(() => {});\n\n throw new Error(log.join('\\n'));\n }\n }\n}\n"],"mappings":"oDA6BA,IAAa,EAAb,KAAsB,
|
|
1
|
+
{"version":3,"file":"Deployer.mjs","names":[],"sources":["../../src/Deploy/Deployer.ts"],"sourcesContent":["/**\n * Deployer\n *\n * SSH deployment pipeline — upload tarball, extract, npm ci,\n * symlink shared resources, atomic symlink swap, PM2 reload.\n */\n\nimport { execSync } from 'child_process';\nimport { SSHConnection } from './SSHConnection';\nimport { SymphonyClient } from './SymphonyClient';\n\nexport interface ServerConfig {\n id: number;\n name: string;\n host: string;\n port: number;\n ssh_user: string;\n deploy_path: string;\n}\n\nexport interface DeployOptions {\n projectSlug: string;\n tarPath: string;\n timestamp: string;\n deploymentUuid: string;\n keyPath?: string;\n migrate?: boolean;\n}\n\nexport class Deployer {\n constructor(private readonly client: SymphonyClient) {}\n\n /**\n * Deploy to a single server. Returns log output.\n */\n async deployToServer(server: ServerConfig, options: DeployOptions): Promise<string> {\n const { tarPath, timestamp, deploymentUuid, projectSlug, keyPath, migrate } = options;\n const ssh = new SSHConnection({\n host: server.host,\n user: server.ssh_user,\n port: server.port,\n keyPath,\n });\n\n const deployPath = server.deploy_path;\n const releasePath = `${deployPath}/releases/${timestamp}`;\n const currentPath = `${deployPath}/current`;\n const sharedEnvPath = `${deployPath}/shared/.env`;\n const sharedStoragePath = `${deployPath}/shared/storage`;\n const remoteTar = `${releasePath}/deploy.tar.gz`;\n\n const log: string[] = [];\n const run = (cmd: string, label?: string) => {\n if (label) log.push(`→ ${label}`);\n const out = ssh.exec(cmd, { silent: true });\n if (out.trim()) log.push(out.trim());\n };\n\n try {\n // 1. Create release directory\n run(`mkdir -p \"${releasePath}\"`, 'Creating release directory');\n\n // 2. Upload tarball\n log.push('→ Uploading build artifact');\n ssh.upload(tarPath, remoteTar);\n\n // 3. Extract\n run(`tar -xzf \"${remoteTar}\" -C \"${releasePath}\" && rm \"${remoteTar}\"`, 'Extracting');\n\n // 4. Install production dependencies\n run(`cd \"${releasePath}\" && npm install --omit=dev --no-audit --no-fund 2>&1`, 'Installing dependencies');\n\n // 5. Link shared .env (if exists)\n run(`[ -f \"${sharedEnvPath}\" ] && ln -sf \"${sharedEnvPath}\" \"${releasePath}/.env\" || true`, 'Linking .env');\n\n // 6. Link shared storage (if exists)\n run(\n `[ -d \"${sharedStoragePath}\" ] && ln -sf \"${sharedStoragePath}\" \"${releasePath}/storage\" || true`,\n 'Linking storage'\n );\n\n // 7. Run migrations if requested\n if (migrate) {\n run(`cd \"${releasePath}\" && npx orchestr migrate 2>&1`, 'Running migrations');\n }\n\n // 8. Atomic symlink swap\n run(`ln -sfn \"${releasePath}\" \"${currentPath}\"`, 'Activating release');\n\n // 9. Reload PM2 (or start if first deploy)\n // Detect ecosystem config — prefer .cjs (ESM projects), fall back to .js\n run(\n `cd \"${currentPath}\" && ECOSYSTEM=$([ -f ecosystem.config.cjs ] && echo ecosystem.config.cjs || echo ecosystem.config.js) && (pm2 reload \"$ECOSYSTEM\" --update-env 2>&1 || pm2 start \"$ECOSYSTEM\" 2>&1)`,\n 'Reloading PM2'\n );\n\n // 10. Clean old releases (keep last 5)\n run(\n `ls -dt \"${deployPath}/releases\"/*/ 2>/dev/null | tail -n +6 | xargs rm -rf 2>/dev/null || true`,\n 'Cleaning old releases'\n );\n\n // Update deployment status to active\n await this.client.updateDeployment(projectSlug, deploymentUuid, {\n status: 'active',\n log: log.join('\\n'),\n });\n\n return log.join('\\n');\n } catch (error) {\n const errMsg = (error as Error).message;\n log.push(`✗ Error: ${errMsg}`);\n\n // Update deployment status to failed\n await this.client\n .updateDeployment(projectSlug, deploymentUuid, {\n status: 'failed',\n log: log.join('\\n'),\n })\n .catch(() => {});\n\n throw new Error(log.join('\\n'));\n }\n }\n}\n"],"mappings":"oDA6BA,IAAa,EAAb,KAAsB,CACS,OAA7B,YAAY,EAAyC,CAAxB,KAAA,OAAA,EAK7B,MAAM,eAAe,EAAsB,EAAyC,CAClF,GAAM,CAAE,UAAS,YAAW,iBAAgB,cAAa,UAAS,WAAY,EACxE,EAAM,IAAI,EAAc,CAC5B,KAAM,EAAO,KACb,KAAM,EAAO,SACb,KAAM,EAAO,KACb,UACD,CAAC,CAEI,EAAa,EAAO,YACpB,EAAc,GAAG,EAAW,YAAY,IACxC,EAAc,GAAG,EAAW,UAC5B,EAAgB,GAAG,EAAW,cAC9B,EAAoB,GAAG,EAAW,iBAClC,EAAY,GAAG,EAAY,gBAE3B,EAAgB,EAAE,CAClB,GAAO,EAAa,IAAmB,CACvC,GAAO,EAAI,KAAK,KAAK,IAAQ,CACjC,IAAM,EAAM,EAAI,KAAK,EAAK,CAAE,OAAQ,GAAM,CAAC,CACvC,EAAI,MAAM,EAAE,EAAI,KAAK,EAAI,MAAM,CAAC,EAGtC,GAAI,CAkDF,OAhDA,EAAI,aAAa,EAAY,GAAI,6BAA6B,CAG9D,EAAI,KAAK,6BAA6B,CACtC,EAAI,OAAO,EAAS,EAAU,CAG9B,EAAI,aAAa,EAAU,QAAQ,EAAY,WAAW,EAAU,GAAI,aAAa,CAGrF,EAAI,OAAO,EAAY,uDAAwD,0BAA0B,CAGzG,EAAI,SAAS,EAAc,iBAAiB,EAAc,KAAK,EAAY,gBAAiB,eAAe,CAG3G,EACE,SAAS,EAAkB,iBAAiB,EAAkB,KAAK,EAAY,mBAC/E,kBACD,CAGG,GACF,EAAI,OAAO,EAAY,gCAAiC,qBAAqB,CAI/E,EAAI,YAAY,EAAY,KAAK,EAAY,GAAI,qBAAqB,CAItE,EACE,OAAO,EAAY,sLACnB,gBACD,CAGD,EACE,WAAW,EAAW,2EACtB,wBACD,CAGD,MAAM,KAAK,OAAO,iBAAiB,EAAa,EAAgB,CAC9D,OAAQ,SACR,IAAK,EAAI,KAAK;EAAK,CACpB,CAAC,CAEK,EAAI,KAAK;EAAK,OACd,EAAO,CACd,IAAM,EAAU,EAAgB,QAWhC,MAVA,EAAI,KAAK,YAAY,IAAS,CAG9B,MAAM,KAAK,OACR,iBAAiB,EAAa,EAAgB,CAC7C,OAAQ,SACR,IAAK,EAAI,KAAK;EAAK,CACpB,CAAC,CACD,UAAY,GAAG,CAER,MAAM,EAAI,KAAK;EAAK,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectConfig.mjs","names":[],"sources":["../../src/Deploy/ProjectConfig.ts"],"sourcesContent":["/**\n * ProjectConfig\n *\n * Manages symphony.json in the project root\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\n\nexport interface SymphonyConfig {\n project: string;\n api: string;\n}\n\nexport class ProjectConfig {\n private static readonly FILENAME = 'symphony.json';\n\n private static getPath(cwd: string = process.cwd()): string {\n return join(cwd, this.FILENAME);\n }\n\n /**\n * Load symphony.json from the current working directory. Returns null if not found.\n */\n static load(cwd: string = process.cwd()): SymphonyConfig | null {\n const path = this.getPath(cwd);\n\n if (!existsSync(path)) {\n return null;\n }\n\n try {\n const raw = readFileSync(path, 'utf-8');\n return JSON.parse(raw) as SymphonyConfig;\n } catch {\n return null;\n }\n }\n\n /**\n * Save symphony.json to the current working directory.\n */\n static save(config: SymphonyConfig, cwd: string = process.cwd()): void {\n const path = this.getPath(cwd);\n writeFileSync(path, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n }\n\n /**\n * Check if symphony.json exists in the current working directory.\n */\n static exists(cwd: string = process.cwd()): boolean {\n return existsSync(this.getPath(cwd));\n }\n}\n"],"mappings":"iGAcA,IAAa,EAAb,KAA2B,CACzB,OAAwB,SAAW,gBAEnC,OAAe,QAAQ,EAAc,QAAQ,KAAK,CAAU,CAC1D,OAAO,EAAK,EAAK,KAAK,SAAS,CAMjC,OAAO,KAAK,EAAc,QAAQ,KAAK,CAAyB,CAC9D,IAAM,EAAO,KAAK,QAAQ,EAAI,CAE9B,GAAI,CAAC,EAAW,EAAK,CACnB,OAAO,KAGT,GAAI,CACF,IAAM,EAAM,EAAa,EAAM,QAAQ,CACvC,OAAO,KAAK,MAAM,EAAI,MAChB,CACN,OAAO,MAOX,OAAO,KAAK,EAAwB,EAAc,QAAQ,KAAK,CAAQ,CAErE,EADa,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"ProjectConfig.mjs","names":[],"sources":["../../src/Deploy/ProjectConfig.ts"],"sourcesContent":["/**\n * ProjectConfig\n *\n * Manages symphony.json in the project root\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\n\nexport interface SymphonyConfig {\n project: string;\n api: string;\n}\n\nexport class ProjectConfig {\n private static readonly FILENAME = 'symphony.json';\n\n private static getPath(cwd: string = process.cwd()): string {\n return join(cwd, this.FILENAME);\n }\n\n /**\n * Load symphony.json from the current working directory. Returns null if not found.\n */\n static load(cwd: string = process.cwd()): SymphonyConfig | null {\n const path = this.getPath(cwd);\n\n if (!existsSync(path)) {\n return null;\n }\n\n try {\n const raw = readFileSync(path, 'utf-8');\n return JSON.parse(raw) as SymphonyConfig;\n } catch {\n return null;\n }\n }\n\n /**\n * Save symphony.json to the current working directory.\n */\n static save(config: SymphonyConfig, cwd: string = process.cwd()): void {\n const path = this.getPath(cwd);\n writeFileSync(path, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n }\n\n /**\n * Check if symphony.json exists in the current working directory.\n */\n static exists(cwd: string = process.cwd()): boolean {\n return existsSync(this.getPath(cwd));\n }\n}\n"],"mappings":"iGAcA,IAAa,EAAb,KAA2B,CACzB,OAAwB,SAAW,gBAEnC,OAAe,QAAQ,EAAc,QAAQ,KAAK,CAAU,CAC1D,OAAO,EAAK,EAAK,KAAK,SAAS,CAMjC,OAAO,KAAK,EAAc,QAAQ,KAAK,CAAyB,CAC9D,IAAM,EAAO,KAAK,QAAQ,EAAI,CAE9B,GAAI,CAAC,EAAW,EAAK,CACnB,OAAO,KAGT,GAAI,CACF,IAAM,EAAM,EAAa,EAAM,QAAQ,CACvC,OAAO,KAAK,MAAM,EAAI,MAChB,CACN,OAAO,MAOX,OAAO,KAAK,EAAwB,EAAc,QAAQ,KAAK,CAAQ,CAErE,EADa,KAAK,QAAQ,EACR,CAAE,KAAK,UAAU,EAAQ,KAAM,EAAE,CAAG;EAAM,QAAQ,CAMtE,OAAO,OAAO,EAAc,QAAQ,KAAK,CAAW,CAClD,OAAO,EAAW,KAAK,QAAQ,EAAI,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./SSHConnection.cjs`);var t=class{ssh;domain;certEmail;deployPath;projectName;constructor(t){this.options=t,this.ssh=new e.SSHConnection({host:t.host,user:t.rootUser??`root`,port:t.port??22,keyPath:t.keyPath}),this.domain=t.domain,this.certEmail=t.email,this.deployPath=t.deployPath??`/home/orchestr`,this.projectName=t.projectName??`app`}async provision(e){let t=(t,n)=>{e?.(t),this.ssh.exec(n,{silent:!0})};t(`Updating package list`,`apt-get update -qq`),t(`Installing Node.js 22`,[`apt-get install -y -qq curl`,`curl -fsSL https://deb.nodesource.com/setup_22.x | bash -`,`apt-get install -y -qq nodejs`].join(` && `)),t(`Installing PM2`,`npm install -g pm2 --quiet && pm2 startup systemd -u orchestr --hp /home/orchestr || true`),t(`Installing Nginx`,`apt-get install -y -qq nginx`);let n=this.buildNginxConfig();t(`Configuring Nginx`,[`cat > /etc/nginx/sites-available/${this.projectName} << 'NGINX'\n${n}\nNGINX`,`ln -sf /etc/nginx/sites-available/${this.projectName} /etc/nginx/sites-enabled/${this.projectName}`,`rm -f /etc/nginx/sites-enabled/default`,`nginx -t && systemctl reload nginx`].join(` && `)),this.domain&&this.certEmail&&(t(`Installing Certbot`,`apt-get install -y -qq certbot python3-certbot-nginx`),t(`Obtaining SSL certificate for ${this.domain}`,`certbot --nginx -d ${this.domain} --non-interactive --agree-tos --email ${this.certEmail} --redirect`)),t(`Creating orchestr user`,[`id -u orchestr &>/dev/null || useradd -m -s /bin/bash orchestr`,`mkdir -p ${this.deployPath}/${this.projectName}/releases`,`mkdir -p ${this.deployPath}/${this.projectName}/shared`,`touch ${this.deployPath}/${this.projectName}/shared/.env`,`chown -R orchestr:orchestr ${this.deployPath}`].join(` && `)),t(`Configuring UFW firewall`,[`apt-get install -y -qq ufw`,`ufw --force reset`,`ufw allow 22/tcp`,`ufw allow 80/tcp`,`ufw allow 443/tcp`,`ufw --force enable`].join(` && `)),t(`Enabling services on boot`,`systemctl enable nginx`)}testConnection(){return this.ssh.test()}buildNginxConfig(){return`server {
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./SSHConnection.cjs`);var t=class{options;ssh;domain;certEmail;deployPath;projectName;constructor(t){this.options=t,this.ssh=new e.SSHConnection({host:t.host,user:t.rootUser??`root`,port:t.port??22,keyPath:t.keyPath}),this.domain=t.domain,this.certEmail=t.email,this.deployPath=t.deployPath??`/home/orchestr`,this.projectName=t.projectName??`app`}async provision(e){let t=(t,n)=>{e?.(t),this.ssh.exec(n,{silent:!0})};t(`Updating package list`,`apt-get update -qq`),t(`Installing Node.js 22`,[`apt-get install -y -qq curl`,`curl -fsSL https://deb.nodesource.com/setup_22.x | bash -`,`apt-get install -y -qq nodejs`].join(` && `)),t(`Installing PM2`,`npm install -g pm2 --quiet && pm2 startup systemd -u orchestr --hp /home/orchestr || true`),t(`Installing Nginx`,`apt-get install -y -qq nginx`);let n=this.buildNginxConfig();t(`Configuring Nginx`,[`cat > /etc/nginx/sites-available/${this.projectName} << 'NGINX'\n${n}\nNGINX`,`ln -sf /etc/nginx/sites-available/${this.projectName} /etc/nginx/sites-enabled/${this.projectName}`,`rm -f /etc/nginx/sites-enabled/default`,`nginx -t && systemctl reload nginx`].join(` && `)),this.domain&&this.certEmail&&(t(`Installing Certbot`,`apt-get install -y -qq certbot python3-certbot-nginx`),t(`Obtaining SSL certificate for ${this.domain}`,`certbot --nginx -d ${this.domain} --non-interactive --agree-tos --email ${this.certEmail} --redirect`)),t(`Creating orchestr user`,[`id -u orchestr &>/dev/null || useradd -m -s /bin/bash orchestr`,`mkdir -p ${this.deployPath}/${this.projectName}/releases`,`mkdir -p ${this.deployPath}/${this.projectName}/shared`,`touch ${this.deployPath}/${this.projectName}/shared/.env`,`chown -R orchestr:orchestr ${this.deployPath}`].join(` && `)),t(`Configuring UFW firewall`,[`apt-get install -y -qq ufw`,`ufw --force reset`,`ufw allow 22/tcp`,`ufw allow 80/tcp`,`ufw allow 443/tcp`,`ufw --force enable`].join(` && `)),t(`Enabling services on boot`,`systemctl enable nginx`)}testConnection(){return this.ssh.test()}buildNginxConfig(){return`server {
|
|
2
2
|
listen 80;
|
|
3
3
|
server_name ${this.domain??`_`};
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{SSHConnection as e}from"./SSHConnection.mjs";var t=class{ssh;domain;certEmail;deployPath;projectName;constructor(t){this.options=t,this.ssh=new e({host:t.host,user:t.rootUser??`root`,port:t.port??22,keyPath:t.keyPath}),this.domain=t.domain,this.certEmail=t.email,this.deployPath=t.deployPath??`/home/orchestr`,this.projectName=t.projectName??`app`}async provision(e){let t=(t,n)=>{e?.(t),this.ssh.exec(n,{silent:!0})};t(`Updating package list`,`apt-get update -qq`),t(`Installing Node.js 22`,[`apt-get install -y -qq curl`,`curl -fsSL https://deb.nodesource.com/setup_22.x | bash -`,`apt-get install -y -qq nodejs`].join(` && `)),t(`Installing PM2`,`npm install -g pm2 --quiet && pm2 startup systemd -u orchestr --hp /home/orchestr || true`),t(`Installing Nginx`,`apt-get install -y -qq nginx`);let n=this.buildNginxConfig();t(`Configuring Nginx`,[`cat > /etc/nginx/sites-available/${this.projectName} << 'NGINX'\n${n}\nNGINX`,`ln -sf /etc/nginx/sites-available/${this.projectName} /etc/nginx/sites-enabled/${this.projectName}`,`rm -f /etc/nginx/sites-enabled/default`,`nginx -t && systemctl reload nginx`].join(` && `)),this.domain&&this.certEmail&&(t(`Installing Certbot`,`apt-get install -y -qq certbot python3-certbot-nginx`),t(`Obtaining SSL certificate for ${this.domain}`,`certbot --nginx -d ${this.domain} --non-interactive --agree-tos --email ${this.certEmail} --redirect`)),t(`Creating orchestr user`,[`id -u orchestr &>/dev/null || useradd -m -s /bin/bash orchestr`,`mkdir -p ${this.deployPath}/${this.projectName}/releases`,`mkdir -p ${this.deployPath}/${this.projectName}/shared`,`touch ${this.deployPath}/${this.projectName}/shared/.env`,`chown -R orchestr:orchestr ${this.deployPath}`].join(` && `)),t(`Configuring UFW firewall`,[`apt-get install -y -qq ufw`,`ufw --force reset`,`ufw allow 22/tcp`,`ufw allow 80/tcp`,`ufw allow 443/tcp`,`ufw --force enable`].join(` && `)),t(`Enabling services on boot`,`systemctl enable nginx`)}testConnection(){return this.ssh.test()}buildNginxConfig(){return`server {
|
|
1
|
+
import{SSHConnection as e}from"./SSHConnection.mjs";var t=class{options;ssh;domain;certEmail;deployPath;projectName;constructor(t){this.options=t,this.ssh=new e({host:t.host,user:t.rootUser??`root`,port:t.port??22,keyPath:t.keyPath}),this.domain=t.domain,this.certEmail=t.email,this.deployPath=t.deployPath??`/home/orchestr`,this.projectName=t.projectName??`app`}async provision(e){let t=(t,n)=>{e?.(t),this.ssh.exec(n,{silent:!0})};t(`Updating package list`,`apt-get update -qq`),t(`Installing Node.js 22`,[`apt-get install -y -qq curl`,`curl -fsSL https://deb.nodesource.com/setup_22.x | bash -`,`apt-get install -y -qq nodejs`].join(` && `)),t(`Installing PM2`,`npm install -g pm2 --quiet && pm2 startup systemd -u orchestr --hp /home/orchestr || true`),t(`Installing Nginx`,`apt-get install -y -qq nginx`);let n=this.buildNginxConfig();t(`Configuring Nginx`,[`cat > /etc/nginx/sites-available/${this.projectName} << 'NGINX'\n${n}\nNGINX`,`ln -sf /etc/nginx/sites-available/${this.projectName} /etc/nginx/sites-enabled/${this.projectName}`,`rm -f /etc/nginx/sites-enabled/default`,`nginx -t && systemctl reload nginx`].join(` && `)),this.domain&&this.certEmail&&(t(`Installing Certbot`,`apt-get install -y -qq certbot python3-certbot-nginx`),t(`Obtaining SSL certificate for ${this.domain}`,`certbot --nginx -d ${this.domain} --non-interactive --agree-tos --email ${this.certEmail} --redirect`)),t(`Creating orchestr user`,[`id -u orchestr &>/dev/null || useradd -m -s /bin/bash orchestr`,`mkdir -p ${this.deployPath}/${this.projectName}/releases`,`mkdir -p ${this.deployPath}/${this.projectName}/shared`,`touch ${this.deployPath}/${this.projectName}/shared/.env`,`chown -R orchestr:orchestr ${this.deployPath}`].join(` && `)),t(`Configuring UFW firewall`,[`apt-get install -y -qq ufw`,`ufw --force reset`,`ufw allow 22/tcp`,`ufw allow 80/tcp`,`ufw allow 443/tcp`,`ufw --force enable`].join(` && `)),t(`Enabling services on boot`,`systemctl enable nginx`)}testConnection(){return this.ssh.test()}buildNginxConfig(){return`server {
|
|
2
2
|
listen 80;
|
|
3
3
|
server_name ${this.domain??`_`};
|
|
4
4
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Provisioner.mjs","names":[],"sources":["../../src/Deploy/Provisioner.ts"],"sourcesContent":["/**\n * Provisioner\n *\n * Provisions a fresh Ubuntu server for Orchestr deployments via SSH.\n *\n * Steps:\n * 1. Install Node.js 22 (NodeSource)\n * 2. Install PM2 globally\n * 3. Install + configure Nginx as reverse proxy (port 3000)\n * 4. Certbot SSL (if domain provided)\n * 5. Create orchestr user + directory structure\n * 6. Configure UFW firewall (allow 22, 80, 443)\n */\n\nimport { SSHConnection } from './SSHConnection';\n\nexport interface ProvisionOptions {\n host: string;\n port?: number;\n rootUser?: string;\n keyPath?: string;\n domain?: string;\n email?: string; // for Certbot\n deployPath?: string;\n projectName?: string;\n}\n\nexport interface ProvisionStep {\n name: string;\n command: string;\n}\n\nexport class Provisioner {\n private readonly ssh: SSHConnection;\n private readonly domain?: string;\n private readonly certEmail?: string;\n private readonly deployPath: string;\n private readonly projectName: string;\n\n constructor(private readonly options: ProvisionOptions) {\n this.ssh = new SSHConnection({\n host: options.host,\n user: options.rootUser ?? 'root',\n port: options.port ?? 22,\n keyPath: options.keyPath,\n });\n this.domain = options.domain;\n this.certEmail = options.email;\n this.deployPath = options.deployPath ?? '/home/orchestr';\n this.projectName = options.projectName ?? 'app';\n }\n\n /**\n * Run the full provisioning pipeline.\n * Calls onStep for progress reporting.\n */\n async provision(onStep?: (step: string) => void): Promise<void> {\n const run = (label: string, cmd: string) => {\n onStep?.(label);\n this.ssh.exec(cmd, { silent: true });\n };\n\n // 1. Update apt\n run('Updating package list', 'apt-get update -qq');\n\n // 2. Install Node.js 22 via NodeSource\n run(\n 'Installing Node.js 22',\n [\n 'apt-get install -y -qq curl',\n 'curl -fsSL https://deb.nodesource.com/setup_22.x | bash -',\n 'apt-get install -y -qq nodejs',\n ].join(' && ')\n );\n\n // 3. Install PM2 globally\n run('Installing PM2', 'npm install -g pm2 --quiet && pm2 startup systemd -u orchestr --hp /home/orchestr || true');\n\n // 4. Install Nginx\n run('Installing Nginx', 'apt-get install -y -qq nginx');\n\n // 5. Configure Nginx reverse proxy\n const nginxConf = this.buildNginxConfig();\n run(\n 'Configuring Nginx',\n [\n `cat > /etc/nginx/sites-available/${this.projectName} << 'NGINX'\\n${nginxConf}\\nNGINX`,\n `ln -sf /etc/nginx/sites-available/${this.projectName} /etc/nginx/sites-enabled/${this.projectName}`,\n 'rm -f /etc/nginx/sites-enabled/default',\n 'nginx -t && systemctl reload nginx',\n ].join(' && ')\n );\n\n // 6. SSL via Certbot (if domain provided)\n if (this.domain && this.certEmail) {\n run('Installing Certbot', 'apt-get install -y -qq certbot python3-certbot-nginx');\n run(\n `Obtaining SSL certificate for ${this.domain}`,\n `certbot --nginx -d ${this.domain} --non-interactive --agree-tos --email ${this.certEmail} --redirect`\n );\n }\n\n // 7. Create orchestr user\n run(\n 'Creating orchestr user',\n [\n 'id -u orchestr &>/dev/null || useradd -m -s /bin/bash orchestr',\n `mkdir -p ${this.deployPath}/${this.projectName}/releases`,\n `mkdir -p ${this.deployPath}/${this.projectName}/shared`,\n `touch ${this.deployPath}/${this.projectName}/shared/.env`,\n `chown -R orchestr:orchestr ${this.deployPath}`,\n ].join(' && ')\n );\n\n // 8. Configure UFW firewall\n run(\n 'Configuring UFW firewall',\n [\n 'apt-get install -y -qq ufw',\n 'ufw --force reset',\n 'ufw allow 22/tcp',\n 'ufw allow 80/tcp',\n 'ufw allow 443/tcp',\n 'ufw --force enable',\n ].join(' && ')\n );\n\n // 9. Enable Nginx on boot\n run('Enabling services on boot', 'systemctl enable nginx');\n }\n\n /**\n * Check that the server is reachable.\n */\n testConnection(): boolean {\n return this.ssh.test();\n }\n\n private buildNginxConfig(): string {\n const serverName = this.domain ?? '_';\n return `server {\n listen 80;\n server_name ${serverName};\n\n location / {\n proxy_pass http://localhost:3000;\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection 'upgrade';\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_cache_bypass $http_upgrade;\n }\n}`;\n }\n}\n"],"mappings":"oDAgCA,IAAa,EAAb,KAAyB,
|
|
1
|
+
{"version":3,"file":"Provisioner.mjs","names":[],"sources":["../../src/Deploy/Provisioner.ts"],"sourcesContent":["/**\n * Provisioner\n *\n * Provisions a fresh Ubuntu server for Orchestr deployments via SSH.\n *\n * Steps:\n * 1. Install Node.js 22 (NodeSource)\n * 2. Install PM2 globally\n * 3. Install + configure Nginx as reverse proxy (port 3000)\n * 4. Certbot SSL (if domain provided)\n * 5. Create orchestr user + directory structure\n * 6. Configure UFW firewall (allow 22, 80, 443)\n */\n\nimport { SSHConnection } from './SSHConnection';\n\nexport interface ProvisionOptions {\n host: string;\n port?: number;\n rootUser?: string;\n keyPath?: string;\n domain?: string;\n email?: string; // for Certbot\n deployPath?: string;\n projectName?: string;\n}\n\nexport interface ProvisionStep {\n name: string;\n command: string;\n}\n\nexport class Provisioner {\n private readonly ssh: SSHConnection;\n private readonly domain?: string;\n private readonly certEmail?: string;\n private readonly deployPath: string;\n private readonly projectName: string;\n\n constructor(private readonly options: ProvisionOptions) {\n this.ssh = new SSHConnection({\n host: options.host,\n user: options.rootUser ?? 'root',\n port: options.port ?? 22,\n keyPath: options.keyPath,\n });\n this.domain = options.domain;\n this.certEmail = options.email;\n this.deployPath = options.deployPath ?? '/home/orchestr';\n this.projectName = options.projectName ?? 'app';\n }\n\n /**\n * Run the full provisioning pipeline.\n * Calls onStep for progress reporting.\n */\n async provision(onStep?: (step: string) => void): Promise<void> {\n const run = (label: string, cmd: string) => {\n onStep?.(label);\n this.ssh.exec(cmd, { silent: true });\n };\n\n // 1. Update apt\n run('Updating package list', 'apt-get update -qq');\n\n // 2. Install Node.js 22 via NodeSource\n run(\n 'Installing Node.js 22',\n [\n 'apt-get install -y -qq curl',\n 'curl -fsSL https://deb.nodesource.com/setup_22.x | bash -',\n 'apt-get install -y -qq nodejs',\n ].join(' && ')\n );\n\n // 3. Install PM2 globally\n run('Installing PM2', 'npm install -g pm2 --quiet && pm2 startup systemd -u orchestr --hp /home/orchestr || true');\n\n // 4. Install Nginx\n run('Installing Nginx', 'apt-get install -y -qq nginx');\n\n // 5. Configure Nginx reverse proxy\n const nginxConf = this.buildNginxConfig();\n run(\n 'Configuring Nginx',\n [\n `cat > /etc/nginx/sites-available/${this.projectName} << 'NGINX'\\n${nginxConf}\\nNGINX`,\n `ln -sf /etc/nginx/sites-available/${this.projectName} /etc/nginx/sites-enabled/${this.projectName}`,\n 'rm -f /etc/nginx/sites-enabled/default',\n 'nginx -t && systemctl reload nginx',\n ].join(' && ')\n );\n\n // 6. SSL via Certbot (if domain provided)\n if (this.domain && this.certEmail) {\n run('Installing Certbot', 'apt-get install -y -qq certbot python3-certbot-nginx');\n run(\n `Obtaining SSL certificate for ${this.domain}`,\n `certbot --nginx -d ${this.domain} --non-interactive --agree-tos --email ${this.certEmail} --redirect`\n );\n }\n\n // 7. Create orchestr user\n run(\n 'Creating orchestr user',\n [\n 'id -u orchestr &>/dev/null || useradd -m -s /bin/bash orchestr',\n `mkdir -p ${this.deployPath}/${this.projectName}/releases`,\n `mkdir -p ${this.deployPath}/${this.projectName}/shared`,\n `touch ${this.deployPath}/${this.projectName}/shared/.env`,\n `chown -R orchestr:orchestr ${this.deployPath}`,\n ].join(' && ')\n );\n\n // 8. Configure UFW firewall\n run(\n 'Configuring UFW firewall',\n [\n 'apt-get install -y -qq ufw',\n 'ufw --force reset',\n 'ufw allow 22/tcp',\n 'ufw allow 80/tcp',\n 'ufw allow 443/tcp',\n 'ufw --force enable',\n ].join(' && ')\n );\n\n // 9. Enable Nginx on boot\n run('Enabling services on boot', 'systemctl enable nginx');\n }\n\n /**\n * Check that the server is reachable.\n */\n testConnection(): boolean {\n return this.ssh.test();\n }\n\n private buildNginxConfig(): string {\n const serverName = this.domain ?? '_';\n return `server {\n listen 80;\n server_name ${serverName};\n\n location / {\n proxy_pass http://localhost:3000;\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection 'upgrade';\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_cache_bypass $http_upgrade;\n }\n}`;\n }\n}\n"],"mappings":"oDAgCA,IAAa,EAAb,KAAyB,CAOM,QAN7B,IACA,OACA,UACA,WACA,YAEA,YAAY,EAA4C,CAA3B,KAAA,QAAA,EAC3B,KAAK,IAAM,IAAI,EAAc,CAC3B,KAAM,EAAQ,KACd,KAAM,EAAQ,UAAY,OAC1B,KAAM,EAAQ,MAAQ,GACtB,QAAS,EAAQ,QAClB,CAAC,CACF,KAAK,OAAS,EAAQ,OACtB,KAAK,UAAY,EAAQ,MACzB,KAAK,WAAa,EAAQ,YAAc,iBACxC,KAAK,YAAc,EAAQ,aAAe,MAO5C,MAAM,UAAU,EAAgD,CAC9D,IAAM,GAAO,EAAe,IAAgB,CAC1C,IAAS,EAAM,CACf,KAAK,IAAI,KAAK,EAAK,CAAE,OAAQ,GAAM,CAAC,EAItC,EAAI,wBAAyB,qBAAqB,CAGlD,EACE,wBACA,CACE,8BACA,4DACA,gCACD,CAAC,KAAK,OAAO,CACf,CAGD,EAAI,iBAAkB,4FAA4F,CAGlH,EAAI,mBAAoB,+BAA+B,CAGvD,IAAM,EAAY,KAAK,kBAAkB,CACzC,EACE,oBACA,CACE,oCAAoC,KAAK,YAAY,eAAe,EAAU,SAC9E,qCAAqC,KAAK,YAAY,4BAA4B,KAAK,cACvF,yCACA,qCACD,CAAC,KAAK,OAAO,CACf,CAGG,KAAK,QAAU,KAAK,YACtB,EAAI,qBAAsB,uDAAuD,CACjF,EACE,iCAAiC,KAAK,SACtC,sBAAsB,KAAK,OAAO,yCAAyC,KAAK,UAAU,aAC3F,EAIH,EACE,yBACA,CACE,iEACA,YAAY,KAAK,WAAW,GAAG,KAAK,YAAY,WAChD,YAAY,KAAK,WAAW,GAAG,KAAK,YAAY,SAChD,SAAS,KAAK,WAAW,GAAG,KAAK,YAAY,cAC7C,8BAA8B,KAAK,aACpC,CAAC,KAAK,OAAO,CACf,CAGD,EACE,2BACA,CACE,6BACA,oBACA,mBACA,mBACA,oBACA,qBACD,CAAC,KAAK,OAAO,CACf,CAGD,EAAI,4BAA6B,yBAAyB,CAM5D,gBAA0B,CACxB,OAAO,KAAK,IAAI,MAAM,CAGxB,kBAAmC,CAEjC,MAAO;;kBADY,KAAK,QAAU,IAGT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SSHConnection.mjs","names":[],"sources":["../../src/Deploy/SSHConnection.ts"],"sourcesContent":["/**\n * SSHConnection\n *\n * Wrapper around system ssh/scp commands via child_process.\n * Zero npm dependencies — uses Node.js built-ins only.\n */\n\nimport { execSync, ExecSyncOptions } from 'child_process';\n\nexport interface SSHConfig {\n host: string;\n user: string;\n port?: number;\n keyPath?: string;\n}\n\nexport class SSHConnection {\n private readonly host: string;\n private readonly user: string;\n private readonly port: number;\n private readonly keyPath?: string;\n\n constructor(config: SSHConfig) {\n this.host = config.host;\n this.user = config.user;\n this.port = config.port ?? 22;\n this.keyPath = config.keyPath;\n }\n\n private get sshArgs(): string {\n const args: string[] = [\n '-o StrictHostKeyChecking=accept-new',\n '-o UserKnownHostsFile=/dev/null',\n '-o BatchMode=yes',\n `-p ${this.port}`,\n ];\n\n if (this.keyPath) {\n args.push(`-i \"${this.keyPath}\"`);\n }\n\n return args.join(' ');\n }\n\n private get target(): string {\n return `${this.user}@${this.host}`;\n }\n\n /**\n * Run a command on the remote server.\n * Returns stdout as a string.\n */\n exec(command: string, opts: { silent?: boolean } = {}): string {\n // Use single quotes so $VAR expansion happens on the remote shell, not locally.\n // Escape any literal single quotes in the command via the '\"'\"' trick.\n const escaped = command.replace(/'/g, `'\"'\"'`);\n const cmd = `ssh ${this.sshArgs} ${this.target} '${escaped}'`;\n const options: ExecSyncOptions = {\n stdio: opts.silent ? 'pipe' : 'inherit',\n encoding: 'utf-8',\n };\n\n return (execSync(cmd, options) as string) ?? '';\n }\n\n /**\n * Upload a local file to the remote server via scp.\n */\n upload(localPath: string, remotePath: string): void {\n const scpArgs: string[] = [\n '-o StrictHostKeyChecking=accept-new',\n '-o UserKnownHostsFile=/dev/null',\n `-P ${this.port}`,\n ];\n\n if (this.keyPath) {\n scpArgs.push(`-i \"${this.keyPath}\"`);\n }\n\n const cmd = `scp ${scpArgs.join(' ')} \"${localPath}\" ${this.target}:\"${remotePath}\"`;\n execSync(cmd, { stdio: 'inherit' });\n }\n\n /**\n * Test that the SSH connection is reachable.\n * Returns true if successful, false otherwise.\n */\n test(): boolean {\n try {\n this.exec('echo ok', { silent: true });\n return true;\n } catch {\n return false;\n }\n }\n}\n"],"mappings":"yCAgBA,IAAa,EAAb,KAA2B,CACzB,KACA,KACA,KACA,QAEA,YAAY,EAAmB,CAC7B,KAAK,KAAO,EAAO,KACnB,KAAK,KAAO,EAAO,KACnB,KAAK,KAAO,EAAO,MAAQ,GAC3B,KAAK,QAAU,EAAO,QAGxB,IAAY,SAAkB,CAC5B,IAAM,EAAiB,CACrB,sCACA,kCACA,mBACA,MAAM,KAAK,OACZ,CAMD,OAJI,KAAK,SACP,EAAK,KAAK,OAAO,KAAK,QAAQ,GAAG,CAG5B,EAAK,KAAK,IAAI,CAGvB,IAAY,QAAiB,CAC3B,MAAO,GAAG,KAAK,KAAK,GAAG,KAAK,OAO9B,KAAK,EAAiB,EAA6B,EAAE,CAAU,CAG7D,IAAM,EAAU,EAAQ,QAAQ,KAAM,QAAQ,CAO9C,OAAQ,
|
|
1
|
+
{"version":3,"file":"SSHConnection.mjs","names":[],"sources":["../../src/Deploy/SSHConnection.ts"],"sourcesContent":["/**\n * SSHConnection\n *\n * Wrapper around system ssh/scp commands via child_process.\n * Zero npm dependencies — uses Node.js built-ins only.\n */\n\nimport { execSync, ExecSyncOptions } from 'child_process';\n\nexport interface SSHConfig {\n host: string;\n user: string;\n port?: number;\n keyPath?: string;\n}\n\nexport class SSHConnection {\n private readonly host: string;\n private readonly user: string;\n private readonly port: number;\n private readonly keyPath?: string;\n\n constructor(config: SSHConfig) {\n this.host = config.host;\n this.user = config.user;\n this.port = config.port ?? 22;\n this.keyPath = config.keyPath;\n }\n\n private get sshArgs(): string {\n const args: string[] = [\n '-o StrictHostKeyChecking=accept-new',\n '-o UserKnownHostsFile=/dev/null',\n '-o BatchMode=yes',\n `-p ${this.port}`,\n ];\n\n if (this.keyPath) {\n args.push(`-i \"${this.keyPath}\"`);\n }\n\n return args.join(' ');\n }\n\n private get target(): string {\n return `${this.user}@${this.host}`;\n }\n\n /**\n * Run a command on the remote server.\n * Returns stdout as a string.\n */\n exec(command: string, opts: { silent?: boolean } = {}): string {\n // Use single quotes so $VAR expansion happens on the remote shell, not locally.\n // Escape any literal single quotes in the command via the '\"'\"' trick.\n const escaped = command.replace(/'/g, `'\"'\"'`);\n const cmd = `ssh ${this.sshArgs} ${this.target} '${escaped}'`;\n const options: ExecSyncOptions = {\n stdio: opts.silent ? 'pipe' : 'inherit',\n encoding: 'utf-8',\n };\n\n return (execSync(cmd, options) as string) ?? '';\n }\n\n /**\n * Upload a local file to the remote server via scp.\n */\n upload(localPath: string, remotePath: string): void {\n const scpArgs: string[] = [\n '-o StrictHostKeyChecking=accept-new',\n '-o UserKnownHostsFile=/dev/null',\n `-P ${this.port}`,\n ];\n\n if (this.keyPath) {\n scpArgs.push(`-i \"${this.keyPath}\"`);\n }\n\n const cmd = `scp ${scpArgs.join(' ')} \"${localPath}\" ${this.target}:\"${remotePath}\"`;\n execSync(cmd, { stdio: 'inherit' });\n }\n\n /**\n * Test that the SSH connection is reachable.\n * Returns true if successful, false otherwise.\n */\n test(): boolean {\n try {\n this.exec('echo ok', { silent: true });\n return true;\n } catch {\n return false;\n }\n }\n}\n"],"mappings":"yCAgBA,IAAa,EAAb,KAA2B,CACzB,KACA,KACA,KACA,QAEA,YAAY,EAAmB,CAC7B,KAAK,KAAO,EAAO,KACnB,KAAK,KAAO,EAAO,KACnB,KAAK,KAAO,EAAO,MAAQ,GAC3B,KAAK,QAAU,EAAO,QAGxB,IAAY,SAAkB,CAC5B,IAAM,EAAiB,CACrB,sCACA,kCACA,mBACA,MAAM,KAAK,OACZ,CAMD,OAJI,KAAK,SACP,EAAK,KAAK,OAAO,KAAK,QAAQ,GAAG,CAG5B,EAAK,KAAK,IAAI,CAGvB,IAAY,QAAiB,CAC3B,MAAO,GAAG,KAAK,KAAK,GAAG,KAAK,OAO9B,KAAK,EAAiB,EAA6B,EAAE,CAAU,CAG7D,IAAM,EAAU,EAAQ,QAAQ,KAAM,QAAQ,CAO9C,OAAQ,EAAS,OANE,KAAK,QAAQ,GAAG,KAAK,OAAO,IAAI,EAAQ,GAMrC,CAJpB,MAAO,EAAK,OAAS,OAAS,UAC9B,SAAU,QAGiB,CAAC,EAAe,GAM/C,OAAO,EAAmB,EAA0B,CAClD,IAAM,EAAoB,CACxB,sCACA,kCACA,MAAM,KAAK,OACZ,CAEG,KAAK,SACP,EAAQ,KAAK,OAAO,KAAK,QAAQ,GAAG,CAItC,EAAS,OADU,EAAQ,KAAK,IAAI,CAAC,IAAI,EAAU,IAAI,KAAK,OAAO,IAAI,EAAW,GACpE,CAAE,MAAO,UAAW,CAAC,CAOrC,MAAgB,CACd,GAAI,CAEF,OADA,KAAK,KAAK,UAAW,CAAE,OAAQ,GAAM,CAAC,CAC/B,QACD,CACN,MAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);var e=class extends Error{constructor(e,t,n){super(e),this.status=t,this.code=n,this.name=`SymphonyApiError`}},t=class{constructor(e,t){this.apiUrl=e,this.token=t}get headers(){let e={"Content-Type":`application/json`};return this.token&&(e.Authorization=`Bearer ${this.token}`),e}async request(t,n,r){let i=`${this.apiUrl.replace(/\/$/,``)}${n}`,a;try{a=await fetch(i,{method:t,headers:{...this.headers,connection:`close`},body:r===void 0?void 0:JSON.stringify(r)})}catch(e){throw Error(`Network error contacting ${i}: ${e?.cause?.message??e?.message??e}`)}if(!a.ok){let t={error:`HTTP ${a.status}`};try{t=await a.json()}catch{}throw new e(t.error,a.status,t.code)}if(a.status!==204)return a.json()}register(e,t,n){return this.request(`POST`,`/api/auth/register`,{email:e,password:t,name:n})}login(e,t){return this.request(`POST`,`/api/auth/login`,{email:e,password:t})}listProjects(){return this.request(`GET`,`/api/projects`)}createProject(e,t){return this.request(`POST`,`/api/projects`,{name:e,repository:t})}getProject(e){return this.request(`GET`,`/api/projects/${e}`)}listServers(e){return this.request(`GET`,`/api/projects/${e}/servers`)}addServer(e,t){return this.request(`POST`,`/api/projects/${e}/servers`,t)}deleteServer(e,t){return this.request(`DELETE`,`/api/projects/${e}/servers/${t}`)}createDeployment(e,t){return this.request(`POST`,`/api/projects/${e}/deploy`,t)}listDeployments(e,t=1,n=20){return this.request(`GET`,`/api/projects/${e}/deployments?page=${t}&per_page=${n}`)}updateDeployment(e,t,n){return this.request(`PATCH`,`/api/projects/${e}/deployments/${t}`,n)}getEnvVars(e){return this.request(`GET`,`/api/projects/${e}/env`)}putEnvVars(e,t){return this.request(`PUT`,`/api/projects/${e}/env`,{variables:t})}rollback(e){return this.request(`POST`,`/api/projects/${e}/rollback`)}};exports.SymphonyApiError=e,exports.SymphonyClient=t;
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);var e=class extends Error{status;code;constructor(e,t,n){super(e),this.status=t,this.code=n,this.name=`SymphonyApiError`}},t=class{apiUrl;token;constructor(e,t){this.apiUrl=e,this.token=t}get headers(){let e={"Content-Type":`application/json`};return this.token&&(e.Authorization=`Bearer ${this.token}`),e}async request(t,n,r){let i=`${this.apiUrl.replace(/\/$/,``)}${n}`,a;try{a=await fetch(i,{method:t,headers:{...this.headers,connection:`close`},body:r===void 0?void 0:JSON.stringify(r)})}catch(e){throw Error(`Network error contacting ${i}: ${e?.cause?.message??e?.message??e}`)}if(!a.ok){let t={error:`HTTP ${a.status}`};try{t=await a.json()}catch{}throw new e(t.error,a.status,t.code)}if(a.status!==204)return a.json()}register(e,t,n){return this.request(`POST`,`/api/auth/register`,{email:e,password:t,name:n})}login(e,t){return this.request(`POST`,`/api/auth/login`,{email:e,password:t})}listProjects(){return this.request(`GET`,`/api/projects`)}createProject(e,t){return this.request(`POST`,`/api/projects`,{name:e,repository:t})}getProject(e){return this.request(`GET`,`/api/projects/${e}`)}listServers(e){return this.request(`GET`,`/api/projects/${e}/servers`)}addServer(e,t){return this.request(`POST`,`/api/projects/${e}/servers`,t)}deleteServer(e,t){return this.request(`DELETE`,`/api/projects/${e}/servers/${t}`)}createDeployment(e,t){return this.request(`POST`,`/api/projects/${e}/deploy`,t)}listDeployments(e,t=1,n=20){return this.request(`GET`,`/api/projects/${e}/deployments?page=${t}&per_page=${n}`)}updateDeployment(e,t,n){return this.request(`PATCH`,`/api/projects/${e}/deployments/${t}`,n)}getEnvVars(e){return this.request(`GET`,`/api/projects/${e}/env`)}putEnvVars(e,t){return this.request(`PUT`,`/api/projects/${e}/env`,{variables:t})}rollback(e){return this.request(`POST`,`/api/projects/${e}/rollback`)}};exports.SymphonyApiError=e,exports.SymphonyClient=t;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=class extends Error{constructor(e,t,n){super(e),this.status=t,this.code=n,this.name=`SymphonyApiError`}},t=class{constructor(e,t){this.apiUrl=e,this.token=t}get headers(){let e={"Content-Type":`application/json`};return this.token&&(e.Authorization=`Bearer ${this.token}`),e}async request(t,n,r){let i=`${this.apiUrl.replace(/\/$/,``)}${n}`,a;try{a=await fetch(i,{method:t,headers:{...this.headers,connection:`close`},body:r===void 0?void 0:JSON.stringify(r)})}catch(e){throw Error(`Network error contacting ${i}: ${e?.cause?.message??e?.message??e}`)}if(!a.ok){let t={error:`HTTP ${a.status}`};try{t=await a.json()}catch{}throw new e(t.error,a.status,t.code)}if(a.status!==204)return a.json()}register(e,t,n){return this.request(`POST`,`/api/auth/register`,{email:e,password:t,name:n})}login(e,t){return this.request(`POST`,`/api/auth/login`,{email:e,password:t})}listProjects(){return this.request(`GET`,`/api/projects`)}createProject(e,t){return this.request(`POST`,`/api/projects`,{name:e,repository:t})}getProject(e){return this.request(`GET`,`/api/projects/${e}`)}listServers(e){return this.request(`GET`,`/api/projects/${e}/servers`)}addServer(e,t){return this.request(`POST`,`/api/projects/${e}/servers`,t)}deleteServer(e,t){return this.request(`DELETE`,`/api/projects/${e}/servers/${t}`)}createDeployment(e,t){return this.request(`POST`,`/api/projects/${e}/deploy`,t)}listDeployments(e,t=1,n=20){return this.request(`GET`,`/api/projects/${e}/deployments?page=${t}&per_page=${n}`)}updateDeployment(e,t,n){return this.request(`PATCH`,`/api/projects/${e}/deployments/${t}`,n)}getEnvVars(e){return this.request(`GET`,`/api/projects/${e}/env`)}putEnvVars(e,t){return this.request(`PUT`,`/api/projects/${e}/env`,{variables:t})}rollback(e){return this.request(`POST`,`/api/projects/${e}/rollback`)}};export{e as SymphonyApiError,t as SymphonyClient};
|
|
1
|
+
var e=class extends Error{status;code;constructor(e,t,n){super(e),this.status=t,this.code=n,this.name=`SymphonyApiError`}},t=class{apiUrl;token;constructor(e,t){this.apiUrl=e,this.token=t}get headers(){let e={"Content-Type":`application/json`};return this.token&&(e.Authorization=`Bearer ${this.token}`),e}async request(t,n,r){let i=`${this.apiUrl.replace(/\/$/,``)}${n}`,a;try{a=await fetch(i,{method:t,headers:{...this.headers,connection:`close`},body:r===void 0?void 0:JSON.stringify(r)})}catch(e){throw Error(`Network error contacting ${i}: ${e?.cause?.message??e?.message??e}`)}if(!a.ok){let t={error:`HTTP ${a.status}`};try{t=await a.json()}catch{}throw new e(t.error,a.status,t.code)}if(a.status!==204)return a.json()}register(e,t,n){return this.request(`POST`,`/api/auth/register`,{email:e,password:t,name:n})}login(e,t){return this.request(`POST`,`/api/auth/login`,{email:e,password:t})}listProjects(){return this.request(`GET`,`/api/projects`)}createProject(e,t){return this.request(`POST`,`/api/projects`,{name:e,repository:t})}getProject(e){return this.request(`GET`,`/api/projects/${e}`)}listServers(e){return this.request(`GET`,`/api/projects/${e}/servers`)}addServer(e,t){return this.request(`POST`,`/api/projects/${e}/servers`,t)}deleteServer(e,t){return this.request(`DELETE`,`/api/projects/${e}/servers/${t}`)}createDeployment(e,t){return this.request(`POST`,`/api/projects/${e}/deploy`,t)}listDeployments(e,t=1,n=20){return this.request(`GET`,`/api/projects/${e}/deployments?page=${t}&per_page=${n}`)}updateDeployment(e,t,n){return this.request(`PATCH`,`/api/projects/${e}/deployments/${t}`,n)}getEnvVars(e){return this.request(`GET`,`/api/projects/${e}/env`)}putEnvVars(e,t){return this.request(`PUT`,`/api/projects/${e}/env`,{variables:t})}rollback(e){return this.request(`POST`,`/api/projects/${e}/rollback`)}};export{e as SymphonyApiError,t as SymphonyClient};
|
|
2
2
|
//# sourceMappingURL=SymphonyClient.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SymphonyClient.mjs","names":[],"sources":["../../src/Deploy/SymphonyClient.ts"],"sourcesContent":["/**\n * SymphonyClient\n *\n * HTTP client wrapping fetch() for all Symphony API calls.\n * Uses only Node.js built-in fetch (Node 22+).\n */\n\nexport interface ApiError {\n error: string;\n code?: string;\n}\n\nexport class SymphonyApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code?: string\n ) {\n super(message);\n this.name = 'SymphonyApiError';\n }\n}\n\nexport class SymphonyClient {\n constructor(\n private readonly apiUrl: string,\n private readonly token?: string\n ) {}\n\n private get headers(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n return headers;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.apiUrl.replace(/\\/$/, '')}${path}`;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers: { ...this.headers, connection: 'close' },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (err: any) {\n throw new Error(`Network error contacting ${url}: ${err?.cause?.message ?? err?.message ?? err}`);\n }\n\n if (!response.ok) {\n let errorBody: ApiError = { error: `HTTP ${response.status}` };\n try {\n errorBody = (await response.json()) as ApiError;\n } catch {}\n throw new SymphonyApiError(errorBody.error, response.status, errorBody.code);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n // --- Auth ---\n\n register(email: string, password: string, name?: string) {\n return this.request<{ user: { id: number; email: string; name: string | null }; token: string }>(\n 'POST',\n '/api/auth/register',\n { email, password, name }\n );\n }\n\n login(email: string, password: string) {\n return this.request<{ user: { id: number; email: string; name: string | null }; token: string }>(\n 'POST',\n '/api/auth/login',\n { email, password }\n );\n }\n\n // --- Projects ---\n\n listProjects() {\n return this.request<{\n projects: Array<{ id: number; name: string; slug: string; repository: string | null; created_at: string }>;\n }>('GET', '/api/projects');\n }\n\n createProject(name: string, repository?: string) {\n return this.request<{ project: { id: number; name: string; slug: string } }>('POST', '/api/projects', {\n name,\n repository,\n });\n }\n\n getProject(slug: string) {\n return this.request<{ project: { id: number; name: string; slug: string; repository: string | null } }>(\n 'GET',\n `/api/projects/${slug}`\n );\n }\n\n // --- Servers ---\n\n listServers(slug: string) {\n return this.request<{\n servers: Array<{\n id: number;\n name: string;\n host: string;\n port: number;\n ssh_user: string;\n deploy_path: string;\n status: string | null;\n last_deployed_at: string | null;\n }>;\n }>('GET', `/api/projects/${slug}/servers`);\n }\n\n addServer(\n slug: string,\n params: { name: string; host: string; port?: number; ssh_user?: string; deploy_path?: string }\n ) {\n return this.request<{\n server: {\n id: number;\n name: string;\n host: string;\n port: number;\n ssh_user: string;\n deploy_path: string;\n status: string | null;\n };\n }>('POST', `/api/projects/${slug}/servers`, params);\n }\n\n deleteServer(slug: string, serverId: number) {\n return this.request<void>('DELETE', `/api/projects/${slug}/servers/${serverId}`);\n }\n\n // --- Deployments ---\n\n createDeployment(\n slug: string,\n params: { server_id: number; version?: string; commit_hash?: string; commit_message?: string }\n ) {\n return this.request<{ deployment: { id: number; uuid: string; status: string } }>(\n 'POST',\n `/api/projects/${slug}/deploy`,\n params\n );\n }\n\n listDeployments(slug: string, page = 1, perPage = 20) {\n return this.request<{\n deployments: Array<{\n id: number;\n uuid: string;\n version: string | null;\n commit_hash: string | null;\n commit_message: string | null;\n status: string | null;\n started_at: string | null;\n completed_at: string | null;\n created_at: string;\n }>;\n pagination: { page: number; per_page: number; total: number };\n }>('GET', `/api/projects/${slug}/deployments?page=${page}&per_page=${perPage}`);\n }\n\n updateDeployment(slug: string, uuid: string, params: { status?: string; log?: string; completed_at?: string }) {\n return this.request<{ deployment: { id: number; uuid: string; status: string } }>(\n 'PATCH',\n `/api/projects/${slug}/deployments/${uuid}`,\n params\n );\n }\n\n // --- Environment Variables ---\n\n getEnvVars(slug: string) {\n return this.request<{ variables: Array<{ key: string; value: string }> }>('GET', `/api/projects/${slug}/env`);\n }\n\n putEnvVars(slug: string, variables: Array<{ key: string; value: string }>) {\n return this.request<{ variables: Array<{ key: string }> }>('PUT', `/api/projects/${slug}/env`, { variables });\n }\n\n // --- Rollback ---\n\n rollback(slug: string) {\n return this.request<{\n rolled_back: { id: number; uuid: string };\n restored: { id: number; uuid: string };\n }>('POST', `/api/projects/${slug}/rollback`);\n }\n}\n"],"mappings":"AAYA,IAAa,EAAb,cAAsC,KAAM,
|
|
1
|
+
{"version":3,"file":"SymphonyClient.mjs","names":[],"sources":["../../src/Deploy/SymphonyClient.ts"],"sourcesContent":["/**\n * SymphonyClient\n *\n * HTTP client wrapping fetch() for all Symphony API calls.\n * Uses only Node.js built-in fetch (Node 22+).\n */\n\nexport interface ApiError {\n error: string;\n code?: string;\n}\n\nexport class SymphonyApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code?: string\n ) {\n super(message);\n this.name = 'SymphonyApiError';\n }\n}\n\nexport class SymphonyClient {\n constructor(\n private readonly apiUrl: string,\n private readonly token?: string\n ) {}\n\n private get headers(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n return headers;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.apiUrl.replace(/\\/$/, '')}${path}`;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers: { ...this.headers, connection: 'close' },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (err: any) {\n throw new Error(`Network error contacting ${url}: ${err?.cause?.message ?? err?.message ?? err}`);\n }\n\n if (!response.ok) {\n let errorBody: ApiError = { error: `HTTP ${response.status}` };\n try {\n errorBody = (await response.json()) as ApiError;\n } catch {}\n throw new SymphonyApiError(errorBody.error, response.status, errorBody.code);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n // --- Auth ---\n\n register(email: string, password: string, name?: string) {\n return this.request<{ user: { id: number; email: string; name: string | null }; token: string }>(\n 'POST',\n '/api/auth/register',\n { email, password, name }\n );\n }\n\n login(email: string, password: string) {\n return this.request<{ user: { id: number; email: string; name: string | null }; token: string }>(\n 'POST',\n '/api/auth/login',\n { email, password }\n );\n }\n\n // --- Projects ---\n\n listProjects() {\n return this.request<{\n projects: Array<{ id: number; name: string; slug: string; repository: string | null; created_at: string }>;\n }>('GET', '/api/projects');\n }\n\n createProject(name: string, repository?: string) {\n return this.request<{ project: { id: number; name: string; slug: string } }>('POST', '/api/projects', {\n name,\n repository,\n });\n }\n\n getProject(slug: string) {\n return this.request<{ project: { id: number; name: string; slug: string; repository: string | null } }>(\n 'GET',\n `/api/projects/${slug}`\n );\n }\n\n // --- Servers ---\n\n listServers(slug: string) {\n return this.request<{\n servers: Array<{\n id: number;\n name: string;\n host: string;\n port: number;\n ssh_user: string;\n deploy_path: string;\n status: string | null;\n last_deployed_at: string | null;\n }>;\n }>('GET', `/api/projects/${slug}/servers`);\n }\n\n addServer(\n slug: string,\n params: { name: string; host: string; port?: number; ssh_user?: string; deploy_path?: string }\n ) {\n return this.request<{\n server: {\n id: number;\n name: string;\n host: string;\n port: number;\n ssh_user: string;\n deploy_path: string;\n status: string | null;\n };\n }>('POST', `/api/projects/${slug}/servers`, params);\n }\n\n deleteServer(slug: string, serverId: number) {\n return this.request<void>('DELETE', `/api/projects/${slug}/servers/${serverId}`);\n }\n\n // --- Deployments ---\n\n createDeployment(\n slug: string,\n params: { server_id: number; version?: string; commit_hash?: string; commit_message?: string }\n ) {\n return this.request<{ deployment: { id: number; uuid: string; status: string } }>(\n 'POST',\n `/api/projects/${slug}/deploy`,\n params\n );\n }\n\n listDeployments(slug: string, page = 1, perPage = 20) {\n return this.request<{\n deployments: Array<{\n id: number;\n uuid: string;\n version: string | null;\n commit_hash: string | null;\n commit_message: string | null;\n status: string | null;\n started_at: string | null;\n completed_at: string | null;\n created_at: string;\n }>;\n pagination: { page: number; per_page: number; total: number };\n }>('GET', `/api/projects/${slug}/deployments?page=${page}&per_page=${perPage}`);\n }\n\n updateDeployment(slug: string, uuid: string, params: { status?: string; log?: string; completed_at?: string }) {\n return this.request<{ deployment: { id: number; uuid: string; status: string } }>(\n 'PATCH',\n `/api/projects/${slug}/deployments/${uuid}`,\n params\n );\n }\n\n // --- Environment Variables ---\n\n getEnvVars(slug: string) {\n return this.request<{ variables: Array<{ key: string; value: string }> }>('GET', `/api/projects/${slug}/env`);\n }\n\n putEnvVars(slug: string, variables: Array<{ key: string; value: string }>) {\n return this.request<{ variables: Array<{ key: string }> }>('PUT', `/api/projects/${slug}/env`, { variables });\n }\n\n // --- Rollback ---\n\n rollback(slug: string) {\n return this.request<{\n rolled_back: { id: number; uuid: string };\n restored: { id: number; uuid: string };\n }>('POST', `/api/projects/${slug}/rollback`);\n }\n}\n"],"mappings":"AAYA,IAAa,EAAb,cAAsC,KAAM,CAGxB,OACA,KAHlB,YACE,EACA,EACA,EACA,CACA,MAAM,EAAQ,CAHE,KAAA,OAAA,EACA,KAAA,KAAA,EAGhB,KAAK,KAAO,qBAIH,EAAb,KAA4B,CAEP,OACA,MAFnB,YACE,EACA,EACA,CAFiB,KAAA,OAAA,EACA,KAAA,MAAA,EAGnB,IAAY,SAAkC,CAC5C,IAAM,EAAkC,CACtC,eAAgB,mBACjB,CAMD,OAJI,KAAK,QACP,EAAQ,cAAmB,UAAU,KAAK,SAGrC,EAGT,MAAc,QAAW,EAAgB,EAAc,EAA4B,CACjF,IAAM,EAAM,GAAG,KAAK,OAAO,QAAQ,MAAO,GAAG,GAAG,IAE5C,EACJ,GAAI,CACF,EAAW,MAAM,MAAM,EAAK,CAC1B,SACA,QAAS,CAAE,GAAG,KAAK,QAAS,WAAY,QAAS,CACjD,KAAM,IAAS,IAAA,GAAmC,IAAA,GAAvB,KAAK,UAAU,EAAK,CAChD,CAAC,OACK,EAAU,CACjB,MAAU,MAAM,4BAA4B,EAAI,IAAI,GAAK,OAAO,SAAW,GAAK,SAAW,IAAM,CAGnG,GAAI,CAAC,EAAS,GAAI,CAChB,IAAI,EAAsB,CAAE,MAAO,QAAQ,EAAS,SAAU,CAC9D,GAAI,CACF,EAAa,MAAM,EAAS,MAAM,MAC5B,EACR,MAAM,IAAI,EAAiB,EAAU,MAAO,EAAS,OAAQ,EAAU,KAAK,CAI1E,KAAS,SAAW,IAIxB,OAAO,EAAS,MAAM,CAKxB,SAAS,EAAe,EAAkB,EAAe,CACvD,OAAO,KAAK,QACV,OACA,qBACA,CAAE,QAAO,WAAU,OAAM,CAC1B,CAGH,MAAM,EAAe,EAAkB,CACrC,OAAO,KAAK,QACV,OACA,kBACA,CAAE,QAAO,WAAU,CACpB,CAKH,cAAe,CACb,OAAO,KAAK,QAET,MAAO,gBAAgB,CAG5B,cAAc,EAAc,EAAqB,CAC/C,OAAO,KAAK,QAAiE,OAAQ,gBAAiB,CACpG,OACA,aACD,CAAC,CAGJ,WAAW,EAAc,CACvB,OAAO,KAAK,QACV,MACA,iBAAiB,IAClB,CAKH,YAAY,EAAc,CACxB,OAAO,KAAK,QAWT,MAAO,iBAAiB,EAAK,UAAU,CAG5C,UACE,EACA,EACA,CACA,OAAO,KAAK,QAUT,OAAQ,iBAAiB,EAAK,UAAW,EAAO,CAGrD,aAAa,EAAc,EAAkB,CAC3C,OAAO,KAAK,QAAc,SAAU,iBAAiB,EAAK,WAAW,IAAW,CAKlF,iBACE,EACA,EACA,CACA,OAAO,KAAK,QACV,OACA,iBAAiB,EAAK,SACtB,EACD,CAGH,gBAAgB,EAAc,EAAO,EAAG,EAAU,GAAI,CACpD,OAAO,KAAK,QAaT,MAAO,iBAAiB,EAAK,oBAAoB,EAAK,YAAY,IAAU,CAGjF,iBAAiB,EAAc,EAAc,EAAkE,CAC7G,OAAO,KAAK,QACV,QACA,iBAAiB,EAAK,eAAe,IACrC,EACD,CAKH,WAAW,EAAc,CACvB,OAAO,KAAK,QAA8D,MAAO,iBAAiB,EAAK,MAAM,CAG/G,WAAW,EAAc,EAAkD,CACzE,OAAO,KAAK,QAA+C,MAAO,iBAAiB,EAAK,MAAO,CAAE,YAAW,CAAC,CAK/G,SAAS,EAAc,CACrB,OAAO,KAAK,QAGT,OAAQ,iBAAiB,EAAK,WAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TarBuilder.mjs","names":[],"sources":["../../src/Deploy/TarBuilder.ts"],"sourcesContent":["/**\n * TarBuilder\n *\n * Creates a deployment tarball containing dist/, package.json,\n * package-lock.json (or bun.lockb), and ecosystem.config.js.\n */\n\nimport { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { tmpdir } from 'os';\nimport { join } from 'path';\n\nexport interface TarBuildResult {\n path: string;\n timestamp: string;\n}\n\nexport class TarBuilder {\n /**\n * Build a tarball from the project directory.\n * Returns the path to the tarball and the release timestamp.\n */\n static build(projectDir: string = process.cwd()): TarBuildResult {\n const timestamp = new Date()\n .toISOString()\n .replace(/[:\\-T.Z]/g, '')\n .slice(0, 14);\n const tarName = `deploy-${timestamp}.tar.gz`;\n const tarPath = join(tmpdir(), tarName);\n\n // Collect files/dirs to include\n const includes: string[] = ['dist'];\n\n const optionals = [\n 'package.json',\n 'package-lock.json',\n 'bun.lockb',\n 'yarn.lock',\n 'tsconfig.json',\n 'ecosystem.config.js',\n 'ecosystem.config.cjs',\n 'dist-entry.js',\n ];\n\n for (const f of optionals) {\n if (existsSync(join(projectDir, f))) {\n includes.push(f);\n }\n }\n\n if (!existsSync(join(projectDir, 'dist'))) {\n throw new Error('dist/ directory not found. Run npm run build first.');\n }\n\n const includeList = includes.map((f) => `\"${f}\"`).join(' ');\n execSync(`tar -czf \"${tarPath}\" -C \"${projectDir}\" ${includeList}`, {\n stdio: 'inherit',\n });\n\n return { path: tarPath, timestamp };\n }\n}\n"],"mappings":"iIAiBA,IAAa,EAAb,KAAwB,CAKtB,OAAO,MAAM,EAAqB,QAAQ,KAAK,CAAkB,CAC/D,IAAM,EAAY,IAAI,MAAM,CACzB,aAAa,CACb,QAAQ,YAAa,GAAG,CACxB,MAAM,EAAG,GAAG,CACT,EAAU,UAAU,EAAU,SAC9B,EAAU,EAAK,GAAQ,CAAE,EAAQ,CAGjC,EAAqB,CAAC,OAAO,CAanC,IAAK,IAAM,
|
|
1
|
+
{"version":3,"file":"TarBuilder.mjs","names":[],"sources":["../../src/Deploy/TarBuilder.ts"],"sourcesContent":["/**\n * TarBuilder\n *\n * Creates a deployment tarball containing dist/, package.json,\n * package-lock.json (or bun.lockb), and ecosystem.config.js.\n */\n\nimport { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { tmpdir } from 'os';\nimport { join } from 'path';\n\nexport interface TarBuildResult {\n path: string;\n timestamp: string;\n}\n\nexport class TarBuilder {\n /**\n * Build a tarball from the project directory.\n * Returns the path to the tarball and the release timestamp.\n */\n static build(projectDir: string = process.cwd()): TarBuildResult {\n const timestamp = new Date()\n .toISOString()\n .replace(/[:\\-T.Z]/g, '')\n .slice(0, 14);\n const tarName = `deploy-${timestamp}.tar.gz`;\n const tarPath = join(tmpdir(), tarName);\n\n // Collect files/dirs to include\n const includes: string[] = ['dist'];\n\n const optionals = [\n 'package.json',\n 'package-lock.json',\n 'bun.lockb',\n 'yarn.lock',\n 'tsconfig.json',\n 'ecosystem.config.js',\n 'ecosystem.config.cjs',\n 'dist-entry.js',\n ];\n\n for (const f of optionals) {\n if (existsSync(join(projectDir, f))) {\n includes.push(f);\n }\n }\n\n if (!existsSync(join(projectDir, 'dist'))) {\n throw new Error('dist/ directory not found. Run npm run build first.');\n }\n\n const includeList = includes.map((f) => `\"${f}\"`).join(' ');\n execSync(`tar -czf \"${tarPath}\" -C \"${projectDir}\" ${includeList}`, {\n stdio: 'inherit',\n });\n\n return { path: tarPath, timestamp };\n }\n}\n"],"mappings":"iIAiBA,IAAa,EAAb,KAAwB,CAKtB,OAAO,MAAM,EAAqB,QAAQ,KAAK,CAAkB,CAC/D,IAAM,EAAY,IAAI,MAAM,CACzB,aAAa,CACb,QAAQ,YAAa,GAAG,CACxB,MAAM,EAAG,GAAG,CACT,EAAU,UAAU,EAAU,SAC9B,EAAU,EAAK,GAAQ,CAAE,EAAQ,CAGjC,EAAqB,CAAC,OAAO,CAanC,IAAK,IAAM,IAAK,CAVd,eACA,oBACA,YACA,YACA,gBACA,sBACA,uBACA,gBAGuB,CACnB,EAAW,EAAK,EAAY,EAAE,CAAC,EACjC,EAAS,KAAK,EAAE,CAIpB,GAAI,CAAC,EAAW,EAAK,EAAY,OAAO,CAAC,CACvC,MAAU,MAAM,sDAAsD,CAQxE,OAJA,EAAS,aAAa,EAAQ,QAAQ,EAAW,IAD7B,EAAS,IAAK,GAAM,IAAI,EAAE,GAAG,CAAC,KAAK,IACS,GAAI,CAClE,MAAO,UACR,CAAC,CAEK,CAAE,KAAM,EAAS,YAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.mjs","names":[],"sources":["../../src/Deploy/prompt.ts"],"sourcesContent":["/**\n * prompt\n *\n * Lightweight interactive prompt using readline (Node.js built-in).\n */\n\nimport { createInterface } from 'readline';\n\n/**\n * Prompt the user for input. Optionally hides input for passwords.\n */\nexport function prompt(question: string, hidden = false): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n if (hidden) {\n // Suppress echo for password input\n const muted = process.stdout;\n const write = muted.write.bind(muted);\n (muted as any).write = (chunk: any, ...args: any[]) => {\n if (typeof chunk === 'string' && chunk !== question) return true;\n return write(chunk, ...args);\n };\n\n rl.question(question, (answer) => {\n (muted as any).write = write;\n process.stdout.write('\\n');\n rl.close();\n resolve(answer);\n });\n } else {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer);\n });\n }\n });\n}\n"],"mappings":"2CAWA,SAAgB,EAAO,EAAkB,EAAS,GAAwB,CACxE,OAAO,IAAI,QAAS,GAAY,CAC9B,IAAM,EAAK,EAAgB,CACzB,MAAO,QAAQ,MACf,OAAQ,QAAQ,OACjB,CAAC,CAEF,GAAI,EAAQ,CAEV,IAAM,EAAQ,QAAQ,OAChB,EAAQ,EAAM,MAAM,KAAK,EAAM,
|
|
1
|
+
{"version":3,"file":"prompt.mjs","names":[],"sources":["../../src/Deploy/prompt.ts"],"sourcesContent":["/**\n * prompt\n *\n * Lightweight interactive prompt using readline (Node.js built-in).\n */\n\nimport { createInterface } from 'readline';\n\n/**\n * Prompt the user for input. Optionally hides input for passwords.\n */\nexport function prompt(question: string, hidden = false): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n if (hidden) {\n // Suppress echo for password input\n const muted = process.stdout;\n const write = muted.write.bind(muted);\n (muted as any).write = (chunk: any, ...args: any[]) => {\n if (typeof chunk === 'string' && chunk !== question) return true;\n return write(chunk, ...args);\n };\n\n rl.question(question, (answer) => {\n (muted as any).write = write;\n process.stdout.write('\\n');\n rl.close();\n resolve(answer);\n });\n } else {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer);\n });\n }\n });\n}\n"],"mappings":"2CAWA,SAAgB,EAAO,EAAkB,EAAS,GAAwB,CACxE,OAAO,IAAI,QAAS,GAAY,CAC9B,IAAM,EAAK,EAAgB,CACzB,MAAO,QAAQ,MACf,OAAQ,QAAQ,OACjB,CAAC,CAEF,GAAI,EAAQ,CAEV,IAAM,EAAQ,QAAQ,OAChB,EAAQ,EAAM,MAAM,KAAK,EAAM,CACrC,EAAe,OAAS,EAAY,GAAG,IACjC,OAAO,GAAU,UAAY,IAAU,EAAiB,GACrD,EAAM,EAAO,GAAG,EAAK,CAG9B,EAAG,SAAS,EAAW,GAAW,CAChC,EAAe,MAAQ,EACvB,QAAQ,OAAO,MAAM;EAAK,CAC1B,EAAG,OAAO,CACV,EAAQ,EAAO,EACf,MAEF,EAAG,SAAS,EAAW,GAAW,CAChC,EAAG,OAAO,CACV,EAAQ,EAAO,EACf,EAEJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);var e=class{listeners=new Map;wildcards=new Map;queuedEvents=new Map;constructor(e){this.container=e}listen(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)e.includes(`*`)?this.setupWildcardListen(e,t):(this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t))}hasListeners(e){return this.getListeners(e).length>0}subscribe(e){let t=e.subscribe(this);if(t&&typeof t==`object`)for(let[e,n]of Object.entries(t)){let t=Array.isArray(n)?n:[n];for(let n of t)this.listen(e,n)}}dispatch(e,t=[],n=!1){let[r,i]=this.parseEventAndPayload(e,t);i&&this.shouldBroadcast(i,t);let a=this.getListeners(r),o=[];for(let e of a){let a=this.callListener(e,i||r,t);if(n&&a===!1)return o;a!=null&&o.push(a)}return o}until(e,t=[]){let[n,r]=this.parseEventAndPayload(e,t),i=this.getListeners(n);for(let e of i){let i=this.callListener(e,r||n,t);if(i!=null)return i}return null}push(e,t=[]){this.queuedEvents.has(e)||this.queuedEvents.set(e,[]),this.queuedEvents.get(e).push({payload:t})}flush(e){let t=this.queuedEvents.get(e);if(!(!t||t.length===0)){for(let{payload:n}of t)this.dispatch(e,n);this.queuedEvents.delete(e)}}forget(e){this.listeners.delete(e),this.wildcards.delete(e)}forgetPushed(){this.queuedEvents.clear()}getRawListeners(){return this.listeners}getListeners(e){let t=this.listeners.get(e)||[],n=this.getWildcardListeners(e);return[...t,...n]}setupWildcardListen(e,t){this.wildcards.has(e)||this.wildcards.set(e,[]),this.wildcards.get(e).push(t)}getWildcardListeners(e){let t=[];for(let[n,r]of this.wildcards)this.wildcardMatch(n,e)&&t.push(...r);return t}wildcardMatch(e,t){let n=e.replace(/[.+?^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`.*`);return RegExp(`^${n}$`).test(t)}parseEventAndPayload(e,t){return typeof e==`string`?[e,null]:[e.constructor.name,e]}callListener(e,t,n){try{return this.makeListener(e)(t,...n)}catch(e){throw console.error(`Error calling event listener:`,e),e}}makeListener(e,t=!1){if(typeof e==`string`)return this.createClassListener(e,t);if(typeof e==`function`)return e.prototype&&typeof e.prototype.handle==`function`?(t,...n)=>new e().handle(t):e;if(typeof e==`object`&&`handle`in e){let t=e;return(e,...n)=>t.handle(e)}throw Error(`Invalid listener type: ${typeof e}`)}createClassListener(e,t=!1){return(t,...n)=>{let r=this.container.make(e);if(!r||typeof r.handle!=`function`)throw Error(`Listener [${e}] does not have a handle method`);return r.handle(t)}}shouldBroadcast(e,t){if(typeof e.shouldBroadcast==`function`)return e.shouldBroadcast();if(typeof e.broadcastOn==`function`){let t=e.broadcastOn();return Array.isArray(t)?t.length>0:!!t}return!1}};exports.Dispatcher=e;
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);var e=class{container;listeners=new Map;wildcards=new Map;queuedEvents=new Map;constructor(e){this.container=e}listen(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)e.includes(`*`)?this.setupWildcardListen(e,t):(this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t))}hasListeners(e){return this.getListeners(e).length>0}subscribe(e){let t=e.subscribe(this);if(t&&typeof t==`object`)for(let[e,n]of Object.entries(t)){let t=Array.isArray(n)?n:[n];for(let n of t)this.listen(e,n)}}dispatch(e,t=[],n=!1){let[r,i]=this.parseEventAndPayload(e,t);i&&this.shouldBroadcast(i,t);let a=this.getListeners(r),o=[];for(let e of a){let a=this.callListener(e,i||r,t);if(n&&a===!1)return o;a!=null&&o.push(a)}return o}until(e,t=[]){let[n,r]=this.parseEventAndPayload(e,t),i=this.getListeners(n);for(let e of i){let i=this.callListener(e,r||n,t);if(i!=null)return i}return null}push(e,t=[]){this.queuedEvents.has(e)||this.queuedEvents.set(e,[]),this.queuedEvents.get(e).push({payload:t})}flush(e){let t=this.queuedEvents.get(e);if(!(!t||t.length===0)){for(let{payload:n}of t)this.dispatch(e,n);this.queuedEvents.delete(e)}}forget(e){this.listeners.delete(e),this.wildcards.delete(e)}forgetPushed(){this.queuedEvents.clear()}getRawListeners(){return this.listeners}getListeners(e){let t=this.listeners.get(e)||[],n=this.getWildcardListeners(e);return[...t,...n]}setupWildcardListen(e,t){this.wildcards.has(e)||this.wildcards.set(e,[]),this.wildcards.get(e).push(t)}getWildcardListeners(e){let t=[];for(let[n,r]of this.wildcards)this.wildcardMatch(n,e)&&t.push(...r);return t}wildcardMatch(e,t){let n=e.replace(/[.+?^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`.*`);return RegExp(`^${n}$`).test(t)}parseEventAndPayload(e,t){return typeof e==`string`?[e,null]:[e.constructor.name,e]}callListener(e,t,n){try{return this.makeListener(e)(t,...n)}catch(e){throw console.error(`Error calling event listener:`,e),e}}makeListener(e,t=!1){if(typeof e==`string`)return this.createClassListener(e,t);if(typeof e==`function`)return e.prototype&&typeof e.prototype.handle==`function`?(t,...n)=>new e().handle(t):e;if(typeof e==`object`&&`handle`in e){let t=e;return(e,...n)=>t.handle(e)}throw Error(`Invalid listener type: ${typeof e}`)}createClassListener(e,t=!1){return(t,...n)=>{let r=this.container.make(e);if(!r||typeof r.handle!=`function`)throw Error(`Listener [${e}] does not have a handle method`);return r.handle(t)}}shouldBroadcast(e,t){if(typeof e.shouldBroadcast==`function`)return e.shouldBroadcast();if(typeof e.broadcastOn==`function`){let t=e.broadcastOn();return Array.isArray(t)?t.length>0:!!t}return!1}};exports.Dispatcher=e;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Container } from "../Container/Container.cjs";
|
|
2
1
|
import { Event } from "./Event.cjs";
|
|
2
|
+
import { Container } from "../Container/Container.cjs";
|
|
3
3
|
import { EventListener, EventSubscriber } from "./types.cjs";
|
|
4
4
|
import { DispatcherContract } from "./Contracts/Dispatcher.cjs";
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Container } from "../Container/Container.mjs";
|
|
2
1
|
import { Event } from "./Event.mjs";
|
|
2
|
+
import { Container } from "../Container/Container.mjs";
|
|
3
3
|
import { EventListener, EventSubscriber } from "./types.mjs";
|
|
4
4
|
import { DispatcherContract } from "./Contracts/Dispatcher.mjs";
|
|
5
5
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=class{listeners=new Map;wildcards=new Map;queuedEvents=new Map;constructor(e){this.container=e}listen(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)e.includes(`*`)?this.setupWildcardListen(e,t):(this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t))}hasListeners(e){return this.getListeners(e).length>0}subscribe(e){let t=e.subscribe(this);if(t&&typeof t==`object`)for(let[e,n]of Object.entries(t)){let t=Array.isArray(n)?n:[n];for(let n of t)this.listen(e,n)}}dispatch(e,t=[],n=!1){let[r,i]=this.parseEventAndPayload(e,t);i&&this.shouldBroadcast(i,t);let a=this.getListeners(r),o=[];for(let e of a){let a=this.callListener(e,i||r,t);if(n&&a===!1)return o;a!=null&&o.push(a)}return o}until(e,t=[]){let[n,r]=this.parseEventAndPayload(e,t),i=this.getListeners(n);for(let e of i){let i=this.callListener(e,r||n,t);if(i!=null)return i}return null}push(e,t=[]){this.queuedEvents.has(e)||this.queuedEvents.set(e,[]),this.queuedEvents.get(e).push({payload:t})}flush(e){let t=this.queuedEvents.get(e);if(!(!t||t.length===0)){for(let{payload:n}of t)this.dispatch(e,n);this.queuedEvents.delete(e)}}forget(e){this.listeners.delete(e),this.wildcards.delete(e)}forgetPushed(){this.queuedEvents.clear()}getRawListeners(){return this.listeners}getListeners(e){let t=this.listeners.get(e)||[],n=this.getWildcardListeners(e);return[...t,...n]}setupWildcardListen(e,t){this.wildcards.has(e)||this.wildcards.set(e,[]),this.wildcards.get(e).push(t)}getWildcardListeners(e){let t=[];for(let[n,r]of this.wildcards)this.wildcardMatch(n,e)&&t.push(...r);return t}wildcardMatch(e,t){let n=e.replace(/[.+?^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`.*`);return RegExp(`^${n}$`).test(t)}parseEventAndPayload(e,t){return typeof e==`string`?[e,null]:[e.constructor.name,e]}callListener(e,t,n){try{return this.makeListener(e)(t,...n)}catch(e){throw console.error(`Error calling event listener:`,e),e}}makeListener(e,t=!1){if(typeof e==`string`)return this.createClassListener(e,t);if(typeof e==`function`)return e.prototype&&typeof e.prototype.handle==`function`?(t,...n)=>new e().handle(t):e;if(typeof e==`object`&&`handle`in e){let t=e;return(e,...n)=>t.handle(e)}throw Error(`Invalid listener type: ${typeof e}`)}createClassListener(e,t=!1){return(t,...n)=>{let r=this.container.make(e);if(!r||typeof r.handle!=`function`)throw Error(`Listener [${e}] does not have a handle method`);return r.handle(t)}}shouldBroadcast(e,t){if(typeof e.shouldBroadcast==`function`)return e.shouldBroadcast();if(typeof e.broadcastOn==`function`){let t=e.broadcastOn();return Array.isArray(t)?t.length>0:!!t}return!1}};export{e as Dispatcher};
|
|
1
|
+
var e=class{container;listeners=new Map;wildcards=new Map;queuedEvents=new Map;constructor(e){this.container=e}listen(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)e.includes(`*`)?this.setupWildcardListen(e,t):(this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t))}hasListeners(e){return this.getListeners(e).length>0}subscribe(e){let t=e.subscribe(this);if(t&&typeof t==`object`)for(let[e,n]of Object.entries(t)){let t=Array.isArray(n)?n:[n];for(let n of t)this.listen(e,n)}}dispatch(e,t=[],n=!1){let[r,i]=this.parseEventAndPayload(e,t);i&&this.shouldBroadcast(i,t);let a=this.getListeners(r),o=[];for(let e of a){let a=this.callListener(e,i||r,t);if(n&&a===!1)return o;a!=null&&o.push(a)}return o}until(e,t=[]){let[n,r]=this.parseEventAndPayload(e,t),i=this.getListeners(n);for(let e of i){let i=this.callListener(e,r||n,t);if(i!=null)return i}return null}push(e,t=[]){this.queuedEvents.has(e)||this.queuedEvents.set(e,[]),this.queuedEvents.get(e).push({payload:t})}flush(e){let t=this.queuedEvents.get(e);if(!(!t||t.length===0)){for(let{payload:n}of t)this.dispatch(e,n);this.queuedEvents.delete(e)}}forget(e){this.listeners.delete(e),this.wildcards.delete(e)}forgetPushed(){this.queuedEvents.clear()}getRawListeners(){return this.listeners}getListeners(e){let t=this.listeners.get(e)||[],n=this.getWildcardListeners(e);return[...t,...n]}setupWildcardListen(e,t){this.wildcards.has(e)||this.wildcards.set(e,[]),this.wildcards.get(e).push(t)}getWildcardListeners(e){let t=[];for(let[n,r]of this.wildcards)this.wildcardMatch(n,e)&&t.push(...r);return t}wildcardMatch(e,t){let n=e.replace(/[.+?^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`.*`);return RegExp(`^${n}$`).test(t)}parseEventAndPayload(e,t){return typeof e==`string`?[e,null]:[e.constructor.name,e]}callListener(e,t,n){try{return this.makeListener(e)(t,...n)}catch(e){throw console.error(`Error calling event listener:`,e),e}}makeListener(e,t=!1){if(typeof e==`string`)return this.createClassListener(e,t);if(typeof e==`function`)return e.prototype&&typeof e.prototype.handle==`function`?(t,...n)=>new e().handle(t):e;if(typeof e==`object`&&`handle`in e){let t=e;return(e,...n)=>t.handle(e)}throw Error(`Invalid listener type: ${typeof e}`)}createClassListener(e,t=!1){return(t,...n)=>{let r=this.container.make(e);if(!r||typeof r.handle!=`function`)throw Error(`Listener [${e}] does not have a handle method`);return r.handle(t)}}shouldBroadcast(e,t){if(typeof e.shouldBroadcast==`function`)return e.shouldBroadcast();if(typeof e.broadcastOn==`function`){let t=e.broadcastOn();return Array.isArray(t)?t.length>0:!!t}return!1}};export{e as Dispatcher};
|
|
2
2
|
//# sourceMappingURL=Dispatcher.mjs.map
|