@alpha.consultings/eloquent-orm.js 1.0.1
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 +73 -0
- package/README.md +215 -0
- package/dist/Model.d.ts +2 -0
- package/dist/Model.d.ts.map +1 -0
- package/dist/Model.js +7 -0
- package/dist/Model.js.map +1 -0
- package/dist/cli/commands/cacheClear.d.ts +2 -0
- package/dist/cli/commands/cacheClear.d.ts.map +1 -0
- package/dist/cli/commands/cacheClear.js +69 -0
- package/dist/cli/commands/cacheClear.js.map +1 -0
- package/dist/cli/commands/cacheStats.d.ts +2 -0
- package/dist/cli/commands/cacheStats.d.ts.map +1 -0
- package/dist/cli/commands/cacheStats.js +55 -0
- package/dist/cli/commands/cacheStats.js.map +1 -0
- package/dist/cli/commands/dbSeed.d.ts +16 -0
- package/dist/cli/commands/dbSeed.d.ts.map +1 -0
- package/dist/cli/commands/dbSeed.js +201 -0
- package/dist/cli/commands/dbSeed.js.map +1 -0
- package/dist/cli/commands/dbSeedBootstrapPrecheck.d.ts +3 -0
- package/dist/cli/commands/dbSeedBootstrapPrecheck.d.ts.map +1 -0
- package/dist/cli/commands/dbSeedBootstrapPrecheck.js +8 -0
- package/dist/cli/commands/dbSeedBootstrapPrecheck.js.map +1 -0
- package/dist/cli/commands/dbSeedFresh.d.ts +14 -0
- package/dist/cli/commands/dbSeedFresh.d.ts.map +1 -0
- package/dist/cli/commands/dbSeedFresh.js +81 -0
- package/dist/cli/commands/dbSeedFresh.js.map +1 -0
- package/dist/cli/commands/demoScenario.d.ts +9 -0
- package/dist/cli/commands/demoScenario.d.ts.map +1 -0
- package/dist/cli/commands/demoScenario.js +185 -0
- package/dist/cli/commands/demoScenario.js.map +1 -0
- package/dist/cli/commands/factoryStatus.d.ts +9 -0
- package/dist/cli/commands/factoryStatus.d.ts.map +1 -0
- package/dist/cli/commands/factoryStatus.js +103 -0
- package/dist/cli/commands/factoryStatus.js.map +1 -0
- package/dist/cli/commands/makeController.d.ts +11 -0
- package/dist/cli/commands/makeController.d.ts.map +1 -0
- package/dist/cli/commands/makeController.js +61 -0
- package/dist/cli/commands/makeController.js.map +1 -0
- package/dist/cli/commands/makeFactory.d.ts +14 -0
- package/dist/cli/commands/makeFactory.d.ts.map +1 -0
- package/dist/cli/commands/makeFactory.js +183 -0
- package/dist/cli/commands/makeFactory.js.map +1 -0
- package/dist/cli/commands/makeMigration.d.ts +18 -0
- package/dist/cli/commands/makeMigration.d.ts.map +1 -0
- package/dist/cli/commands/makeMigration.js +496 -0
- package/dist/cli/commands/makeMigration.js.map +1 -0
- package/dist/cli/commands/makeModel.d.ts +20 -0
- package/dist/cli/commands/makeModel.d.ts.map +1 -0
- package/dist/cli/commands/makeModel.js +360 -0
- package/dist/cli/commands/makeModel.js.map +1 -0
- package/dist/cli/commands/makeRegistry.d.ts +7 -0
- package/dist/cli/commands/makeRegistry.d.ts.map +1 -0
- package/dist/cli/commands/makeRegistry.js +88 -0
- package/dist/cli/commands/makeRegistry.js.map +1 -0
- package/dist/cli/commands/makeScenario.d.ts +12 -0
- package/dist/cli/commands/makeScenario.d.ts.map +1 -0
- package/dist/cli/commands/makeScenario.js +639 -0
- package/dist/cli/commands/makeScenario.js.map +1 -0
- package/dist/cli/commands/makeSeed.d.ts +11 -0
- package/dist/cli/commands/makeSeed.d.ts.map +1 -0
- package/dist/cli/commands/makeSeed.js +47 -0
- package/dist/cli/commands/makeSeed.js.map +1 -0
- package/dist/cli/commands/makeService.d.ts +5 -0
- package/dist/cli/commands/makeService.d.ts.map +1 -0
- package/dist/cli/commands/makeService.js +31 -0
- package/dist/cli/commands/makeService.js.map +1 -0
- package/dist/cli/commands/migrateFresh.d.ts +14 -0
- package/dist/cli/commands/migrateFresh.d.ts.map +1 -0
- package/dist/cli/commands/migrateFresh.js +150 -0
- package/dist/cli/commands/migrateFresh.js.map +1 -0
- package/dist/cli/commands/migrateReset.d.ts +12 -0
- package/dist/cli/commands/migrateReset.d.ts.map +1 -0
- package/dist/cli/commands/migrateReset.js +28 -0
- package/dist/cli/commands/migrateReset.js.map +1 -0
- package/dist/cli/commands/migrateRollback.d.ts +10 -0
- package/dist/cli/commands/migrateRollback.d.ts.map +1 -0
- package/dist/cli/commands/migrateRollback.js +303 -0
- package/dist/cli/commands/migrateRollback.js.map +1 -0
- package/dist/cli/commands/migrateRun.d.ts +10 -0
- package/dist/cli/commands/migrateRun.d.ts.map +1 -0
- package/dist/cli/commands/migrateRun.js +301 -0
- package/dist/cli/commands/migrateRun.js.map +1 -0
- package/dist/cli/commands/migrateStatus.d.ts +8 -0
- package/dist/cli/commands/migrateStatus.d.ts.map +1 -0
- package/dist/cli/commands/migrateStatus.js +118 -0
- package/dist/cli/commands/migrateStatus.js.map +1 -0
- package/dist/cli/eloquent.d.ts +18 -0
- package/dist/cli/eloquent.d.ts.map +1 -0
- package/dist/cli/eloquent.js +187 -0
- package/dist/cli/eloquent.js.map +1 -0
- package/dist/cli/utils/ArtifactCompatibility.d.ts +10 -0
- package/dist/cli/utils/ArtifactCompatibility.d.ts.map +1 -0
- package/dist/cli/utils/ArtifactCompatibility.js +60 -0
- package/dist/cli/utils/ArtifactCompatibility.js.map +1 -0
- package/dist/cli/utils/ArtifactRoutingReport.d.ts +10 -0
- package/dist/cli/utils/ArtifactRoutingReport.d.ts.map +1 -0
- package/dist/cli/utils/ArtifactRoutingReport.js +25 -0
- package/dist/cli/utils/ArtifactRoutingReport.js.map +1 -0
- package/dist/cli/utils/ArtifactStorage.d.ts +10 -0
- package/dist/cli/utils/ArtifactStorage.d.ts.map +1 -0
- package/dist/cli/utils/ArtifactStorage.js +193 -0
- package/dist/cli/utils/ArtifactStorage.js.map +1 -0
- package/dist/cli/utils/AuditTrail.d.ts +25 -0
- package/dist/cli/utils/AuditTrail.d.ts.map +1 -0
- package/dist/cli/utils/AuditTrail.js +74 -0
- package/dist/cli/utils/AuditTrail.js.map +1 -0
- package/dist/cli/utils/CliActionRuntime.d.ts +5 -0
- package/dist/cli/utils/CliActionRuntime.d.ts.map +1 -0
- package/dist/cli/utils/CliActionRuntime.js +22 -0
- package/dist/cli/utils/CliActionRuntime.js.map +1 -0
- package/dist/cli/utils/CliBootstrapSupport.d.ts +13 -0
- package/dist/cli/utils/CliBootstrapSupport.d.ts.map +1 -0
- package/dist/cli/utils/CliBootstrapSupport.js +55 -0
- package/dist/cli/utils/CliBootstrapSupport.js.map +1 -0
- package/dist/cli/utils/CliCommandCatalog.d.ts +6 -0
- package/dist/cli/utils/CliCommandCatalog.d.ts.map +1 -0
- package/dist/cli/utils/CliCommandCatalog.js +78 -0
- package/dist/cli/utils/CliCommandCatalog.js.map +1 -0
- package/dist/cli/utils/CliCommandTargets.d.ts +8 -0
- package/dist/cli/utils/CliCommandTargets.d.ts.map +1 -0
- package/dist/cli/utils/CliCommandTargets.js +19 -0
- package/dist/cli/utils/CliCommandTargets.js.map +1 -0
- package/dist/cli/utils/CliMakeArtifactCommandRegistration.d.ts +3 -0
- package/dist/cli/utils/CliMakeArtifactCommandRegistration.d.ts.map +1 -0
- package/dist/cli/utils/CliMakeArtifactCommandRegistration.js +94 -0
- package/dist/cli/utils/CliMakeArtifactCommandRegistration.js.map +1 -0
- package/dist/cli/utils/CliMigrationCommandRegistration.d.ts +3 -0
- package/dist/cli/utils/CliMigrationCommandRegistration.d.ts.map +1 -0
- package/dist/cli/utils/CliMigrationCommandRegistration.js +195 -0
- package/dist/cli/utils/CliMigrationCommandRegistration.js.map +1 -0
- package/dist/cli/utils/CliPresentation.d.ts +2 -0
- package/dist/cli/utils/CliPresentation.d.ts.map +1 -0
- package/dist/cli/utils/CliPresentation.js +13 -0
- package/dist/cli/utils/CliPresentation.js.map +1 -0
- package/dist/cli/utils/CliProductionGuards.d.ts +11 -0
- package/dist/cli/utils/CliProductionGuards.d.ts.map +1 -0
- package/dist/cli/utils/CliProductionGuards.js +34 -0
- package/dist/cli/utils/CliProductionGuards.js.map +1 -0
- package/dist/cli/utils/CliScaffoldCommandRegistration.d.ts +3 -0
- package/dist/cli/utils/CliScaffoldCommandRegistration.d.ts.map +1 -0
- package/dist/cli/utils/CliScaffoldCommandRegistration.js +89 -0
- package/dist/cli/utils/CliScaffoldCommandRegistration.js.map +1 -0
- package/dist/cli/utils/CliSeedScenarioCommandRegistration.d.ts +3 -0
- package/dist/cli/utils/CliSeedScenarioCommandRegistration.d.ts.map +1 -0
- package/dist/cli/utils/CliSeedScenarioCommandRegistration.js +123 -0
- package/dist/cli/utils/CliSeedScenarioCommandRegistration.js.map +1 -0
- package/dist/cli/utils/CliSupportCommandRegistration.d.ts +3 -0
- package/dist/cli/utils/CliSupportCommandRegistration.d.ts.map +1 -0
- package/dist/cli/utils/CliSupportCommandRegistration.js +44 -0
- package/dist/cli/utils/CliSupportCommandRegistration.js.map +1 -0
- package/dist/cli/utils/ConsoleSilencer.d.ts +6 -0
- package/dist/cli/utils/ConsoleSilencer.d.ts.map +1 -0
- package/dist/cli/utils/ConsoleSilencer.js +25 -0
- package/dist/cli/utils/ConsoleSilencer.js.map +1 -0
- package/dist/cli/utils/ImportResolver.d.ts +16 -0
- package/dist/cli/utils/ImportResolver.d.ts.map +1 -0
- package/dist/cli/utils/ImportResolver.js +57 -0
- package/dist/cli/utils/ImportResolver.js.map +1 -0
- package/dist/cli/utils/ModelIntrospector.d.ts +33 -0
- package/dist/cli/utils/ModelIntrospector.d.ts.map +1 -0
- package/dist/cli/utils/ModelIntrospector.js +76 -0
- package/dist/cli/utils/ModelIntrospector.js.map +1 -0
- package/dist/cli/utils/PathMap.d.ts +58 -0
- package/dist/cli/utils/PathMap.d.ts.map +1 -0
- package/dist/cli/utils/PathMap.js +132 -0
- package/dist/cli/utils/PathMap.js.map +1 -0
- package/dist/cli/utils/ProductionSafety.d.ts +25 -0
- package/dist/cli/utils/ProductionSafety.d.ts.map +1 -0
- package/dist/cli/utils/ProductionSafety.js +61 -0
- package/dist/cli/utils/ProductionSafety.js.map +1 -0
- package/dist/cli/utils/ScaffoldGeneratorSupport.d.ts +16 -0
- package/dist/cli/utils/ScaffoldGeneratorSupport.d.ts.map +1 -0
- package/dist/cli/utils/ScaffoldGeneratorSupport.js +66 -0
- package/dist/cli/utils/ScaffoldGeneratorSupport.js.map +1 -0
- package/dist/cli/utils/ScenarioMorphAliasRouting.d.ts +14 -0
- package/dist/cli/utils/ScenarioMorphAliasRouting.d.ts.map +1 -0
- package/dist/cli/utils/ScenarioMorphAliasRouting.js +62 -0
- package/dist/cli/utils/ScenarioMorphAliasRouting.js.map +1 -0
- package/dist/cli/utils/SeedBootstrapPrecheck.d.ts +20 -0
- package/dist/cli/utils/SeedBootstrapPrecheck.d.ts.map +1 -0
- package/dist/cli/utils/SeedBootstrapPrecheck.js +133 -0
- package/dist/cli/utils/SeedBootstrapPrecheck.js.map +1 -0
- package/dist/cli/utils/StructuredLogger.d.ts +11 -0
- package/dist/cli/utils/StructuredLogger.d.ts.map +1 -0
- package/dist/cli/utils/StructuredLogger.js +53 -0
- package/dist/cli/utils/StructuredLogger.js.map +1 -0
- package/dist/cli/utils/TemplateEngine.d.ts +30 -0
- package/dist/cli/utils/TemplateEngine.d.ts.map +1 -0
- package/dist/cli/utils/TemplateEngine.js +165 -0
- package/dist/cli/utils/TemplateEngine.js.map +1 -0
- package/dist/cli/utils/factories/Factory.d.ts +61 -0
- package/dist/cli/utils/factories/Factory.d.ts.map +1 -0
- package/dist/cli/utils/factories/Factory.js +140 -0
- package/dist/cli/utils/factories/Factory.js.map +1 -0
- package/dist/cli/utils/factories/FactoryDisplay.d.ts +6 -0
- package/dist/cli/utils/factories/FactoryDisplay.d.ts.map +1 -0
- package/dist/cli/utils/factories/FactoryDisplay.js +26 -0
- package/dist/cli/utils/factories/FactoryDisplay.js.map +1 -0
- package/dist/cli/utils/factories/FactoryGraph.d.ts +6 -0
- package/dist/cli/utils/factories/FactoryGraph.d.ts.map +1 -0
- package/dist/cli/utils/factories/FactoryGraph.js +72 -0
- package/dist/cli/utils/factories/FactoryGraph.js.map +1 -0
- package/dist/cli/utils/factories/FactoryLoader.d.ts +16 -0
- package/dist/cli/utils/factories/FactoryLoader.d.ts.map +1 -0
- package/dist/cli/utils/factories/FactoryLoader.js +35 -0
- package/dist/cli/utils/factories/FactoryLoader.js.map +1 -0
- package/dist/cli/utils/factories/FactoryRegistry.d.ts +16 -0
- package/dist/cli/utils/factories/FactoryRegistry.d.ts.map +1 -0
- package/dist/cli/utils/factories/FactoryRegistry.js +87 -0
- package/dist/cli/utils/factories/FactoryRegistry.js.map +1 -0
- package/dist/cli/utils/fileWriter.d.ts +7 -0
- package/dist/cli/utils/fileWriter.d.ts.map +1 -0
- package/dist/cli/utils/fileWriter.js +61 -0
- package/dist/cli/utils/fileWriter.js.map +1 -0
- package/dist/cli/utils/migrations/MigrationLockStrategy.d.ts +21 -0
- package/dist/cli/utils/migrations/MigrationLockStrategy.d.ts.map +1 -0
- package/dist/cli/utils/migrations/MigrationLockStrategy.js +129 -0
- package/dist/cli/utils/migrations/MigrationLockStrategy.js.map +1 -0
- package/dist/cli/utils/migrations/MigrationTracker.d.ts +25 -0
- package/dist/cli/utils/migrations/MigrationTracker.d.ts.map +1 -0
- package/dist/cli/utils/migrations/MigrationTracker.js +279 -0
- package/dist/cli/utils/migrations/MigrationTracker.js.map +1 -0
- package/dist/cli/utils/migrations/MongoMigrationTracker.d.ts +18 -0
- package/dist/cli/utils/migrations/MongoMigrationTracker.d.ts.map +1 -0
- package/dist/cli/utils/migrations/MongoMigrationTracker.js +276 -0
- package/dist/cli/utils/migrations/MongoMigrationTracker.js.map +1 -0
- package/dist/cli/utils/resolveConnectionFlags.d.ts +14 -0
- package/dist/cli/utils/resolveConnectionFlags.d.ts.map +1 -0
- package/dist/cli/utils/resolveConnectionFlags.js +42 -0
- package/dist/cli/utils/resolveConnectionFlags.js.map +1 -0
- package/dist/cli/utils/resolveSqlConnectionFlags.d.ts +9 -0
- package/dist/cli/utils/resolveSqlConnectionFlags.d.ts.map +1 -0
- package/dist/cli/utils/resolveSqlConnectionFlags.js +23 -0
- package/dist/cli/utils/resolveSqlConnectionFlags.js.map +1 -0
- package/dist/cli/utils/typescript/BaseCommand.d.ts +15 -0
- package/dist/cli/utils/typescript/BaseCommand.d.ts.map +1 -0
- package/dist/cli/utils/typescript/BaseCommand.js +36 -0
- package/dist/cli/utils/typescript/BaseCommand.js.map +1 -0
- package/dist/cli/utils/typescript/RuntimeDetector.d.ts +16 -0
- package/dist/cli/utils/typescript/RuntimeDetector.d.ts.map +1 -0
- package/dist/cli/utils/typescript/RuntimeDetector.js +45 -0
- package/dist/cli/utils/typescript/RuntimeDetector.js.map +1 -0
- package/dist/cli/utils/typescript/TypeScriptCompiler.d.ts +25 -0
- package/dist/cli/utils/typescript/TypeScriptCompiler.d.ts.map +1 -0
- package/dist/cli/utils/typescript/TypeScriptCompiler.js +109 -0
- package/dist/cli/utils/typescript/TypeScriptCompiler.js.map +1 -0
- package/dist/cli/utils/typescript/tsRuntime.d.ts +12 -0
- package/dist/cli/utils/typescript/tsRuntime.d.ts.map +1 -0
- package/dist/cli/utils/typescript/tsRuntime.js +189 -0
- package/dist/cli/utils/typescript/tsRuntime.js.map +1 -0
- package/dist/config/database.d.ts +58 -0
- package/dist/config/database.d.ts.map +1 -0
- package/dist/config/database.js +106 -0
- package/dist/config/database.js.map +1 -0
- package/dist/config/dbRoleEnv.d.ts +31 -0
- package/dist/config/dbRoleEnv.d.ts.map +1 -0
- package/dist/config/dbRoleEnv.js +171 -0
- package/dist/config/dbRoleEnv.js.map +1 -0
- package/dist/core/cache/CacheAnalytics.d.ts +47 -0
- package/dist/core/cache/CacheAnalytics.d.ts.map +1 -0
- package/dist/core/cache/CacheAnalytics.js +113 -0
- package/dist/core/cache/CacheAnalytics.js.map +1 -0
- package/dist/core/cache/CacheDriver.d.ts +19 -0
- package/dist/core/cache/CacheDriver.d.ts.map +1 -0
- package/dist/core/cache/CacheDriver.js +8 -0
- package/dist/core/cache/CacheDriver.js.map +1 -0
- package/dist/core/cache/CacheFallbackManager.d.ts +35 -0
- package/dist/core/cache/CacheFallbackManager.d.ts.map +1 -0
- package/dist/core/cache/CacheFallbackManager.js +118 -0
- package/dist/core/cache/CacheFallbackManager.js.map +1 -0
- package/dist/core/cache/CacheManager.d.ts +11 -0
- package/dist/core/cache/CacheManager.d.ts.map +1 -0
- package/dist/core/cache/CacheManager.js +27 -0
- package/dist/core/cache/CacheManager.js.map +1 -0
- package/dist/core/cache/CacheRegistry.d.ts +49 -0
- package/dist/core/cache/CacheRegistry.d.ts.map +1 -0
- package/dist/core/cache/CacheRegistry.js +117 -0
- package/dist/core/cache/CacheRegistry.js.map +1 -0
- package/dist/core/cache/drivers/FileCacheDriver.d.ts +11 -0
- package/dist/core/cache/drivers/FileCacheDriver.d.ts.map +1 -0
- package/dist/core/cache/drivers/FileCacheDriver.js +54 -0
- package/dist/core/cache/drivers/FileCacheDriver.js.map +1 -0
- package/dist/core/cache/drivers/MemcachedCacheDriver.d.ts +15 -0
- package/dist/core/cache/drivers/MemcachedCacheDriver.d.ts.map +1 -0
- package/dist/core/cache/drivers/MemcachedCacheDriver.js +60 -0
- package/dist/core/cache/drivers/MemcachedCacheDriver.js.map +1 -0
- package/dist/core/cache/drivers/MemoryCacheDriver.d.ts +9 -0
- package/dist/core/cache/drivers/MemoryCacheDriver.d.ts.map +1 -0
- package/dist/core/cache/drivers/MemoryCacheDriver.js +33 -0
- package/dist/core/cache/drivers/MemoryCacheDriver.js.map +1 -0
- package/dist/core/cache/setupCache.d.ts +2 -0
- package/dist/core/cache/setupCache.d.ts.map +1 -0
- package/dist/core/cache/setupCache.js +38 -0
- package/dist/core/cache/setupCache.js.map +1 -0
- package/dist/core/connection/BetterSqliteConnection.d.ts +23 -0
- package/dist/core/connection/BetterSqliteConnection.d.ts.map +1 -0
- package/dist/core/connection/BetterSqliteConnection.js +33 -0
- package/dist/core/connection/BetterSqliteConnection.js.map +1 -0
- package/dist/core/connection/ConnectionFactory.d.ts +18 -0
- package/dist/core/connection/ConnectionFactory.d.ts.map +1 -0
- package/dist/core/connection/ConnectionFactory.js +111 -0
- package/dist/core/connection/ConnectionFactory.js.map +1 -0
- package/dist/core/connection/DatabaseConnection.d.ts +49 -0
- package/dist/core/connection/DatabaseConnection.d.ts.map +1 -0
- package/dist/core/connection/DatabaseConnection.js +120 -0
- package/dist/core/connection/DatabaseConnection.js.map +1 -0
- package/dist/core/connection/DriverAdapter.d.ts +23 -0
- package/dist/core/connection/DriverAdapter.d.ts.map +1 -0
- package/dist/core/connection/DriverAdapter.js +145 -0
- package/dist/core/connection/DriverAdapter.js.map +1 -0
- package/dist/core/connection/resolveConnectionName.d.ts +17 -0
- package/dist/core/connection/resolveConnectionName.d.ts.map +1 -0
- package/dist/core/connection/resolveConnectionName.js +47 -0
- package/dist/core/connection/resolveConnectionName.js.map +1 -0
- package/dist/core/model/BaseModel.d.ts +247 -0
- package/dist/core/model/BaseModel.d.ts.map +1 -0
- package/dist/core/model/BaseModel.js +165 -0
- package/dist/core/model/BaseModel.js.map +1 -0
- package/dist/core/model/BaseModelSafeFinderStatics.d.ts +33 -0
- package/dist/core/model/BaseModelSafeFinderStatics.d.ts.map +1 -0
- package/dist/core/model/BaseModelSafeFinderStatics.js +87 -0
- package/dist/core/model/BaseModelSafeFinderStatics.js.map +1 -0
- package/dist/core/model/CoreModel.d.ts +134 -0
- package/dist/core/model/CoreModel.d.ts.map +1 -0
- package/dist/core/model/CoreModel.js +541 -0
- package/dist/core/model/CoreModel.js.map +1 -0
- package/dist/core/model/CoreModelPersistenceState.d.ts +36 -0
- package/dist/core/model/CoreModelPersistenceState.d.ts.map +1 -0
- package/dist/core/model/CoreModelPersistenceState.js +141 -0
- package/dist/core/model/CoreModelPersistenceState.js.map +1 -0
- package/dist/core/model/CoreModelSafeFinderSupport.d.ts +5 -0
- package/dist/core/model/CoreModelSafeFinderSupport.d.ts.map +1 -0
- package/dist/core/model/CoreModelSafeFinderSupport.js +15 -0
- package/dist/core/model/CoreModelSafeFinderSupport.js.map +1 -0
- package/dist/core/model/CoreModelValidationEvents.d.ts +24 -0
- package/dist/core/model/CoreModelValidationEvents.d.ts.map +1 -0
- package/dist/core/model/CoreModelValidationEvents.js +45 -0
- package/dist/core/model/CoreModelValidationEvents.js.map +1 -0
- package/dist/core/model/SafeFinder.d.ts +46 -0
- package/dist/core/model/SafeFinder.d.ts.map +1 -0
- package/dist/core/model/SafeFinder.js +223 -0
- package/dist/core/model/SafeFinder.js.map +1 -0
- package/dist/core/orm/Relation.d.ts +47 -0
- package/dist/core/orm/Relation.d.ts.map +1 -0
- package/dist/core/orm/Relation.js +62 -0
- package/dist/core/orm/Relation.js.map +1 -0
- package/dist/core/orm/mixins/CastsMixin.d.ts +18 -0
- package/dist/core/orm/mixins/CastsMixin.d.ts.map +1 -0
- package/dist/core/orm/mixins/CastsMixin.js +125 -0
- package/dist/core/orm/mixins/CastsMixin.js.map +1 -0
- package/dist/core/orm/mixins/EagerLoadingMixin.d.ts +19 -0
- package/dist/core/orm/mixins/EagerLoadingMixin.d.ts.map +1 -0
- package/dist/core/orm/mixins/EagerLoadingMixin.js +137 -0
- package/dist/core/orm/mixins/EagerLoadingMixin.js.map +1 -0
- package/dist/core/orm/mixins/HooksMixin.d.ts +16 -0
- package/dist/core/orm/mixins/HooksMixin.d.ts.map +1 -0
- package/dist/core/orm/mixins/HooksMixin.js +95 -0
- package/dist/core/orm/mixins/HooksMixin.js.map +1 -0
- package/dist/core/orm/mixins/MorphRegistry.d.ts +47 -0
- package/dist/core/orm/mixins/MorphRegistry.d.ts.map +1 -0
- package/dist/core/orm/mixins/MorphRegistry.js +67 -0
- package/dist/core/orm/mixins/MorphRegistry.js.map +1 -0
- package/dist/core/orm/mixins/MorphableMixin.d.ts +29 -0
- package/dist/core/orm/mixins/MorphableMixin.d.ts.map +1 -0
- package/dist/core/orm/mixins/MorphableMixin.js +93 -0
- package/dist/core/orm/mixins/MorphableMixin.js.map +1 -0
- package/dist/core/orm/mixins/PivotHelperMixin.d.ts +26 -0
- package/dist/core/orm/mixins/PivotHelperMixin.d.ts.map +1 -0
- package/dist/core/orm/mixins/PivotHelperMixin.js +102 -0
- package/dist/core/orm/mixins/PivotHelperMixin.js.map +1 -0
- package/dist/core/orm/mixins/QueryCacheMixin.d.ts +23 -0
- package/dist/core/orm/mixins/QueryCacheMixin.d.ts.map +1 -0
- package/dist/core/orm/mixins/QueryCacheMixin.js +172 -0
- package/dist/core/orm/mixins/QueryCacheMixin.js.map +1 -0
- package/dist/core/orm/mixins/ScopeMixin.d.ts +20 -0
- package/dist/core/orm/mixins/ScopeMixin.d.ts.map +1 -0
- package/dist/core/orm/mixins/ScopeMixin.js +72 -0
- package/dist/core/orm/mixins/ScopeMixin.js.map +1 -0
- package/dist/core/orm/mixins/SerializeMixin.d.ts +44 -0
- package/dist/core/orm/mixins/SerializeMixin.d.ts.map +1 -0
- package/dist/core/orm/mixins/SerializeMixin.js +80 -0
- package/dist/core/orm/mixins/SerializeMixin.js.map +1 -0
- package/dist/core/orm/mixins/SoftDeletesMixin.d.ts +22 -0
- package/dist/core/orm/mixins/SoftDeletesMixin.d.ts.map +1 -0
- package/dist/core/orm/mixins/SoftDeletesMixin.js +146 -0
- package/dist/core/orm/mixins/SoftDeletesMixin.js.map +1 -0
- package/dist/core/orm/mixins/utils/BaseMethodResolver.d.ts +8 -0
- package/dist/core/orm/mixins/utils/BaseMethodResolver.d.ts.map +1 -0
- package/dist/core/orm/mixins/utils/BaseMethodResolver.js +26 -0
- package/dist/core/orm/mixins/utils/BaseMethodResolver.js.map +1 -0
- package/dist/core/orm/mixins/utils/HookStore.d.ts +26 -0
- package/dist/core/orm/mixins/utils/HookStore.d.ts.map +1 -0
- package/dist/core/orm/mixins/utils/HookStore.js +78 -0
- package/dist/core/orm/mixins/utils/HookStore.js.map +1 -0
- package/dist/core/orm/mixins/utils/ModelRegistry.d.ts +33 -0
- package/dist/core/orm/mixins/utils/ModelRegistry.d.ts.map +1 -0
- package/dist/core/orm/mixins/utils/ModelRegistry.js +87 -0
- package/dist/core/orm/mixins/utils/ModelRegistry.js.map +1 -0
- package/dist/core/orm/mixins/utils/modelRegistration.d.ts +9 -0
- package/dist/core/orm/mixins/utils/modelRegistration.d.ts.map +1 -0
- package/dist/core/orm/mixins/utils/modelRegistration.js +26 -0
- package/dist/core/orm/mixins/utils/modelRegistration.js.map +1 -0
- package/dist/core/orm/relations/BelongsTo.d.ts +6 -0
- package/dist/core/orm/relations/BelongsTo.d.ts.map +1 -0
- package/dist/core/orm/relations/BelongsTo.js +70 -0
- package/dist/core/orm/relations/BelongsTo.js.map +1 -0
- package/dist/core/orm/relations/BelongsToMany.d.ts +14 -0
- package/dist/core/orm/relations/BelongsToMany.d.ts.map +1 -0
- package/dist/core/orm/relations/BelongsToMany.js +245 -0
- package/dist/core/orm/relations/BelongsToMany.js.map +1 -0
- package/dist/core/orm/relations/HasMany.d.ts +6 -0
- package/dist/core/orm/relations/HasMany.d.ts.map +1 -0
- package/dist/core/orm/relations/HasMany.js +75 -0
- package/dist/core/orm/relations/HasMany.js.map +1 -0
- package/dist/core/orm/relations/HasOne.d.ts +6 -0
- package/dist/core/orm/relations/HasOne.d.ts.map +1 -0
- package/dist/core/orm/relations/HasOne.js +71 -0
- package/dist/core/orm/relations/HasOne.js.map +1 -0
- package/dist/core/orm/relations/MorphMany.d.ts +9 -0
- package/dist/core/orm/relations/MorphMany.d.ts.map +1 -0
- package/dist/core/orm/relations/MorphMany.js +107 -0
- package/dist/core/orm/relations/MorphMany.js.map +1 -0
- package/dist/core/orm/relations/MorphOne.d.ts +9 -0
- package/dist/core/orm/relations/MorphOne.d.ts.map +1 -0
- package/dist/core/orm/relations/MorphOne.js +101 -0
- package/dist/core/orm/relations/MorphOne.js.map +1 -0
- package/dist/core/orm/relations/MorphTo.d.ts +9 -0
- package/dist/core/orm/relations/MorphTo.d.ts.map +1 -0
- package/dist/core/orm/relations/MorphTo.js +85 -0
- package/dist/core/orm/relations/MorphTo.js.map +1 -0
- package/dist/core/schema/SQLDialect.d.ts +22 -0
- package/dist/core/schema/SQLDialect.d.ts.map +1 -0
- package/dist/core/schema/SQLDialect.js +38 -0
- package/dist/core/schema/SQLDialect.js.map +1 -0
- package/dist/core/schema/SchemaBlueprint.d.ts +61 -0
- package/dist/core/schema/SchemaBlueprint.d.ts.map +1 -0
- package/dist/core/schema/SchemaBlueprint.js +62 -0
- package/dist/core/schema/SchemaBlueprint.js.map +1 -0
- package/dist/core/schema/SchemaBuilder.d.ts +29 -0
- package/dist/core/schema/SchemaBuilder.d.ts.map +1 -0
- package/dist/core/schema/SchemaBuilder.js +661 -0
- package/dist/core/schema/SchemaBuilder.js.map +1 -0
- package/dist/core/schema/SchemaValidator.d.ts +23 -0
- package/dist/core/schema/SchemaValidator.d.ts.map +1 -0
- package/dist/core/schema/SchemaValidator.js +75 -0
- package/dist/core/schema/SchemaValidator.js.map +1 -0
- package/dist/core/security/AbstractSecurity.d.ts +24 -0
- package/dist/core/security/AbstractSecurity.d.ts.map +1 -0
- package/dist/core/security/AbstractSecurity.js +58 -0
- package/dist/core/security/AbstractSecurity.js.map +1 -0
- package/dist/core/security/EnvKeySecurity.d.ts +11 -0
- package/dist/core/security/EnvKeySecurity.d.ts.map +1 -0
- package/dist/core/security/EnvKeySecurity.js +46 -0
- package/dist/core/security/EnvKeySecurity.js.map +1 -0
- package/dist/core/security/NoSecurity.d.ts +10 -0
- package/dist/core/security/NoSecurity.d.ts.map +1 -0
- package/dist/core/security/NoSecurity.js +18 -0
- package/dist/core/security/NoSecurity.js.map +1 -0
- package/dist/core/security/SecretRedactor.d.ts +4 -0
- package/dist/core/security/SecretRedactor.d.ts.map +1 -0
- package/dist/core/security/SecretRedactor.js +60 -0
- package/dist/core/security/SecretRedactor.js.map +1 -0
- package/dist/core/security/SecurityContract.d.ts +13 -0
- package/dist/core/security/SecurityContract.d.ts.map +1 -0
- package/dist/core/security/SecurityContract.js +3 -0
- package/dist/core/security/SecurityContract.js.map +1 -0
- package/dist/core/security/SecurityFactory.d.ts +9 -0
- package/dist/core/security/SecurityFactory.d.ts.map +1 -0
- package/dist/core/security/SecurityFactory.js +29 -0
- package/dist/core/security/SecurityFactory.js.map +1 -0
- package/dist/core/security/index.d.ts +6 -0
- package/dist/core/security/index.d.ts.map +1 -0
- package/dist/core/security/index.js +22 -0
- package/dist/core/security/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/package.json +104 -0
- package/src/cli/templates/controller.tpl +80 -0
- package/src/cli/templates/factory.tpl +14 -0
- package/src/cli/templates/migration.tpl +36 -0
- package/src/cli/templates/model-registry.tpl +16 -0
- package/src/cli/templates/model.tpl +95 -0
- package/src/cli/templates/pivot-factory.tpl +85 -0
- package/src/cli/templates/seed.tpl +20 -0
- package/src/cli/templates/service.tpl +40 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Relation = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* ฺูบยงยฉ Base Relation
|
|
6
|
+
* Handles relation definition + auto-detected name from caller method.
|
|
7
|
+
*/
|
|
8
|
+
class Relation {
|
|
9
|
+
constructor(relatedModel, foreignKey, localKey, name) {
|
|
10
|
+
this.relatedModel = relatedModel;
|
|
11
|
+
this.foreignKey = foreignKey;
|
|
12
|
+
this.localKey = localKey;
|
|
13
|
+
this.name = name ?? this.detectRelationName();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* ฺูบยงย Auto-detect relation name (e.g., "posts" from user.posts())
|
|
17
|
+
*/
|
|
18
|
+
detectRelationName() {
|
|
19
|
+
try {
|
|
20
|
+
const err = new Error();
|
|
21
|
+
const stack = err.stack?.split("\n") || [];
|
|
22
|
+
const callerLine = stack.find((line) => line.includes("."));
|
|
23
|
+
if (!callerLine)
|
|
24
|
+
return undefined;
|
|
25
|
+
const match = callerLine.match(/\.([a-zA-Z0-9_]+)\s*\(/);
|
|
26
|
+
return match ? match[1] : undefined;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
isMongoDatabase(db) {
|
|
33
|
+
return !!db && typeof db.collection === "function";
|
|
34
|
+
}
|
|
35
|
+
buildMongoEqualityFilter(field, value) {
|
|
36
|
+
if (field === "id") {
|
|
37
|
+
return { $or: [{ id: value }, { _id: value }] };
|
|
38
|
+
}
|
|
39
|
+
if (field === "_id") {
|
|
40
|
+
return { $or: [{ _id: value }, { id: value }] };
|
|
41
|
+
}
|
|
42
|
+
return { [field]: value };
|
|
43
|
+
}
|
|
44
|
+
buildMongoInFilter(field, values) {
|
|
45
|
+
if (field === "id") {
|
|
46
|
+
return { $or: [{ id: { $in: values } }, { _id: { $in: values } }] };
|
|
47
|
+
}
|
|
48
|
+
if (field === "_id") {
|
|
49
|
+
return { $or: [{ _id: { $in: values } }, { id: { $in: values } }] };
|
|
50
|
+
}
|
|
51
|
+
return { [field]: { $in: values } };
|
|
52
|
+
}
|
|
53
|
+
getMongoComparableValues(record, field) {
|
|
54
|
+
if (field === "id" || field === "_id") {
|
|
55
|
+
return [record.id, record._id].filter((value) => value !== undefined);
|
|
56
|
+
}
|
|
57
|
+
const value = record[field];
|
|
58
|
+
return value === undefined ? [] : [value];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.Relation = Relation;
|
|
62
|
+
//# sourceMappingURL=Relation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Relation.js","sourceRoot":"","sources":["../../../src/core/orm/Relation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๐ญ CastsMixin
|
|
3
|
+
* Adds attribute type casting (dates, numbers, booleans, JSON)
|
|
4
|
+
* โ
No abstract overload errors
|
|
5
|
+
* โ
Clean ESLint/TS-compatible super calls
|
|
6
|
+
*/
|
|
7
|
+
export interface Castable {
|
|
8
|
+
find(id: number | string, pk?: string): Promise<this | null>;
|
|
9
|
+
all(): Promise<this[]>;
|
|
10
|
+
create(data: Record<string, unknown>): Promise<this>;
|
|
11
|
+
update(data: Record<string, unknown>, pk?: string): this;
|
|
12
|
+
update(id: number | string, data: Record<string, unknown>, pk?: string): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/** Generic constructor helper */
|
|
15
|
+
type Constructor<T = object> = abstract new (...args: any[]) => T;
|
|
16
|
+
export declare function CastsMixin<TBase extends Constructor>(Base: TBase): TBase & (abstract new (...args: any[]) => Castable);
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=CastsMixin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CastsMixin.d.ts","sourceRoot":"","sources":["../../../../src/core/orm/mixins/CastsMixin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC7D,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACvB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxF;AAED,iCAAiC;AACjC,KAAK,WAAW,CAAC,CAAC,GAAG,MAAM,IAAI,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAElE,wBAAgB,UAAU,CAAC,KAAK,SAAS,WAAW,EAAE,IAAI,EAAE,KAAK,GAmI5B,KAAK,GAAG,CAAC,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,QAAQ,CAAC,CACvF"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ๐ญ CastsMixin
|
|
4
|
+
* Adds attribute type casting (dates, numbers, booleans, JSON)
|
|
5
|
+
* โ
No abstract overload errors
|
|
6
|
+
* โ
Clean ESLint/TS-compatible super calls
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.CastsMixin = CastsMixin;
|
|
10
|
+
const BaseMethodResolver_1 = require("./utils/BaseMethodResolver");
|
|
11
|
+
function CastsMixin(Base) {
|
|
12
|
+
const resolveBaseMethod = (0, BaseMethodResolver_1.createBaseMethodResolver)(Base);
|
|
13
|
+
class CastableModel extends Base {
|
|
14
|
+
constructor(...args) {
|
|
15
|
+
super(...args);
|
|
16
|
+
// โ๏ธ Define attribute casting configuration
|
|
17
|
+
this.casts = {};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* โ๏ธ Convert a single attribute value based on type.
|
|
21
|
+
*/
|
|
22
|
+
castValue(type, value) {
|
|
23
|
+
if (value === null || value === undefined)
|
|
24
|
+
return value;
|
|
25
|
+
switch (type) {
|
|
26
|
+
case "number":
|
|
27
|
+
return Number(value);
|
|
28
|
+
case "boolean":
|
|
29
|
+
if (typeof value === "string")
|
|
30
|
+
return value === "true" || value === "1";
|
|
31
|
+
if (typeof value === "number")
|
|
32
|
+
return value === 1;
|
|
33
|
+
return Boolean(value);
|
|
34
|
+
case "date":
|
|
35
|
+
return new Date(value);
|
|
36
|
+
case "json":
|
|
37
|
+
try {
|
|
38
|
+
return typeof value === "string" ? JSON.parse(value) : value;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
default:
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* ๐งฉ Cast all attributes of a record.
|
|
49
|
+
* Ensures immutability (does not mutate original).
|
|
50
|
+
*/
|
|
51
|
+
castRecord(record) {
|
|
52
|
+
const result = { ...record };
|
|
53
|
+
for (const [key, type] of Object.entries(this.casts)) {
|
|
54
|
+
if (key in result) {
|
|
55
|
+
result[key] = this.castValue(type, result[key]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* ๐ Cast single record after find().
|
|
62
|
+
*/
|
|
63
|
+
async find(id, pk = "id") {
|
|
64
|
+
const baseFind = resolveBaseMethod(this, "find");
|
|
65
|
+
if (typeof baseFind !== "function") {
|
|
66
|
+
throw new Error("Base 'find' method not found in CastsMixin chain.");
|
|
67
|
+
}
|
|
68
|
+
const record = (await baseFind(id, pk));
|
|
69
|
+
if (!record)
|
|
70
|
+
return null;
|
|
71
|
+
const casted = this.castRecord(record);
|
|
72
|
+
Object.assign(record, casted);
|
|
73
|
+
return record;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* ๐ Cast all records returned by all().
|
|
77
|
+
*/
|
|
78
|
+
async all() {
|
|
79
|
+
const baseAll = resolveBaseMethod(this, "all");
|
|
80
|
+
if (typeof baseAll !== "function") {
|
|
81
|
+
throw new Error("Base 'all' method not found in CastsMixin chain.");
|
|
82
|
+
}
|
|
83
|
+
const records = (await baseAll());
|
|
84
|
+
return records.map((r) => {
|
|
85
|
+
const casted = this.castRecord(r);
|
|
86
|
+
Object.assign(r, casted);
|
|
87
|
+
return r;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* ๐ Optional: Revert data before saving (future DB driver use)
|
|
92
|
+
*/
|
|
93
|
+
uncastData(data) {
|
|
94
|
+
return { ...data };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* โ๏ธ Dummy methods for interface satisfaction (not abstract to avoid overload conflict)
|
|
98
|
+
*/
|
|
99
|
+
async create(data) {
|
|
100
|
+
const baseCreate = resolveBaseMethod(this, "create");
|
|
101
|
+
if (typeof baseCreate !== "function") {
|
|
102
|
+
throw new Error("Base 'create' method not found in CastsMixin chain.");
|
|
103
|
+
}
|
|
104
|
+
const record = (await baseCreate(data));
|
|
105
|
+
if (!record)
|
|
106
|
+
return record;
|
|
107
|
+
const casted = this.castRecord(record);
|
|
108
|
+
Object.assign(record, casted);
|
|
109
|
+
return record;
|
|
110
|
+
}
|
|
111
|
+
update(idOrData, dataOrPk, pk = "id") {
|
|
112
|
+
const baseUpdate = resolveBaseMethod(this, "update");
|
|
113
|
+
if (typeof baseUpdate !== "function") {
|
|
114
|
+
throw new Error("Base 'update' method not found in CastsMixin chain.");
|
|
115
|
+
}
|
|
116
|
+
if (typeof idOrData === "object" && idOrData !== null && !Array.isArray(idOrData)) {
|
|
117
|
+
return baseUpdate(idOrData, dataOrPk);
|
|
118
|
+
}
|
|
119
|
+
return baseUpdate(idOrData, dataOrPk, pk);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ๐ Return merged type for proper inference
|
|
123
|
+
return CastableModel;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=CastsMixin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CastsMixin.js","sourceRoot":"","sources":["../../../../src/core/orm/mixins/CastsMixin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๐ง EagerLoadingMixin
|
|
3
|
+
* Adds support for eager loading relations (like Laravel's with()).
|
|
4
|
+
* โ
Deterministic, type-safe, and recursion-proof by searching from the captured Base.prototype.
|
|
5
|
+
*/
|
|
6
|
+
export interface EagerLoadable {
|
|
7
|
+
find(id: number | string, pk?: string): Promise<this | null>;
|
|
8
|
+
all(): Promise<this[]>;
|
|
9
|
+
getRelation?(name: string): RelationDefinition<this>;
|
|
10
|
+
}
|
|
11
|
+
export interface RelationDefinition<TParent> {
|
|
12
|
+
name?: string;
|
|
13
|
+
getResults(parent: TParent): Promise<unknown>;
|
|
14
|
+
match(records: TParent[]): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
type Constructor<T = object> = abstract new (...args: any[]) => T;
|
|
17
|
+
export declare function EagerLoadingMixin<TBase extends Constructor>(Base: TBase): TBase & (abstract new (...args: unknown[]) => EagerLoadable);
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=EagerLoadingMixin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EagerLoadingMixin.d.ts","sourceRoot":"","sources":["../../../../src/core/orm/mixins/EagerLoadingMixin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC7D,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACvB,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB,CAAC,OAAO;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,KAAK,WAAW,CAAC,CAAC,GAAG,MAAM,IAAI,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAElE,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,WAAW,EAAE,IAAI,EAAE,KAAK,GAgK9B,KAAK,GAAG,CAAC,QAAQ,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,aAAa,CAAC,CACrG"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ๐ง EagerLoadingMixin
|
|
4
|
+
* Adds support for eager loading relations (like Laravel's with()).
|
|
5
|
+
* โ
Deterministic, type-safe, and recursion-proof by searching from the captured Base.prototype.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.EagerLoadingMixin = EagerLoadingMixin;
|
|
9
|
+
function EagerLoadingMixin(Base) {
|
|
10
|
+
// Capture the prototype of the base class *at definition time*.
|
|
11
|
+
const basePrototype = Base.prototype;
|
|
12
|
+
class EagerLoadableModel extends Base {
|
|
13
|
+
constructor(...args) {
|
|
14
|
+
super(...args);
|
|
15
|
+
this.eagerRelations = [];
|
|
16
|
+
}
|
|
17
|
+
with(...relations) {
|
|
18
|
+
this.eagerRelations.push(...relations);
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
async load(...relations) {
|
|
22
|
+
const rels = relations.length ? relations : this.eagerRelations;
|
|
23
|
+
for (const relName of rels) {
|
|
24
|
+
const relation = this.getRelationStrict(relName);
|
|
25
|
+
const result = await relation.getResults(this);
|
|
26
|
+
this[relation.name ?? relName] = result;
|
|
27
|
+
}
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
getRelationStrict(name) {
|
|
31
|
+
const relationFn = this[name];
|
|
32
|
+
if (typeof relationFn !== "function") {
|
|
33
|
+
throw new Error(`Relation '${name}' is not defined on ${this.constructor.name}`);
|
|
34
|
+
}
|
|
35
|
+
const relation = relationFn.call(this);
|
|
36
|
+
relation.name = name;
|
|
37
|
+
return relation;
|
|
38
|
+
}
|
|
39
|
+
async eagerLoadRelations(records) {
|
|
40
|
+
if (!this.eagerRelations.length || records.length === 0)
|
|
41
|
+
return records;
|
|
42
|
+
const loadedTopLevels = new Set();
|
|
43
|
+
for (const relName of this.eagerRelations) {
|
|
44
|
+
const [topLevel, ...nested] = relName.split(".");
|
|
45
|
+
const relation = this.getRelationStrict(topLevel);
|
|
46
|
+
if (nested.length > 0) {
|
|
47
|
+
await this.loadNestedRelations(records, relation, nested.join("."), loadedTopLevels.has(topLevel));
|
|
48
|
+
loadedTopLevels.add(topLevel);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
await relation.match(records);
|
|
52
|
+
loadedTopLevels.add(topLevel);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return records;
|
|
56
|
+
}
|
|
57
|
+
async loadNestedRelations(records, relation, nestedPath, skipCurrentMatch = false) {
|
|
58
|
+
if (!skipCurrentMatch) {
|
|
59
|
+
await relation.match(records);
|
|
60
|
+
}
|
|
61
|
+
if (!nestedPath) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const allRelated = [];
|
|
65
|
+
for (const parent of records) {
|
|
66
|
+
const related = parent[relation.name ?? "relation"];
|
|
67
|
+
if (Array.isArray(related)) {
|
|
68
|
+
allRelated.push(...related);
|
|
69
|
+
}
|
|
70
|
+
else if (related && typeof related === "object") {
|
|
71
|
+
allRelated.push(related);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (allRelated.length > 0) {
|
|
75
|
+
const [next, ...rest] = nestedPath.split(".");
|
|
76
|
+
const firstRelated = allRelated[0];
|
|
77
|
+
if (typeof firstRelated.getRelation === "function") {
|
|
78
|
+
const nextRelation = firstRelated.getRelation(next);
|
|
79
|
+
if (nextRelation) {
|
|
80
|
+
await this.loadNestedRelations(allRelated, nextRelation, rest.join("."));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Walk prototypes starting from captured `basePrototype`.
|
|
87
|
+
* This guarantees we only inspect layers *below* this mixin.
|
|
88
|
+
*/
|
|
89
|
+
getBaseMethod(method) {
|
|
90
|
+
let proto = basePrototype;
|
|
91
|
+
const visited = new WeakSet();
|
|
92
|
+
while (proto && typeof proto === "object") {
|
|
93
|
+
if (visited.has(proto))
|
|
94
|
+
break;
|
|
95
|
+
visited.add(proto);
|
|
96
|
+
const fn = proto[method];
|
|
97
|
+
if (typeof fn === "function") {
|
|
98
|
+
// bind to current instance so `this` inside base method still works
|
|
99
|
+
return fn.bind(this);
|
|
100
|
+
}
|
|
101
|
+
proto = Object.getPrototypeOf(proto);
|
|
102
|
+
}
|
|
103
|
+
// Test-mode fallback: return an empty-array implementation when no DB layer is present
|
|
104
|
+
if (process.env.NODE_ENV === "test") {
|
|
105
|
+
if (method === "all") {
|
|
106
|
+
return (async () => []);
|
|
107
|
+
}
|
|
108
|
+
if (method === "find") {
|
|
109
|
+
return (async () => null);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
async all() {
|
|
115
|
+
const baseAll = this.getBaseMethod("all");
|
|
116
|
+
if (!baseAll)
|
|
117
|
+
throw new Error("Base 'all' method not found in EagerLoadingMixin chain.");
|
|
118
|
+
const records = (await baseAll());
|
|
119
|
+
return this.eagerLoadRelations(records);
|
|
120
|
+
}
|
|
121
|
+
async find(id, pk = "id") {
|
|
122
|
+
const baseFind = this.getBaseMethod("find");
|
|
123
|
+
if (!baseFind)
|
|
124
|
+
throw new Error("Base 'find' method not found in EagerLoadingMixin chain.");
|
|
125
|
+
const record = (await baseFind(id, pk));
|
|
126
|
+
if (!record)
|
|
127
|
+
return null;
|
|
128
|
+
await this.eagerLoadRelations([record]);
|
|
129
|
+
return record;
|
|
130
|
+
}
|
|
131
|
+
getRelation(name) {
|
|
132
|
+
return this.getRelationStrict(name);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return EagerLoadableModel;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=EagerLoadingMixin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EagerLoadingMixin.js","sourceRoot":"","sources":["../../../../src/core/orm/mixins/EagerLoadingMixin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type LifecycleEvent = "creating" | "created" | "updating" | "updated" | "deleting" | "deleted";
|
|
2
|
+
export type HookHandler<TPayload> = (payload: TPayload) => Promise<void> | void;
|
|
3
|
+
/**
|
|
4
|
+
* Base interface for hookable models.
|
|
5
|
+
*/
|
|
6
|
+
export interface HookableModel {
|
|
7
|
+
create(data: Record<string, unknown>): Promise<unknown>;
|
|
8
|
+
update(data: Record<string, unknown>, pk?: string): unknown;
|
|
9
|
+
update(id: number | string, data: Record<string, unknown>, pk?: string): Promise<void>;
|
|
10
|
+
delete(): Promise<void>;
|
|
11
|
+
delete(id: number | string, pk?: string): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
type Constructor<T = object> = abstract new (...args: any[]) => T;
|
|
14
|
+
export declare function HooksMixin<TBase extends Constructor>(Base: TBase): TBase & (abstract new (...args: any[]) => HookableModel);
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=HooksMixin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HooksMixin.d.ts","sourceRoot":"","sources":["../../../../src/core/orm/mixins/HooksMixin.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GACtB,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,MAAM,WAAW,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,KAAK,WAAW,CAAC,CAAC,GAAG,MAAM,IAAI,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAElE,wBAAgB,UAAU,CAAC,KAAK,SAAS,WAAW,EAAE,IAAI,EAAE,KAAK,GAyHjC,KAAK,GAAG,CAAC,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,aAAa,CAAC,CACvF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HooksMixin = HooksMixin;
|
|
4
|
+
const BaseMethodResolver_1 = require("./utils/BaseMethodResolver");
|
|
5
|
+
const HookStore_1 = require("./utils/HookStore");
|
|
6
|
+
const ModelRegistry_1 = require("./utils/ModelRegistry");
|
|
7
|
+
function HooksMixin(Base) {
|
|
8
|
+
const resolveBaseMethod = (0, BaseMethodResolver_1.createBaseMethodResolver)(Base);
|
|
9
|
+
const deprecationWarnings = new WeakMap();
|
|
10
|
+
function warnDeprecatedApi(modelCtor, api) {
|
|
11
|
+
const seen = deprecationWarnings.get(modelCtor) ?? new Set();
|
|
12
|
+
if (seen.has(api))
|
|
13
|
+
return;
|
|
14
|
+
const modelName = modelCtor.name || "AnonymousModel";
|
|
15
|
+
console.warn(`[DEPRECATION] ${modelName}.${api}() is deprecated. Prefer static modelEvents and registerModels([...]).`);
|
|
16
|
+
seen.add(api);
|
|
17
|
+
deprecationWarnings.set(modelCtor, seen);
|
|
18
|
+
}
|
|
19
|
+
class Hookable extends Base {
|
|
20
|
+
constructor(...args) {
|
|
21
|
+
super(...args);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Register a class-level lifecycle hook.
|
|
25
|
+
* Model must be granted via ModelRegistry before registration.
|
|
26
|
+
*/
|
|
27
|
+
static on(event, callback) {
|
|
28
|
+
const modelCtor = this;
|
|
29
|
+
warnDeprecatedApi(modelCtor, "on");
|
|
30
|
+
HookStore_1.HookStore.add(modelCtor, event, callback);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Internal helper to trigger all hooks for an event.
|
|
34
|
+
*/
|
|
35
|
+
async fire(event, payload) {
|
|
36
|
+
const hooksDisabled = process.env.ELOQUENT_DISABLE_MODEL_HOOKS;
|
|
37
|
+
if (hooksDisabled === "true" || hooksDisabled === "1") {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const modelCtor = this.constructor;
|
|
41
|
+
ModelRegistry_1.ModelRegistry.ensureGranted(modelCtor, "lifecycle");
|
|
42
|
+
const listeners = HookStore_1.HookStore.get(modelCtor, event);
|
|
43
|
+
for (const cb of listeners) {
|
|
44
|
+
await cb(payload);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async create(data) {
|
|
48
|
+
const baseCreate = resolveBaseMethod(this, "create");
|
|
49
|
+
if (typeof baseCreate !== "function") {
|
|
50
|
+
throw new Error("Base 'create' method not found for HooksMixin.");
|
|
51
|
+
}
|
|
52
|
+
await this.fire("creating", data);
|
|
53
|
+
const record = await baseCreate(data);
|
|
54
|
+
await this.fire("created", record);
|
|
55
|
+
return record;
|
|
56
|
+
}
|
|
57
|
+
update(idOrData, dataOrPk, pk = "id") {
|
|
58
|
+
const baseUpdate = resolveBaseMethod(this, "update");
|
|
59
|
+
if (typeof baseUpdate !== "function") {
|
|
60
|
+
throw new Error("Base 'update' method not found for HooksMixin.");
|
|
61
|
+
}
|
|
62
|
+
if (typeof idOrData === "object" && idOrData !== null && !Array.isArray(idOrData)) {
|
|
63
|
+
return baseUpdate(idOrData, dataOrPk);
|
|
64
|
+
}
|
|
65
|
+
const id = idOrData;
|
|
66
|
+
const data = dataOrPk;
|
|
67
|
+
return this.performHookedPersistedUpdate(baseUpdate, id, data, pk);
|
|
68
|
+
}
|
|
69
|
+
async performHookedPersistedUpdate(baseUpdate, id, data, pk) {
|
|
70
|
+
await this.fire("updating", { id, data });
|
|
71
|
+
await baseUpdate(id, data, pk);
|
|
72
|
+
await this.fire("updated", { id, data });
|
|
73
|
+
}
|
|
74
|
+
async delete(id, pk = "id") {
|
|
75
|
+
const baseDelete = resolveBaseMethod(this, "delete");
|
|
76
|
+
if (typeof baseDelete !== "function") {
|
|
77
|
+
throw new Error("Base 'delete' method not found for HooksMixin.");
|
|
78
|
+
}
|
|
79
|
+
await this.fire("deleting", { id });
|
|
80
|
+
await baseDelete(id, pk);
|
|
81
|
+
await this.fire("deleted", { id });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Register an instance-level hook on the model constructor bucket.
|
|
85
|
+
* Model must be granted via ModelRegistry before registration.
|
|
86
|
+
*/
|
|
87
|
+
registerHook(event, callback) {
|
|
88
|
+
const modelCtor = this.constructor;
|
|
89
|
+
warnDeprecatedApi(modelCtor, "registerHook");
|
|
90
|
+
HookStore_1.HookStore.add(modelCtor, event, callback);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return Hookable;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=HooksMixin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HooksMixin.js","sourceRoot":"","sources":["../../../../src/core/orm/mixins/HooksMixin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๐งฉ MorphRegistry
|
|
3
|
+
* Central lookup for morphable model types.
|
|
4
|
+
* Mirrors Laravel's Relation::morphMap() behavior.
|
|
5
|
+
* โ
Fully typed, safe for ES modules and mixins.
|
|
6
|
+
*/
|
|
7
|
+
export interface MorphableConstructor<T> extends Function {
|
|
8
|
+
new (...args: any[]): T;
|
|
9
|
+
name: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* ๐ง MorphRegistry โ global polymorphic type registry
|
|
13
|
+
* Enables morphTo, morphOne, morphMany relationships.
|
|
14
|
+
*/
|
|
15
|
+
export declare class MorphRegistry {
|
|
16
|
+
private static registry;
|
|
17
|
+
/**
|
|
18
|
+
* ๐ Register a single model alias (like Relation::morphMap entry)
|
|
19
|
+
*/
|
|
20
|
+
static register<T>(alias: string, modelClass: MorphableConstructor<T>): void;
|
|
21
|
+
/**
|
|
22
|
+
* ๐ Register multiple aliases at once (Laravel-like syntax)
|
|
23
|
+
* Example: MorphRegistry.registerMap({ posts: Post, comments: Comment })
|
|
24
|
+
*/
|
|
25
|
+
static registerMap(map: Record<string, MorphableConstructor<unknown>>): void;
|
|
26
|
+
/**
|
|
27
|
+
* ๐งญ Resolve a morph type name into a model constructor
|
|
28
|
+
*/
|
|
29
|
+
static resolve<T>(type: string): MorphableConstructor<T>;
|
|
30
|
+
/**
|
|
31
|
+
* ๐ช Alias for resolve() โ Laravel-like syntax
|
|
32
|
+
*/
|
|
33
|
+
static getMorphedModel<T>(alias: string): MorphableConstructor<T>;
|
|
34
|
+
/**
|
|
35
|
+
* ๐งพ Return current morph map for debugging/logging
|
|
36
|
+
*/
|
|
37
|
+
static list(): Record<string, string>;
|
|
38
|
+
/**
|
|
39
|
+
* โ
Check if a morph alias is already registered
|
|
40
|
+
*/
|
|
41
|
+
static has(alias: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* โป๏ธ Clear all registered morphs (for testing or reloading)
|
|
44
|
+
*/
|
|
45
|
+
static clear(): void;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=MorphRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MorphRegistry.d.ts","sourceRoot":"","sources":["../../../../src/core/orm/mixins/MorphRegistry.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,MAAM,WAAW,oBAAoB,CAAC,CAAC,CAAE,SAAQ,QAAQ;IACvD,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoD;IAE3E;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI;IAK5E;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;IAM5E;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAAC,CAAC,CAAC;IAOxD;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAAC,CAAC,CAAC;IAIjE;;OAEG;IACH,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQrC;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// src/orm/mixins/MorphRegistry.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.MorphRegistry = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* ๐ง MorphRegistry โ global polymorphic type registry
|
|
7
|
+
* Enables morphTo, morphOne, morphMany relationships.
|
|
8
|
+
*/
|
|
9
|
+
class MorphRegistry {
|
|
10
|
+
/**
|
|
11
|
+
* ๐ Register a single model alias (like Relation::morphMap entry)
|
|
12
|
+
*/
|
|
13
|
+
static register(alias, modelClass) {
|
|
14
|
+
if (!alias || !modelClass)
|
|
15
|
+
throw new Error("โ Invalid morph registration.");
|
|
16
|
+
this.registry.set(alias, modelClass);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* ๐ Register multiple aliases at once (Laravel-like syntax)
|
|
20
|
+
* Example: MorphRegistry.registerMap({ posts: Post, comments: Comment })
|
|
21
|
+
*/
|
|
22
|
+
static registerMap(map) {
|
|
23
|
+
for (const [alias, modelClass] of Object.entries(map)) {
|
|
24
|
+
this.register(alias, modelClass);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* ๐งญ Resolve a morph type name into a model constructor
|
|
29
|
+
*/
|
|
30
|
+
static resolve(type) {
|
|
31
|
+
const model = this.registry.get(type);
|
|
32
|
+
if (model)
|
|
33
|
+
return model;
|
|
34
|
+
throw new Error(`โ Morph type '${type}' not found in MorphRegistry.`);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* ๐ช Alias for resolve() โ Laravel-like syntax
|
|
38
|
+
*/
|
|
39
|
+
static getMorphedModel(alias) {
|
|
40
|
+
return this.resolve(alias);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* ๐งพ Return current morph map for debugging/logging
|
|
44
|
+
*/
|
|
45
|
+
static list() {
|
|
46
|
+
const entries = {};
|
|
47
|
+
for (const [alias, model] of this.registry.entries()) {
|
|
48
|
+
entries[alias] = model.name;
|
|
49
|
+
}
|
|
50
|
+
return entries;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* โ
Check if a morph alias is already registered
|
|
54
|
+
*/
|
|
55
|
+
static has(alias) {
|
|
56
|
+
return this.registry.has(alias);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* โป๏ธ Clear all registered morphs (for testing or reloading)
|
|
60
|
+
*/
|
|
61
|
+
static clear() {
|
|
62
|
+
this.registry.clear();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.MorphRegistry = MorphRegistry;
|
|
66
|
+
MorphRegistry.registry = new Map();
|
|
67
|
+
//# sourceMappingURL=MorphRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MorphRegistry.js","sourceRoot":"","sources":["../../../../src/core/orm/mixins/MorphRegistry.ts"],"names":[],"mappings":";AAAA,kCAAkC;;;AAclC;;;GAGG;AACH,MAAa,aAAa;IAGxB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAI,KAAa,EAAE,UAAmC;QACnE,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC5E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,GAAkD;QACnE,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,CAAI,IAAY;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK;YAAE,OAAO,KAAgC,CAAC;QAEnD,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,+BAA+B,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAI,KAAa;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI;QACT,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;QAC9B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,KAAa;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACV,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;;AA7DH,sCA8DC;AA7DgB,sBAAQ,GAAG,IAAI,GAAG,EAAyC,CAAC"}
|