joist-core 2.4.0-next.37 → 2.4.0-next.39
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/build/BaseEntity.d.cts +3 -4
- package/build/BaseEntity.d.cts.map +1 -1
- package/build/BaseEntity.d.mts +3 -4
- package/build/BaseEntity.d.mts.map +1 -1
- package/build/Entity.d.cts +3 -4
- package/build/Entity.d.cts.map +1 -1
- package/build/Entity.d.mts +3 -4
- package/build/Entity.d.mts.map +1 -1
- package/build/EntityFields.d.cts +3 -4
- package/build/EntityFields.d.cts.map +1 -1
- package/build/EntityFields.d.mts +3 -4
- package/build/EntityFields.d.mts.map +1 -1
- package/build/EntityManager.cjs +11 -3
- package/build/EntityManager.cjs.map +1 -1
- package/build/EntityManager.d.cts +47 -41
- package/build/EntityManager.d.cts.map +1 -1
- package/build/EntityManager.d.mts +47 -41
- package/build/EntityManager.d.mts.map +1 -1
- package/build/EntityManager.js +11 -3
- package/build/EntityManager.js.map +1 -1
- package/build/EntityMetadata.d.cts +31 -32
- package/build/EntityMetadata.d.cts.map +1 -1
- package/build/EntityMetadata.d.mts +31 -32
- package/build/EntityMetadata.d.mts.map +1 -1
- package/build/EnumMetadata.d.cts +1 -2
- package/build/EnumMetadata.d.cts.map +1 -1
- package/build/EnumMetadata.d.mts +1 -2
- package/build/EnumMetadata.d.mts.map +1 -1
- package/build/IndexManager.cjs.map +1 -1
- package/build/IndexManager.d.cts +2 -3
- package/build/IndexManager.d.cts.map +1 -1
- package/build/IndexManager.d.mts +2 -3
- package/build/IndexManager.d.mts.map +1 -1
- package/build/IndexManager.js.map +1 -1
- package/build/InstanceData.cjs.map +1 -1
- package/build/InstanceData.d.cts +1 -2
- package/build/InstanceData.d.cts.map +1 -1
- package/build/InstanceData.d.mts +1 -2
- package/build/InstanceData.d.mts.map +1 -1
- package/build/InstanceData.js.map +1 -1
- package/build/PluginManager.cjs.map +1 -1
- package/build/PluginManager.d.cts +4 -4
- package/build/PluginManager.d.cts.map +1 -1
- package/build/PluginManager.d.mts +4 -4
- package/build/PluginManager.d.mts.map +1 -1
- package/build/PluginManager.js.map +1 -1
- package/build/RowData.d.cts +3 -4
- package/build/RowData.d.cts.map +1 -1
- package/build/RowData.d.mts +3 -4
- package/build/RowData.d.mts.map +1 -1
- package/build/batchloaders/BatchLoader.cjs.map +1 -1
- package/build/batchloaders/BatchLoader.d.cts +1 -2
- package/build/batchloaders/BatchLoader.d.cts.map +1 -1
- package/build/batchloaders/BatchLoader.d.mts +1 -2
- package/build/batchloaders/BatchLoader.d.mts.map +1 -1
- package/build/batchloaders/BatchLoader.js.map +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.cts +2 -3
- package/build/batchloaders/enumCollectionBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.mts +2 -3
- package/build/batchloaders/enumCollectionBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.cts +2 -3
- package/build/batchloaders/loadBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.mts +2 -3
- package/build/batchloaders/loadBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.d.cts +2 -3
- package/build/batchloaders/manyToManyBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.d.mts +2 -3
- package/build/batchloaders/manyToManyBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.d.cts +2 -3
- package/build/batchloaders/oneToManyBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.d.mts +2 -3
- package/build/batchloaders/oneToManyBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.d.cts +2 -3
- package/build/batchloaders/oneToOneBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.d.mts +2 -3
- package/build/batchloaders/oneToOneBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/populateBatchLoader.d.cts +2 -3
- package/build/batchloaders/populateBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/populateBatchLoader.d.mts +2 -3
- package/build/batchloaders/populateBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.d.cts +2 -3
- package/build/batchloaders/recursiveChildrenBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.d.mts +2 -3
- package/build/batchloaders/recursiveChildrenBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.d.cts +2 -3
- package/build/batchloaders/recursiveM2mBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.d.mts +2 -3
- package/build/batchloaders/recursiveM2mBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.d.cts +2 -3
- package/build/batchloaders/recursiveParentsBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.d.mts +2 -3
- package/build/batchloaders/recursiveParentsBatchLoader.d.mts.map +1 -1
- package/build/changes.cjs.map +1 -1
- package/build/changes.d.cts +9 -10
- package/build/changes.d.cts.map +1 -1
- package/build/changes.d.mts +9 -10
- package/build/changes.d.mts.map +1 -1
- package/build/changes.js.map +1 -1
- package/build/config.d.cts +17 -17
- package/build/config.d.cts.map +1 -1
- package/build/config.d.mts +17 -17
- package/build/config.d.mts.map +1 -1
- package/build/configure.d.cts +8 -9
- package/build/configure.d.cts.map +1 -1
- package/build/configure.d.mts +8 -9
- package/build/configure.d.mts.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.d.cts +1 -2
- package/build/dataloaders/fastWhereFilterHash.d.cts.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.d.mts +1 -2
- package/build/dataloaders/fastWhereFilterHash.d.mts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.cts +2 -3
- package/build/dataloaders/findByUniqueDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.mts +2 -3
- package/build/dataloaders/findByUniqueDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findCountDataLoader.d.cts +4 -5
- package/build/dataloaders/findCountDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findCountDataLoader.d.mts +4 -5
- package/build/dataloaders/findCountDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findDataLoader.d.cts +11 -12
- package/build/dataloaders/findDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findDataLoader.d.mts +11 -12
- package/build/dataloaders/findDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findIdsDataLoader.d.cts +2 -3
- package/build/dataloaders/findIdsDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findIdsDataLoader.d.mts +2 -3
- package/build/dataloaders/findIdsDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.d.cts +3 -3
- package/build/dataloaders/findOrCreateDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.d.mts +3 -3
- package/build/dataloaders/findOrCreateDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.cts +1 -2
- package/build/dataloaders/findPaginatedDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.mts +1 -2
- package/build/dataloaders/findPaginatedDataLoader.d.mts.map +1 -1
- package/build/dataloaders/lensDataLoader.d.cts +2 -3
- package/build/dataloaders/lensDataLoader.d.cts.map +1 -1
- package/build/dataloaders/lensDataLoader.d.mts +2 -3
- package/build/dataloaders/lensDataLoader.d.mts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.cts +2 -3
- package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.mts +2 -3
- package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.cts +2 -3
- package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.mts +2 -3
- package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
- package/build/defaults.cjs.map +1 -1
- package/build/defaults.d.cts +7 -7
- package/build/defaults.d.cts.map +1 -1
- package/build/defaults.d.mts +7 -7
- package/build/defaults.d.mts.map +1 -1
- package/build/defaults.js.map +1 -1
- package/build/drivers/Driver.d.cts +2 -3
- package/build/drivers/Driver.d.cts.map +1 -1
- package/build/drivers/Driver.d.mts +2 -3
- package/build/drivers/Driver.d.mts.map +1 -1
- package/build/drivers/EntityWriter.d.cts +7 -7
- package/build/drivers/EntityWriter.d.cts.map +1 -1
- package/build/drivers/EntityWriter.d.mts +7 -7
- package/build/drivers/EntityWriter.d.mts.map +1 -1
- package/build/drivers/IdAssigner.cjs.map +1 -1
- package/build/drivers/IdAssigner.d.cts +5 -5
- package/build/drivers/IdAssigner.d.cts.map +1 -1
- package/build/drivers/IdAssigner.d.mts +5 -5
- package/build/drivers/IdAssigner.d.mts.map +1 -1
- package/build/drivers/IdAssigner.js.map +1 -1
- package/build/drivers/driverApi.d.cts +2 -3
- package/build/drivers/driverApi.d.cts.map +1 -1
- package/build/drivers/driverApi.d.mts +2 -3
- package/build/drivers/driverApi.d.mts.map +1 -1
- package/build/fields.d.cts +6 -7
- package/build/fields.d.cts.map +1 -1
- package/build/fields.d.mts +6 -7
- package/build/fields.d.mts.map +1 -1
- package/build/flush/FlushLock.cjs.map +1 -1
- package/build/flush/FlushLock.d.cts +1 -2
- package/build/flush/FlushLock.d.cts.map +1 -1
- package/build/flush/FlushLock.d.mts +1 -2
- package/build/flush/FlushLock.d.mts.map +1 -1
- package/build/flush/FlushLock.js.map +1 -1
- package/build/flush/JoinRows.cjs.map +1 -1
- package/build/flush/JoinRows.d.cts +5 -6
- package/build/flush/JoinRows.d.cts.map +1 -1
- package/build/flush/JoinRows.d.mts +5 -6
- package/build/flush/JoinRows.d.mts.map +1 -1
- package/build/flush/JoinRows.js.map +1 -1
- package/build/flush/PendingChanges.d.cts +5 -6
- package/build/flush/PendingChanges.d.cts.map +1 -1
- package/build/flush/PendingChanges.d.mts +5 -6
- package/build/flush/PendingChanges.d.mts.map +1 -1
- package/build/flush/Todo.d.cts +5 -6
- package/build/flush/Todo.d.cts.map +1 -1
- package/build/flush/Todo.d.mts +5 -6
- package/build/flush/Todo.d.mts.map +1 -1
- package/build/getProperties.d.cts +3 -4
- package/build/getProperties.d.cts.map +1 -1
- package/build/getProperties.d.mts +3 -4
- package/build/getProperties.d.mts.map +1 -1
- package/build/index.d.cts +17 -17
- package/build/index.d.cts.map +1 -1
- package/build/index.d.mts +17 -17
- package/build/index.d.mts.map +1 -1
- package/build/json.d.cts +11 -11
- package/build/json.d.cts.map +1 -1
- package/build/json.d.mts +11 -11
- package/build/json.d.mts.map +1 -1
- package/build/keys.d.cts +27 -27
- package/build/keys.d.cts.map +1 -1
- package/build/keys.d.mts +27 -27
- package/build/keys.d.mts.map +1 -1
- package/build/loading/HintTree.d.cts +3 -4
- package/build/loading/HintTree.d.cts.map +1 -1
- package/build/loading/HintTree.d.mts +3 -4
- package/build/loading/HintTree.d.mts.map +1 -1
- package/build/loading/IsLoadedCache.cjs.map +1 -1
- package/build/loading/IsLoadedCache.d.cts +2 -3
- package/build/loading/IsLoadedCache.d.cts.map +1 -1
- package/build/loading/IsLoadedCache.d.mts +2 -3
- package/build/loading/IsLoadedCache.d.mts.map +1 -1
- package/build/loading/IsLoadedCache.js.map +1 -1
- package/build/loading/loadHints.d.cts +17 -17
- package/build/loading/loadHints.d.cts.map +1 -1
- package/build/loading/loadHints.d.mts +17 -17
- package/build/loading/loadHints.d.mts.map +1 -1
- package/build/loading/loadLens.d.cts +13 -13
- package/build/loading/loadLens.d.cts.map +1 -1
- package/build/loading/loadLens.d.mts +13 -13
- package/build/loading/loadLens.d.mts.map +1 -1
- package/build/loading/withLoaded.d.cts +5 -6
- package/build/loading/withLoaded.d.cts.map +1 -1
- package/build/loading/withLoaded.d.mts +5 -6
- package/build/loading/withLoaded.d.mts.map +1 -1
- package/build/logging/FactoryLogger.d.cts +3 -4
- package/build/logging/FactoryLogger.d.cts.map +1 -1
- package/build/logging/FactoryLogger.d.mts +3 -4
- package/build/logging/FactoryLogger.d.mts.map +1 -1
- package/build/logging/FieldLogger.cjs.map +1 -1
- package/build/logging/FieldLogger.d.cts +4 -5
- package/build/logging/FieldLogger.d.cts.map +1 -1
- package/build/logging/FieldLogger.d.mts +4 -5
- package/build/logging/FieldLogger.d.mts.map +1 -1
- package/build/logging/FieldLogger.js.map +1 -1
- package/build/logging/ReactionLogger.d.cts +7 -7
- package/build/logging/ReactionLogger.d.cts.map +1 -1
- package/build/logging/ReactionLogger.d.mts +7 -7
- package/build/logging/ReactionLogger.d.mts.map +1 -1
- package/build/newEntity.cjs.map +1 -1
- package/build/newEntity.d.cts +4 -5
- package/build/newEntity.d.cts.map +1 -1
- package/build/newEntity.d.mts +4 -5
- package/build/newEntity.d.mts.map +1 -1
- package/build/newEntity.js.map +1 -1
- package/build/newTestInstance.d.cts +21 -21
- package/build/newTestInstance.d.cts.map +1 -1
- package/build/newTestInstance.d.mts +21 -21
- package/build/newTestInstance.d.mts.map +1 -1
- package/build/normalizeHints.d.cts +7 -8
- package/build/normalizeHints.d.cts.map +1 -1
- package/build/normalizeHints.d.mts +7 -8
- package/build/normalizeHints.d.mts.map +1 -1
- package/build/nowUTC.d.cts +4 -5
- package/build/nowUTC.d.cts.map +1 -1
- package/build/nowUTC.d.mts +4 -5
- package/build/nowUTC.d.mts.map +1 -1
- package/build/plugins/ImmutableEntitiesPlugin.d.cts +1 -2
- package/build/plugins/ImmutableEntitiesPlugin.d.cts.map +1 -1
- package/build/plugins/ImmutableEntitiesPlugin.d.mts +1 -2
- package/build/plugins/ImmutableEntitiesPlugin.d.mts.map +1 -1
- package/build/plugins/PreloadPlugin.d.cts +3 -4
- package/build/plugins/PreloadPlugin.d.cts.map +1 -1
- package/build/plugins/PreloadPlugin.d.mts +3 -4
- package/build/plugins/PreloadPlugin.d.mts.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.cts +1 -2
- package/build/preloading/JsonAggregatePreloader.d.cts.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.mts +1 -2
- package/build/preloading/JsonAggregatePreloader.d.mts.map +1 -1
- package/build/preloading/canPreload.d.cts +1 -2
- package/build/preloading/canPreload.d.cts.map +1 -1
- package/build/preloading/canPreload.d.mts +1 -2
- package/build/preloading/canPreload.d.mts.map +1 -1
- package/build/preloading/partitionHint.d.cts +1 -2
- package/build/preloading/partitionHint.d.cts.map +1 -1
- package/build/preloading/partitionHint.d.mts +1 -2
- package/build/preloading/partitionHint.d.mts.map +1 -1
- package/build/queries/ConditionBuilder.d.cts +2 -2
- package/build/queries/ConditionBuilder.d.cts.map +1 -1
- package/build/queries/ConditionBuilder.d.mts +2 -2
- package/build/queries/ConditionBuilder.d.mts.map +1 -1
- package/build/queries/conditions.d.cts +11 -12
- package/build/queries/conditions.d.cts.map +1 -1
- package/build/queries/conditions.d.mts +11 -12
- package/build/queries/conditions.d.mts.map +1 -1
- package/build/queries/entityQueryUtils.d.cts +4 -5
- package/build/queries/entityQueryUtils.d.cts.map +1 -1
- package/build/queries/entityQueryUtils.d.mts +4 -5
- package/build/queries/entityQueryUtils.d.mts.map +1 -1
- package/build/queries/find/Aliases.d.cts +16 -16
- package/build/queries/find/Aliases.d.cts.map +1 -1
- package/build/queries/find/Aliases.d.mts +16 -16
- package/build/queries/find/Aliases.d.mts.map +1 -1
- package/build/queries/find/DeferredAlias.d.cts +5 -6
- package/build/queries/find/DeferredAlias.d.cts.map +1 -1
- package/build/queries/find/DeferredAlias.d.mts +5 -6
- package/build/queries/find/DeferredAlias.d.mts.map +1 -1
- package/build/queries/find/EntityFilter.d.cts +12 -13
- package/build/queries/find/EntityFilter.d.cts.map +1 -1
- package/build/queries/find/EntityFilter.d.mts +12 -13
- package/build/queries/find/EntityFilter.d.mts.map +1 -1
- package/build/queries/find/EntityGraphQLFilter.d.cts +8 -9
- package/build/queries/find/EntityGraphQLFilter.d.cts.map +1 -1
- package/build/queries/find/EntityGraphQLFilter.d.mts +8 -9
- package/build/queries/find/EntityGraphQLFilter.d.mts.map +1 -1
- package/build/queries/find/QueryParser.collectionJoins.d.cts +1 -2
- package/build/queries/find/QueryParser.collectionJoins.d.cts.map +1 -1
- package/build/queries/find/QueryParser.collectionJoins.d.mts +1 -2
- package/build/queries/find/QueryParser.collectionJoins.d.mts.map +1 -1
- package/build/queries/find/QueryParser.d.cts +18 -18
- package/build/queries/find/QueryParser.d.cts.map +1 -1
- package/build/queries/find/QueryParser.d.mts +18 -18
- package/build/queries/find/QueryParser.d.mts.map +1 -1
- package/build/queries/find/QueryParser.pruning.d.cts +2 -3
- package/build/queries/find/QueryParser.pruning.d.cts.map +1 -1
- package/build/queries/find/QueryParser.pruning.d.mts +2 -3
- package/build/queries/find/QueryParser.pruning.d.mts.map +1 -1
- package/build/queries/find/QueryVisitor.d.cts +4 -4
- package/build/queries/find/QueryVisitor.d.cts.map +1 -1
- package/build/queries/find/QueryVisitor.d.mts +4 -4
- package/build/queries/find/QueryVisitor.d.mts.map +1 -1
- package/build/queries/find/buildFindQuery.d.cts +3 -3
- package/build/queries/find/buildFindQuery.d.cts.map +1 -1
- package/build/queries/find/buildFindQuery.d.mts +3 -3
- package/build/queries/find/buildFindQuery.d.mts.map +1 -1
- package/build/queries/find/scopes.cjs.map +1 -1
- package/build/queries/find/scopes.d.cts +12 -13
- package/build/queries/find/scopes.d.cts.map +1 -1
- package/build/queries/find/scopes.d.mts +12 -13
- package/build/queries/find/scopes.d.mts.map +1 -1
- package/build/queries/find/scopes.js.map +1 -1
- package/build/queries/parsedConditions.d.cts +7 -8
- package/build/queries/parsedConditions.d.cts.map +1 -1
- package/build/queries/parsedConditions.d.mts +7 -8
- package/build/queries/parsedConditions.d.mts.map +1 -1
- package/build/queries/renderConditions.d.cts +3 -4
- package/build/queries/renderConditions.d.cts.map +1 -1
- package/build/queries/renderConditions.d.mts +3 -4
- package/build/queries/renderConditions.d.mts.map +1 -1
- package/build/queries/skipCondition.d.cts +1 -2
- package/build/queries/skipCondition.d.cts.map +1 -1
- package/build/queries/skipCondition.d.mts +1 -2
- package/build/queries/skipCondition.d.mts.map +1 -1
- package/build/queries/sql/AliasAssigner.cjs.map +1 -1
- package/build/queries/sql/AliasAssigner.d.cts +1 -2
- package/build/queries/sql/AliasAssigner.d.cts.map +1 -1
- package/build/queries/sql/AliasAssigner.d.mts +1 -2
- package/build/queries/sql/AliasAssigner.d.mts.map +1 -1
- package/build/queries/sql/AliasAssigner.js.map +1 -1
- package/build/queries/sql/Expr.d.cts +26 -27
- package/build/queries/sql/Expr.d.cts.map +1 -1
- package/build/queries/sql/Expr.d.mts +26 -27
- package/build/queries/sql/Expr.d.mts.map +1 -1
- package/build/queries/sql/JoinTree.d.cts +5 -5
- package/build/queries/sql/JoinTree.d.cts.map +1 -1
- package/build/queries/sql/JoinTree.d.mts +5 -5
- package/build/queries/sql/JoinTree.d.mts.map +1 -1
- package/build/queries/sql/Tables.d.cts +39 -39
- package/build/queries/sql/Tables.d.cts.map +1 -1
- package/build/queries/sql/Tables.d.mts +39 -39
- package/build/queries/sql/Tables.d.mts.map +1 -1
- package/build/queries/sql/custom.d.cts +14 -14
- package/build/queries/sql/custom.d.cts.map +1 -1
- package/build/queries/sql/custom.d.mts +14 -14
- package/build/queries/sql/custom.d.mts.map +1 -1
- package/build/queries/sql/execute.d.cts +15 -15
- package/build/queries/sql/execute.d.cts.map +1 -1
- package/build/queries/sql/execute.d.mts +15 -15
- package/build/queries/sql/execute.d.mts.map +1 -1
- package/build/queries/sql/expressions/arrayAgg.d.cts +5 -6
- package/build/queries/sql/expressions/arrayAgg.d.cts.map +1 -1
- package/build/queries/sql/expressions/arrayAgg.d.mts +5 -6
- package/build/queries/sql/expressions/arrayAgg.d.mts.map +1 -1
- package/build/queries/sql/expressions/case.d.cts +10 -10
- package/build/queries/sql/expressions/case.d.cts.map +1 -1
- package/build/queries/sql/expressions/case.d.mts +10 -10
- package/build/queries/sql/expressions/case.d.mts.map +1 -1
- package/build/queries/sql/expressions/coalesce.d.cts +5 -6
- package/build/queries/sql/expressions/coalesce.d.cts.map +1 -1
- package/build/queries/sql/expressions/coalesce.d.mts +5 -6
- package/build/queries/sql/expressions/coalesce.d.mts.map +1 -1
- package/build/queries/sql/expressions/codecs.d.cts +1 -2
- package/build/queries/sql/expressions/codecs.d.cts.map +1 -1
- package/build/queries/sql/expressions/codecs.d.mts +1 -2
- package/build/queries/sql/expressions/codecs.d.mts.map +1 -1
- package/build/queries/sql/expressions/expression.d.cts +6 -6
- package/build/queries/sql/expressions/expression.d.cts.map +1 -1
- package/build/queries/sql/expressions/expression.d.mts +6 -6
- package/build/queries/sql/expressions/expression.d.mts.map +1 -1
- package/build/queries/sql/expressions/greatest.d.cts +5 -6
- package/build/queries/sql/expressions/greatest.d.cts.map +1 -1
- package/build/queries/sql/expressions/greatest.d.mts +5 -6
- package/build/queries/sql/expressions/greatest.d.mts.map +1 -1
- package/build/queries/sql/expressions/least.d.cts +5 -6
- package/build/queries/sql/expressions/least.d.cts.map +1 -1
- package/build/queries/sql/expressions/least.d.mts +5 -6
- package/build/queries/sql/expressions/least.d.mts.map +1 -1
- package/build/queries/sql/expressions/nullIf.d.cts +5 -6
- package/build/queries/sql/expressions/nullIf.d.cts.map +1 -1
- package/build/queries/sql/expressions/nullIf.d.mts +5 -6
- package/build/queries/sql/expressions/nullIf.d.mts.map +1 -1
- package/build/queries/sql/expressions/parseExpression.d.cts +5 -6
- package/build/queries/sql/expressions/parseExpression.d.cts.map +1 -1
- package/build/queries/sql/expressions/parseExpression.d.mts +5 -6
- package/build/queries/sql/expressions/parseExpression.d.mts.map +1 -1
- package/build/queries/sql/expressions/types.d.cts +11 -11
- package/build/queries/sql/expressions/types.d.cts.map +1 -1
- package/build/queries/sql/expressions/types.d.mts +11 -11
- package/build/queries/sql/expressions/types.d.mts.map +1 -1
- package/build/queries/sql/keywords.d.cts +4 -5
- package/build/queries/sql/keywords.d.cts.map +1 -1
- package/build/queries/sql/keywords.d.mts +4 -5
- package/build/queries/sql/keywords.d.mts.map +1 -1
- package/build/queries/sql/query.cjs.map +1 -1
- package/build/queries/sql/query.d.cts +67 -67
- package/build/queries/sql/query.d.cts.map +1 -1
- package/build/queries/sql/query.d.mts +67 -67
- package/build/queries/sql/query.d.mts.map +1 -1
- package/build/queries/sql/query.js.map +1 -1
- package/build/queries/unnest.d.cts +2 -3
- package/build/queries/unnest.d.cts.map +1 -1
- package/build/queries/unnest.d.mts +2 -3
- package/build/queries/unnest.d.mts.map +1 -1
- package/build/queries/valueFilters.d.cts +5 -6
- package/build/queries/valueFilters.d.cts.map +1 -1
- package/build/queries/valueFilters.d.mts +5 -6
- package/build/queries/valueFilters.d.mts.map +1 -1
- package/build/reactivity/ReactionsManager.cjs.map +1 -1
- package/build/reactivity/ReactionsManager.d.cts +2 -3
- package/build/reactivity/ReactionsManager.d.cts.map +1 -1
- package/build/reactivity/ReactionsManager.d.mts +2 -3
- package/build/reactivity/ReactionsManager.d.mts.map +1 -1
- package/build/reactivity/ReactionsManager.js.map +1 -1
- package/build/reactivity/reactiveHints.d.cts +18 -18
- package/build/reactivity/reactiveHints.d.cts.map +1 -1
- package/build/reactivity/reactiveHints.d.mts +18 -18
- package/build/reactivity/reactiveHints.d.mts.map +1 -1
- package/build/relations/AbstractPropertyImpl.cjs.map +1 -1
- package/build/relations/AbstractPropertyImpl.d.cts +1 -2
- package/build/relations/AbstractPropertyImpl.d.cts.map +1 -1
- package/build/relations/AbstractPropertyImpl.d.mts +1 -2
- package/build/relations/AbstractPropertyImpl.d.mts.map +1 -1
- package/build/relations/AbstractPropertyImpl.js.map +1 -1
- package/build/relations/AbstractRelationImpl.d.cts +1 -2
- package/build/relations/AbstractRelationImpl.d.cts.map +1 -1
- package/build/relations/AbstractRelationImpl.d.mts +1 -2
- package/build/relations/AbstractRelationImpl.d.mts.map +1 -1
- package/build/relations/AsyncProperty.cjs.map +1 -1
- package/build/relations/AsyncProperty.d.cts +5 -6
- package/build/relations/AsyncProperty.d.cts.map +1 -1
- package/build/relations/AsyncProperty.d.mts +5 -6
- package/build/relations/AsyncProperty.d.mts.map +1 -1
- package/build/relations/AsyncProperty.js.map +1 -1
- package/build/relations/AsyncReactiveField.cjs.map +1 -1
- package/build/relations/AsyncReactiveField.d.cts +4 -5
- package/build/relations/AsyncReactiveField.d.cts.map +1 -1
- package/build/relations/AsyncReactiveField.d.mts +4 -5
- package/build/relations/AsyncReactiveField.d.mts.map +1 -1
- package/build/relations/AsyncReactiveField.js.map +1 -1
- package/build/relations/Collection.d.cts +4 -5
- package/build/relations/Collection.d.cts.map +1 -1
- package/build/relations/Collection.d.mts +4 -5
- package/build/relations/Collection.d.mts.map +1 -1
- package/build/relations/CustomCollection.cjs.map +1 -1
- package/build/relations/CustomCollection.d.cts +3 -4
- package/build/relations/CustomCollection.d.cts.map +1 -1
- package/build/relations/CustomCollection.d.mts +3 -4
- package/build/relations/CustomCollection.d.mts.map +1 -1
- package/build/relations/CustomCollection.js.map +1 -1
- package/build/relations/CustomReference.cjs.map +1 -1
- package/build/relations/CustomReference.d.cts +3 -4
- package/build/relations/CustomReference.d.cts.map +1 -1
- package/build/relations/CustomReference.d.mts +3 -4
- package/build/relations/CustomReference.d.mts.map +1 -1
- package/build/relations/CustomReference.js.map +1 -1
- package/build/relations/EnumCollection.cjs.map +1 -1
- package/build/relations/EnumCollection.d.cts +5 -5
- package/build/relations/EnumCollection.d.cts.map +1 -1
- package/build/relations/EnumCollection.d.mts +5 -5
- package/build/relations/EnumCollection.d.mts.map +1 -1
- package/build/relations/EnumCollection.js.map +1 -1
- package/build/relations/LargeCollection.d.cts +1 -2
- package/build/relations/LargeCollection.d.cts.map +1 -1
- package/build/relations/LargeCollection.d.mts +1 -2
- package/build/relations/LargeCollection.d.mts.map +1 -1
- package/build/relations/LazyField.cjs.map +1 -1
- package/build/relations/LazyField.d.cts +7 -8
- package/build/relations/LazyField.d.cts.map +1 -1
- package/build/relations/LazyField.d.mts +7 -8
- package/build/relations/LazyField.d.mts.map +1 -1
- package/build/relations/LazyField.js.map +1 -1
- package/build/relations/ManyToManyCollection.cjs.map +1 -1
- package/build/relations/ManyToManyCollection.d.cts +2 -3
- package/build/relations/ManyToManyCollection.d.cts.map +1 -1
- package/build/relations/ManyToManyCollection.d.mts +2 -3
- package/build/relations/ManyToManyCollection.d.mts.map +1 -1
- package/build/relations/ManyToManyCollection.js.map +1 -1
- package/build/relations/ManyToManyLargeCollection.d.cts +2 -3
- package/build/relations/ManyToManyLargeCollection.d.cts.map +1 -1
- package/build/relations/ManyToManyLargeCollection.d.mts +2 -3
- package/build/relations/ManyToManyLargeCollection.d.mts.map +1 -1
- package/build/relations/ManyToOneReference.cjs.map +1 -1
- package/build/relations/ManyToOneReference.d.cts +6 -7
- package/build/relations/ManyToOneReference.d.cts.map +1 -1
- package/build/relations/ManyToOneReference.d.mts +6 -7
- package/build/relations/ManyToOneReference.d.mts.map +1 -1
- package/build/relations/ManyToOneReference.js.map +1 -1
- package/build/relations/OneToManyCollection.cjs.map +1 -1
- package/build/relations/OneToManyCollection.d.cts +2 -3
- package/build/relations/OneToManyCollection.d.cts.map +1 -1
- package/build/relations/OneToManyCollection.d.mts +2 -3
- package/build/relations/OneToManyCollection.d.mts.map +1 -1
- package/build/relations/OneToManyCollection.js.map +1 -1
- package/build/relations/OneToManyLargeCollection.cjs.map +1 -1
- package/build/relations/OneToManyLargeCollection.d.cts +2 -3
- package/build/relations/OneToManyLargeCollection.d.cts.map +1 -1
- package/build/relations/OneToManyLargeCollection.d.mts +2 -3
- package/build/relations/OneToManyLargeCollection.d.mts.map +1 -1
- package/build/relations/OneToManyLargeCollection.js.map +1 -1
- package/build/relations/OneToOneReference.cjs.map +1 -1
- package/build/relations/OneToOneReference.d.cts +7 -7
- package/build/relations/OneToOneReference.d.cts.map +1 -1
- package/build/relations/OneToOneReference.d.mts +7 -7
- package/build/relations/OneToOneReference.d.mts.map +1 -1
- package/build/relations/OneToOneReference.js.map +1 -1
- package/build/relations/PolymorphicReference.cjs.map +1 -1
- package/build/relations/PolymorphicReference.d.cts +4 -5
- package/build/relations/PolymorphicReference.d.cts.map +1 -1
- package/build/relations/PolymorphicReference.d.mts +4 -5
- package/build/relations/PolymorphicReference.d.mts.map +1 -1
- package/build/relations/PolymorphicReference.js.map +1 -1
- package/build/relations/PropertySymbols.d.cts +1 -2
- package/build/relations/PropertySymbols.d.cts.map +1 -1
- package/build/relations/PropertySymbols.d.mts +1 -2
- package/build/relations/PropertySymbols.d.mts.map +1 -1
- package/build/relations/ReactiveField.cjs.map +1 -1
- package/build/relations/ReactiveField.d.cts +4 -5
- package/build/relations/ReactiveField.d.cts.map +1 -1
- package/build/relations/ReactiveField.d.mts +4 -5
- package/build/relations/ReactiveField.d.mts.map +1 -1
- package/build/relations/ReactiveField.js.map +1 -1
- package/build/relations/ReactiveGetter.cjs.map +1 -1
- package/build/relations/ReactiveGetter.d.cts +4 -5
- package/build/relations/ReactiveGetter.d.cts.map +1 -1
- package/build/relations/ReactiveGetter.d.mts +4 -5
- package/build/relations/ReactiveGetter.d.mts.map +1 -1
- package/build/relations/ReactiveGetter.js.map +1 -1
- package/build/relations/ReactiveManyToMany.cjs.map +1 -1
- package/build/relations/ReactiveManyToMany.d.cts +4 -5
- package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
- package/build/relations/ReactiveManyToMany.d.mts +4 -5
- package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
- package/build/relations/ReactiveManyToMany.js.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.cjs.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.d.cts +4 -5
- package/build/relations/ReactiveManyToManyOtherSide.d.cts.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.d.mts +4 -5
- package/build/relations/ReactiveManyToManyOtherSide.d.mts.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.js.map +1 -1
- package/build/relations/ReactiveReference.cjs.map +1 -1
- package/build/relations/ReactiveReference.d.cts +5 -6
- package/build/relations/ReactiveReference.d.cts.map +1 -1
- package/build/relations/ReactiveReference.d.mts +5 -6
- package/build/relations/ReactiveReference.d.mts.map +1 -1
- package/build/relations/ReactiveReference.js.map +1 -1
- package/build/relations/ReadOnlyCollection.d.cts +4 -5
- package/build/relations/ReadOnlyCollection.d.cts.map +1 -1
- package/build/relations/ReadOnlyCollection.d.mts +4 -5
- package/build/relations/ReadOnlyCollection.d.mts.map +1 -1
- package/build/relations/RecursiveCollection.cjs.map +1 -1
- package/build/relations/RecursiveCollection.d.cts +10 -10
- package/build/relations/RecursiveCollection.d.cts.map +1 -1
- package/build/relations/RecursiveCollection.d.mts +10 -10
- package/build/relations/RecursiveCollection.d.mts.map +1 -1
- package/build/relations/RecursiveCollection.js.map +1 -1
- package/build/relations/RecursiveCycleError.d.cts +2 -2
- package/build/relations/RecursiveCycleError.d.cts.map +1 -1
- package/build/relations/RecursiveCycleError.d.mts +2 -2
- package/build/relations/RecursiveCycleError.d.mts.map +1 -1
- package/build/relations/Reference.d.cts +5 -5
- package/build/relations/Reference.d.cts.map +1 -1
- package/build/relations/Reference.d.mts +5 -5
- package/build/relations/Reference.d.mts.map +1 -1
- package/build/relations/ReferenceSymbols.d.cts +1 -2
- package/build/relations/ReferenceSymbols.d.cts.map +1 -1
- package/build/relations/ReferenceSymbols.d.mts +1 -2
- package/build/relations/ReferenceSymbols.d.mts.map +1 -1
- package/build/relations/Relation.d.cts +3 -3
- package/build/relations/Relation.d.cts.map +1 -1
- package/build/relations/Relation.d.mts +3 -3
- package/build/relations/Relation.d.mts.map +1 -1
- package/build/relations/RelationSymbols.d.cts +2 -3
- package/build/relations/RelationSymbols.d.cts.map +1 -1
- package/build/relations/RelationSymbols.d.mts +2 -3
- package/build/relations/RelationSymbols.d.mts.map +1 -1
- package/build/relations/hasAsyncMethod.cjs.map +1 -1
- package/build/relations/hasAsyncMethod.d.cts +6 -6
- package/build/relations/hasAsyncMethod.d.cts.map +1 -1
- package/build/relations/hasAsyncMethod.d.mts +6 -6
- package/build/relations/hasAsyncMethod.d.mts.map +1 -1
- package/build/relations/hasAsyncMethod.js.map +1 -1
- package/build/relations/hasManyDerived.d.cts +2 -2
- package/build/relations/hasManyDerived.d.cts.map +1 -1
- package/build/relations/hasManyDerived.d.mts +2 -2
- package/build/relations/hasManyDerived.d.mts.map +1 -1
- package/build/relations/hasManyThrough.d.cts +1 -2
- package/build/relations/hasManyThrough.d.cts.map +1 -1
- package/build/relations/hasManyThrough.d.mts +1 -2
- package/build/relations/hasManyThrough.d.mts.map +1 -1
- package/build/relations/hasOneDerived.d.cts +1 -2
- package/build/relations/hasOneDerived.d.cts.map +1 -1
- package/build/relations/hasOneDerived.d.mts +1 -2
- package/build/relations/hasOneDerived.d.mts.map +1 -1
- package/build/relations/hasOneThrough.d.cts +1 -2
- package/build/relations/hasOneThrough.d.cts.map +1 -1
- package/build/relations/hasOneThrough.d.mts +1 -2
- package/build/relations/hasOneThrough.d.mts.map +1 -1
- package/build/relations/hasProperty.cjs.map +1 -1
- package/build/relations/hasProperty.d.cts +8 -8
- package/build/relations/hasProperty.d.cts.map +1 -1
- package/build/relations/hasProperty.d.mts +8 -8
- package/build/relations/hasProperty.d.mts.map +1 -1
- package/build/relations/hasProperty.js.map +1 -1
- package/build/relations/isCascadeDelete.d.cts +1 -2
- package/build/relations/isCascadeDelete.d.cts.map +1 -1
- package/build/relations/isCascadeDelete.d.mts +1 -2
- package/build/relations/isCascadeDelete.d.mts.map +1 -1
- package/build/resurrection.d.cts +3 -4
- package/build/resurrection.d.cts.map +1 -1
- package/build/resurrection.d.mts +3 -4
- package/build/resurrection.d.mts.map +1 -1
- package/build/rules.d.cts +20 -20
- package/build/rules.d.cts.map +1 -1
- package/build/rules.d.mts +20 -20
- package/build/rules.d.mts.map +1 -1
- package/build/runtimeConfig.d.cts +4 -5
- package/build/runtimeConfig.d.cts.map +1 -1
- package/build/runtimeConfig.d.mts +4 -5
- package/build/runtimeConfig.d.mts.map +1 -1
- package/build/serde/TypeInfo.d.cts +3 -4
- package/build/serde/TypeInfo.d.cts.map +1 -1
- package/build/serde/TypeInfo.d.mts +3 -4
- package/build/serde/TypeInfo.d.mts.map +1 -1
- package/build/serde/columns.d.cts +2 -3
- package/build/serde/columns.d.cts.map +1 -1
- package/build/serde/columns.d.mts +2 -3
- package/build/serde/columns.d.mts.map +1 -1
- package/build/serde/fieldSerde.d.cts +9 -9
- package/build/serde/fieldSerde.d.cts.map +1 -1
- package/build/serde/fieldSerde.d.mts +9 -9
- package/build/serde/fieldSerde.d.mts.map +1 -1
- package/build/serde/serde.d.cts +18 -19
- package/build/serde/serde.d.cts.map +1 -1
- package/build/serde/serde.d.mts +18 -19
- package/build/serde/serde.d.mts.map +1 -1
- package/build/serde/temporal.d.cts +5 -5
- package/build/serde/temporal.d.cts.map +1 -1
- package/build/serde/temporal.d.mts +5 -5
- package/build/serde/temporal.d.mts.map +1 -1
- package/build/serde/temporalMappers.d.cts +4 -5
- package/build/serde/temporalMappers.d.cts.map +1 -1
- package/build/serde/temporalMappers.d.mts +4 -5
- package/build/serde/temporalMappers.d.mts.map +1 -1
- package/build/transitions.d.cts +17 -18
- package/build/transitions.d.cts.map +1 -1
- package/build/transitions.d.mts +17 -18
- package/build/transitions.d.mts.map +1 -1
- package/build/trusted.d.cts +2 -3
- package/build/trusted.d.cts.map +1 -1
- package/build/trusted.d.mts +2 -3
- package/build/trusted.d.mts.map +1 -1
- package/build/typeMap.d.cts +17 -17
- package/build/typeMap.d.cts.map +1 -1
- package/build/typeMap.d.mts +17 -17
- package/build/typeMap.d.mts.map +1 -1
- package/build/upsert.d.cts +4 -4
- package/build/upsert.d.cts.map +1 -1
- package/build/upsert.d.mts +4 -4
- package/build/upsert.d.mts.map +1 -1
- package/build/utils.d.cts +27 -28
- package/build/utils.d.cts.map +1 -1
- package/build/utils.d.mts +27 -28
- package/build/utils.d.mts.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OneToOneReference.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","#field","getInstanceData","failNoId","failIfNewEntity","deTagId","oneToOneBatchLoader","appendStack","#hasBeenSet","getEmInternalApi","isReactiveReference","isCascadeDelete","RelationT","RelationU","ReferenceN"],"sources":["../../src/relations/OneToOneReference.ts"],"sourcesContent":["import { oneToOneBatchLoader } from \"src/batchloaders/oneToOneBatchLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type EntityMetadata } from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport {\n type IdOf,\n type LoadedReference,\n type OneToOneField,\n type TaggedId,\n appendStack,\n deTagId,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { type ManyToOneReference, failIfNewEntity, failNoId } from \"src/relations/ManyToOneReference.ts\";\nimport { isReactiveReference } from \"src/relations/ReactiveReference.ts\";\nimport { type Reference } from \"src/relations/Reference.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nconst OneToOne = Symbol();\n\n/** An alias for creating `OneToOneReference`s. */\nexport function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U> {\n return lazyField((entity: T, fieldName) => {\n const o2o = getMetadata(entity).allFields[fieldName] as OneToOneField;\n return new OneToOneReferenceImpl<T, U>(entity, o2o);\n });\n}\n\n/** The lazy-loaded/lookup side of a one-to-one, i.e. the side w/o the unique foreign key column. */\nexport interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {\n // Need to differentiate OneToOneReference from Reference\n [OneToOne]: T;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {\n get: U | undefined;\n\n getWithDeleted: U | undefined;\n\n // Once OneToOneReference is loaded, it can get a lot of the ManyToOneReference methods that\n // are available even in an unloaded state; below is mostly a copy/paste of those.\n\n /** Returns the id of the current assigned entity or a runtime error if it's either a) unset or b) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n idIfSet: IdOf<U> | undefined;\n\n idUntagged: string;\n\n idUntaggedMaybe: string | undefined;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/** Type guard utility for determining if an entity field is a Reference. */\nexport function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any> {\n return maybeReference instanceof OneToOneReferenceImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded Reference. */\nexport function isLoadedOneToOneReference(\n maybeReference: any,\n): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any> {\n return isOneToOneReference(maybeReference) && maybeReference.isLoaded;\n}\n\n/**\n * Represents the \"many\" side of a one-to-one relationship.\n *\n * I.e. in a one-to-many from Book -> Reviews, there is a review.book_id that can have many books.\n *\n * This class is for when that `review.book_id` column is itself unique, i.e. like `image.book_id`, and\n * so instead of `Book.images: OneToManyCollection` we have a `Book.image: OneToOneReference`.\n *\n * This class implements `Reference` because it is essentially like \"one entity pointing/refereing to another\",\n * however because we require a `.load` call to lazily know the value of other side (unlike ManyToOneReference\n * which has it's `book_id` column immediately available in the entity `data` hash), there is some wonkiness\n * around methods like `Reference.id` that are usually callable without `load`/`populate`, that for this\n * class can actually only be called post `load`/`populate`.\n *\n * Currently we enforce this with a runtime check, which is not great, but the trade-off of implementing\n * `Reference` seemed worth the downside of a un-type-safe `.id` property.\n */\nexport class OneToOneReferenceImpl<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U>\n implements OneToOneReference<T, U>\n{\n #field: OneToOneField;\n private loaded: U | undefined;\n private _isLoaded: boolean = false;\n #hasBeenSet = false;\n\n constructor(entity: T, field: OneToOneField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idIfSet(): IdOf<U> | undefined {\n if (this._isLoaded) {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idMaybe as IdOf<U> | undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idTaggedMaybe;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n get isSet(): boolean {\n if (this._isLoaded) {\n return this.loaded !== undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded || opts.forceReload) {\n if (!this.entity.isNewEntity) {\n const joinLoaded = this.getPreloaded();\n if (joinLoaded) {\n this.loaded = joinLoaded[0];\n } else {\n try {\n await oneToOneBatchLoader(this.entity.em, this).load(this.entity.idTagged);\n } catch (err) {\n throw appendStack(err as Error, new Error());\n }\n this.preload();\n }\n }\n this._isLoaded = true;\n }\n return this.filterDeleted(this.loaded, opts);\n }\n\n set(other: U, opts: { percolating?: boolean } = {}): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#hasBeenSet = true;\n if (other === this.loaded) {\n this._isLoaded = true;\n return;\n }\n if (this._isLoaded) {\n if (this.loaded && !opts.percolating) {\n this.getOtherRelation(this.loaded).set(undefined);\n }\n }\n const { fieldLogger } = getEmInternalApi(this.entity.em);\n fieldLogger.logSet(this.entity, this.fieldName, other);\n this.loaded = other;\n this._isLoaded = true;\n // This will no-op and mark other dirty if necessary\n if (other && !opts.percolating) {\n this.getOtherRelation(other).set(this.entity);\n }\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.getPreloaded();\n }\n\n preload(): void {\n this.loaded = this.getPreloaded()?.[0];\n this._isLoaded = true;\n }\n\n import(other: OneToOneReferenceImpl<T, U>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n get getWithDeleted(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n private doGet(): U | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded) {\n // This should only be callable in the type system if we've already resolved this to an instance\n throw new Error(\"get was called when not loaded\");\n }\n return this.loaded;\n }\n\n // internal impl\n\n setFromOpts(other: U): void {\n this.set(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete && this.loaded) {\n this.entity.em.delete(this.loaded);\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const otherSide = this.getOtherRelation(current);\n // Don't call `ReactiveReference.set` because it'll blow up\n if (!isReactiveReference(otherSide)) {\n otherSide.set(undefined as any);\n }\n setField(current, this.otherFieldName, undefined);\n }\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n public toString(): string {\n return `OneToOneReference(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n private filterDeleted(entity: U | undefined, opts?: { withDeleted?: boolean }): U | undefined {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : undefined;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReference<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation(this.entity.idTagged, this.fieldName);\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n [RelationT] = null!;\n [RelationU] = null!;\n [ReferenceN] = null!;\n [OneToOne] = null!;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OneToOneReference.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","getInstanceData","failNoId","failIfNewEntity","deTagId","oneToOneBatchLoader","appendStack","getEmInternalApi","isReactiveReference","isCascadeDelete","RelationT","RelationU","ReferenceN"],"sources":["../../src/relations/OneToOneReference.ts"],"sourcesContent":["import { oneToOneBatchLoader } from \"src/batchloaders/oneToOneBatchLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type EntityMetadata } from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport {\n type IdOf,\n type LoadedReference,\n type OneToOneField,\n type TaggedId,\n appendStack,\n deTagId,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { type ManyToOneReference, failIfNewEntity, failNoId } from \"src/relations/ManyToOneReference.ts\";\nimport { isReactiveReference } from \"src/relations/ReactiveReference.ts\";\nimport { type Reference } from \"src/relations/Reference.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nconst OneToOne = Symbol();\n\n/** An alias for creating `OneToOneReference`s. */\nexport function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U> {\n return lazyField((entity: T, fieldName) => {\n const o2o = getMetadata(entity).allFields[fieldName] as OneToOneField;\n return new OneToOneReferenceImpl<T, U>(entity, o2o);\n });\n}\n\n/** The lazy-loaded/lookup side of a one-to-one, i.e. the side w/o the unique foreign key column. */\nexport interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {\n // Need to differentiate OneToOneReference from Reference\n [OneToOne]: T;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {\n get: U | undefined;\n\n getWithDeleted: U | undefined;\n\n // Once OneToOneReference is loaded, it can get a lot of the ManyToOneReference methods that\n // are available even in an unloaded state; below is mostly a copy/paste of those.\n\n /** Returns the id of the current assigned entity or a runtime error if it's either a) unset or b) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n idIfSet: IdOf<U> | undefined;\n\n idUntagged: string;\n\n idUntaggedMaybe: string | undefined;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/** Type guard utility for determining if an entity field is a Reference. */\nexport function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any> {\n return maybeReference instanceof OneToOneReferenceImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded Reference. */\nexport function isLoadedOneToOneReference(\n maybeReference: any,\n): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any> {\n return isOneToOneReference(maybeReference) && maybeReference.isLoaded;\n}\n\n/**\n * Represents the \"many\" side of a one-to-one relationship.\n *\n * I.e. in a one-to-many from Book -> Reviews, there is a review.book_id that can have many books.\n *\n * This class is for when that `review.book_id` column is itself unique, i.e. like `image.book_id`, and\n * so instead of `Book.images: OneToManyCollection` we have a `Book.image: OneToOneReference`.\n *\n * This class implements `Reference` because it is essentially like \"one entity pointing/refereing to another\",\n * however because we require a `.load` call to lazily know the value of other side (unlike ManyToOneReference\n * which has it's `book_id` column immediately available in the entity `data` hash), there is some wonkiness\n * around methods like `Reference.id` that are usually callable without `load`/`populate`, that for this\n * class can actually only be called post `load`/`populate`.\n *\n * Currently we enforce this with a runtime check, which is not great, but the trade-off of implementing\n * `Reference` seemed worth the downside of a un-type-safe `.id` property.\n */\nexport class OneToOneReferenceImpl<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U>\n implements OneToOneReference<T, U>\n{\n #field: OneToOneField;\n private loaded: U | undefined;\n private _isLoaded: boolean = false;\n #hasBeenSet = false;\n\n constructor(entity: T, field: OneToOneField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idIfSet(): IdOf<U> | undefined {\n if (this._isLoaded) {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idMaybe as IdOf<U> | undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idTaggedMaybe;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n get isSet(): boolean {\n if (this._isLoaded) {\n return this.loaded !== undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded || opts.forceReload) {\n if (!this.entity.isNewEntity) {\n const joinLoaded = this.getPreloaded();\n if (joinLoaded) {\n this.loaded = joinLoaded[0];\n } else {\n try {\n await oneToOneBatchLoader(this.entity.em, this).load(this.entity.idTagged);\n } catch (err) {\n throw appendStack(err as Error, new Error());\n }\n this.preload();\n }\n }\n this._isLoaded = true;\n }\n return this.filterDeleted(this.loaded, opts);\n }\n\n set(other: U, opts: { percolating?: boolean } = {}): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#hasBeenSet = true;\n if (other === this.loaded) {\n this._isLoaded = true;\n return;\n }\n if (this._isLoaded) {\n if (this.loaded && !opts.percolating) {\n this.getOtherRelation(this.loaded).set(undefined);\n }\n }\n const { fieldLogger } = getEmInternalApi(this.entity.em);\n fieldLogger.logSet(this.entity, this.fieldName, other);\n this.loaded = other;\n this._isLoaded = true;\n // This will no-op and mark other dirty if necessary\n if (other && !opts.percolating) {\n this.getOtherRelation(other).set(this.entity);\n }\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.getPreloaded();\n }\n\n preload(): void {\n this.loaded = this.getPreloaded()?.[0];\n this._isLoaded = true;\n }\n\n import(other: OneToOneReferenceImpl<T, U>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n get getWithDeleted(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n private doGet(): U | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded) {\n // This should only be callable in the type system if we've already resolved this to an instance\n throw new Error(\"get was called when not loaded\");\n }\n return this.loaded;\n }\n\n // internal impl\n\n setFromOpts(other: U): void {\n this.set(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete && this.loaded) {\n this.entity.em.delete(this.loaded);\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const otherSide = this.getOtherRelation(current);\n // Don't call `ReactiveReference.set` because it'll blow up\n if (!isReactiveReference(otherSide)) {\n otherSide.set(undefined as any);\n }\n setField(current, this.otherFieldName, undefined);\n }\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n public toString(): string {\n return `OneToOneReference(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n private filterDeleted(entity: U | undefined, opts?: { withDeleted?: boolean }): U | undefined {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : undefined;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReference<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation(this.entity.idTagged, this.fieldName);\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n [RelationT] = null!;\n [RelationU] = null!;\n [ReferenceN] = null!;\n [OneToOne] = null!;\n}\n"],"mappings":"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"}
|
|
@@ -9,13 +9,13 @@ import { Entity } from "../Entity.cjs";
|
|
|
9
9
|
//#region src/relations/OneToOneReference.d.ts
|
|
10
10
|
declare const OneToOne: unique symbol;
|
|
11
11
|
/** An alias for creating `OneToOneReference`s. */
|
|
12
|
-
declare function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U>;
|
|
12
|
+
export declare function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U>;
|
|
13
13
|
/** The lazy-loaded/lookup side of a one-to-one, i.e. the side w/o the unique foreign key column. */
|
|
14
|
-
interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {
|
|
14
|
+
export interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {
|
|
15
15
|
[OneToOne]: T;
|
|
16
16
|
}
|
|
17
17
|
/** Adds a known-safe `get` accessor. */
|
|
18
|
-
interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {
|
|
18
|
+
export interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {
|
|
19
19
|
get: U | undefined;
|
|
20
20
|
getWithDeleted: U | undefined;
|
|
21
21
|
/** Returns the id of the current assigned entity or a runtime error if it's either a) unset or b) set to a new entity that doesn't have an `id` yet. */
|
|
@@ -27,9 +27,9 @@ interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends Lo
|
|
|
27
27
|
readonly isSet: boolean;
|
|
28
28
|
}
|
|
29
29
|
/** Type guard utility for determining if an entity field is a Reference. */
|
|
30
|
-
declare function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any>;
|
|
30
|
+
export declare function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any>;
|
|
31
31
|
/** Type guard utility for determining if an entity field is a loaded Reference. */
|
|
32
|
-
declare function isLoadedOneToOneReference(maybeReference: any): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any>;
|
|
32
|
+
export declare function isLoadedOneToOneReference(maybeReference: any): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any>;
|
|
33
33
|
/**
|
|
34
34
|
* Represents the "many" side of a one-to-one relationship.
|
|
35
35
|
*
|
|
@@ -47,7 +47,7 @@ declare function isLoadedOneToOneReference(maybeReference: any): maybeReference
|
|
|
47
47
|
* Currently we enforce this with a runtime check, which is not great, but the trade-off of implementing
|
|
48
48
|
* `Reference` seemed worth the downside of a un-type-safe `.id` property.
|
|
49
49
|
*/
|
|
50
|
-
declare class OneToOneReferenceImpl<T extends Entity, U extends Entity> extends AbstractRelationImpl<T, U> implements OneToOneReference<T, U> {
|
|
50
|
+
export declare class OneToOneReferenceImpl<T extends Entity, U extends Entity> extends AbstractRelationImpl<T, U> implements OneToOneReference<T, U> {
|
|
51
51
|
#private;
|
|
52
52
|
private loaded;
|
|
53
53
|
private _isLoaded;
|
|
@@ -93,5 +93,5 @@ declare class OneToOneReferenceImpl<T extends Entity, U extends Entity> extends
|
|
|
93
93
|
[OneToOne]: never;
|
|
94
94
|
}
|
|
95
95
|
//#endregion
|
|
96
|
-
export {
|
|
96
|
+
export {};
|
|
97
97
|
//# sourceMappingURL=OneToOneReference.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OneToOneReference.d.cts","names":[],"sources":["../../src/relations/OneToOneReference.ts"],"mappings":";;;;;;;;;cAyBM;;
|
|
1
|
+
{"version":3,"file":"OneToOneReference.d.cts","names":[],"sources":["../../src/relations/OneToOneReference.ts"],"mappings":";;;;;;;;;cAyBM;;wBAGU,YAAY,UAAU,QAAQ,UAAU,WAAW,kBAAkB,GAAG;;iBAQvE,kBAAkB,UAAU,QAAQ,UAAU,gBAAgB,UAAU,GAAG;GAEzF,WAAW;;;iBAIG,wBAAwB,UAAU,QAAQ,UAAU,gBAAgB,gBAAgB,GAAG;EACtG,KAAK;EAEL,gBAAgB;;EAMhB,IAAI,KAAK;EAET,SAAS,KAAK;EAEd;EAEA;;WAGS;;;wBAIK,oBAAoB,sBAAsB,kBAAkB;;wBAK5D,0BACd,sBACC,kBAAkB,2BAA2B;;;;;;;;;;;;;;;;;;qBAqBnC,sBAAsB,UAAU,QAAQ,UAAU,gBACrD,qBAAqB,GAAG,cACrB,kBAAkB,GAAG;;UAGxB;UACA;EAGR,YAAY,QAAQ,GAAG,OAAO;MAS1B,mBAAmB;MAInB,wBAAwB;MAIxB,MAAM,KAAK;MAIX,WAAW,KAAK;MAOhB;MAIA;cAIQ;MAQR,iBAAiB;cAQT;MAIR;EAQE,KAAK;IAAQ;IAAuB;MAA+B,QAAQ;EAqBjF,IAAI,OAAO,GAAG;IAAQ;;MAsBlB;MAIA;EAIJ;EAKA,OAAO,OAAO,sBAAsB,GAAG,IAAI,aAAa,GAAG,MAAM;MAK7D,kBAAkB;MAIlB,OAAO;MAIP,aAAa;UAIT;EAWR,YAAY,OAAO;EAInB;EAMM,0BAA0B;MAgB5B;EAIG;UAIC;;UAKA;UAIA;cAKI;GAIX;GACA;GACA;GACA"}
|
|
@@ -9,13 +9,13 @@ import { Entity } from "../Entity.mjs";
|
|
|
9
9
|
//#region src/relations/OneToOneReference.d.ts
|
|
10
10
|
declare const OneToOne: unique symbol;
|
|
11
11
|
/** An alias for creating `OneToOneReference`s. */
|
|
12
|
-
declare function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U>;
|
|
12
|
+
export declare function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U>;
|
|
13
13
|
/** The lazy-loaded/lookup side of a one-to-one, i.e. the side w/o the unique foreign key column. */
|
|
14
|
-
interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {
|
|
14
|
+
export interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {
|
|
15
15
|
[OneToOne]: T;
|
|
16
16
|
}
|
|
17
17
|
/** Adds a known-safe `get` accessor. */
|
|
18
|
-
interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {
|
|
18
|
+
export interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {
|
|
19
19
|
get: U | undefined;
|
|
20
20
|
getWithDeleted: U | undefined;
|
|
21
21
|
/** Returns the id of the current assigned entity or a runtime error if it's either a) unset or b) set to a new entity that doesn't have an `id` yet. */
|
|
@@ -27,9 +27,9 @@ interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends Lo
|
|
|
27
27
|
readonly isSet: boolean;
|
|
28
28
|
}
|
|
29
29
|
/** Type guard utility for determining if an entity field is a Reference. */
|
|
30
|
-
declare function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any>;
|
|
30
|
+
export declare function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any>;
|
|
31
31
|
/** Type guard utility for determining if an entity field is a loaded Reference. */
|
|
32
|
-
declare function isLoadedOneToOneReference(maybeReference: any): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any>;
|
|
32
|
+
export declare function isLoadedOneToOneReference(maybeReference: any): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any>;
|
|
33
33
|
/**
|
|
34
34
|
* Represents the "many" side of a one-to-one relationship.
|
|
35
35
|
*
|
|
@@ -47,7 +47,7 @@ declare function isLoadedOneToOneReference(maybeReference: any): maybeReference
|
|
|
47
47
|
* Currently we enforce this with a runtime check, which is not great, but the trade-off of implementing
|
|
48
48
|
* `Reference` seemed worth the downside of a un-type-safe `.id` property.
|
|
49
49
|
*/
|
|
50
|
-
declare class OneToOneReferenceImpl<T extends Entity, U extends Entity> extends AbstractRelationImpl<T, U> implements OneToOneReference<T, U> {
|
|
50
|
+
export declare class OneToOneReferenceImpl<T extends Entity, U extends Entity> extends AbstractRelationImpl<T, U> implements OneToOneReference<T, U> {
|
|
51
51
|
#private;
|
|
52
52
|
private loaded;
|
|
53
53
|
private _isLoaded;
|
|
@@ -93,5 +93,5 @@ declare class OneToOneReferenceImpl<T extends Entity, U extends Entity> extends
|
|
|
93
93
|
[OneToOne]: never;
|
|
94
94
|
}
|
|
95
95
|
//#endregion
|
|
96
|
-
export {
|
|
96
|
+
export {};
|
|
97
97
|
//# sourceMappingURL=OneToOneReference.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OneToOneReference.d.mts","names":[],"sources":["../../src/relations/OneToOneReference.ts"],"mappings":";;;;;;;;;cAyBM;;
|
|
1
|
+
{"version":3,"file":"OneToOneReference.d.mts","names":[],"sources":["../../src/relations/OneToOneReference.ts"],"mappings":";;;;;;;;;cAyBM;;wBAGU,YAAY,UAAU,QAAQ,UAAU,WAAW,kBAAkB,GAAG;;iBAQvE,kBAAkB,UAAU,QAAQ,UAAU,gBAAgB,UAAU,GAAG;GAEzF,WAAW;;;iBAIG,wBAAwB,UAAU,QAAQ,UAAU,gBAAgB,gBAAgB,GAAG;EACtG,KAAK;EAEL,gBAAgB;;EAMhB,IAAI,KAAK;EAET,SAAS,KAAK;EAEd;EAEA;;WAGS;;;wBAIK,oBAAoB,sBAAsB,kBAAkB;;wBAK5D,0BACd,sBACC,kBAAkB,2BAA2B;;;;;;;;;;;;;;;;;;qBAqBnC,sBAAsB,UAAU,QAAQ,UAAU,gBACrD,qBAAqB,GAAG,cACrB,kBAAkB,GAAG;;UAGxB;UACA;EAGR,YAAY,QAAQ,GAAG,OAAO;MAS1B,mBAAmB;MAInB,wBAAwB;MAIxB,MAAM,KAAK;MAIX,WAAW,KAAK;MAOhB;MAIA;cAIQ;MAQR,iBAAiB;cAQT;MAIR;EAQE,KAAK;IAAQ;IAAuB;MAA+B,QAAQ;EAqBjF,IAAI,OAAO,GAAG;IAAQ;;MAsBlB;MAIA;EAIJ;EAKA,OAAO,OAAO,sBAAsB,GAAG,IAAI,aAAa,GAAG,MAAM;MAK7D,kBAAkB;MAIlB,OAAO;MAIP,aAAa;UAIT;EAWR,YAAY,OAAO;EAInB;EAMM,0BAA0B;MAgB5B;EAIG;UAIC;;UAKA;UAIA;cAKI;GAIX;GACA;GACA;GACA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OneToOneReference.js","names":["#field","#hasBeenSet"],"sources":["../../src/relations/OneToOneReference.ts"],"sourcesContent":["import { oneToOneBatchLoader } from \"src/batchloaders/oneToOneBatchLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type EntityMetadata } from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport {\n type IdOf,\n type LoadedReference,\n type OneToOneField,\n type TaggedId,\n appendStack,\n deTagId,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { type ManyToOneReference, failIfNewEntity, failNoId } from \"src/relations/ManyToOneReference.ts\";\nimport { isReactiveReference } from \"src/relations/ReactiveReference.ts\";\nimport { type Reference } from \"src/relations/Reference.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nconst OneToOne = Symbol();\n\n/** An alias for creating `OneToOneReference`s. */\nexport function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U> {\n return lazyField((entity: T, fieldName) => {\n const o2o = getMetadata(entity).allFields[fieldName] as OneToOneField;\n return new OneToOneReferenceImpl<T, U>(entity, o2o);\n });\n}\n\n/** The lazy-loaded/lookup side of a one-to-one, i.e. the side w/o the unique foreign key column. */\nexport interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {\n // Need to differentiate OneToOneReference from Reference\n [OneToOne]: T;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {\n get: U | undefined;\n\n getWithDeleted: U | undefined;\n\n // Once OneToOneReference is loaded, it can get a lot of the ManyToOneReference methods that\n // are available even in an unloaded state; below is mostly a copy/paste of those.\n\n /** Returns the id of the current assigned entity or a runtime error if it's either a) unset or b) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n idIfSet: IdOf<U> | undefined;\n\n idUntagged: string;\n\n idUntaggedMaybe: string | undefined;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/** Type guard utility for determining if an entity field is a Reference. */\nexport function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any> {\n return maybeReference instanceof OneToOneReferenceImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded Reference. */\nexport function isLoadedOneToOneReference(\n maybeReference: any,\n): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any> {\n return isOneToOneReference(maybeReference) && maybeReference.isLoaded;\n}\n\n/**\n * Represents the \"many\" side of a one-to-one relationship.\n *\n * I.e. in a one-to-many from Book -> Reviews, there is a review.book_id that can have many books.\n *\n * This class is for when that `review.book_id` column is itself unique, i.e. like `image.book_id`, and\n * so instead of `Book.images: OneToManyCollection` we have a `Book.image: OneToOneReference`.\n *\n * This class implements `Reference` because it is essentially like \"one entity pointing/refereing to another\",\n * however because we require a `.load` call to lazily know the value of other side (unlike ManyToOneReference\n * which has it's `book_id` column immediately available in the entity `data` hash), there is some wonkiness\n * around methods like `Reference.id` that are usually callable without `load`/`populate`, that for this\n * class can actually only be called post `load`/`populate`.\n *\n * Currently we enforce this with a runtime check, which is not great, but the trade-off of implementing\n * `Reference` seemed worth the downside of a un-type-safe `.id` property.\n */\nexport class OneToOneReferenceImpl<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U>\n implements OneToOneReference<T, U>\n{\n #field: OneToOneField;\n private loaded: U | undefined;\n private _isLoaded: boolean = false;\n #hasBeenSet = false;\n\n constructor(entity: T, field: OneToOneField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idIfSet(): IdOf<U> | undefined {\n if (this._isLoaded) {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idMaybe as IdOf<U> | undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idTaggedMaybe;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n get isSet(): boolean {\n if (this._isLoaded) {\n return this.loaded !== undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded || opts.forceReload) {\n if (!this.entity.isNewEntity) {\n const joinLoaded = this.getPreloaded();\n if (joinLoaded) {\n this.loaded = joinLoaded[0];\n } else {\n try {\n await oneToOneBatchLoader(this.entity.em, this).load(this.entity.idTagged);\n } catch (err) {\n throw appendStack(err as Error, new Error());\n }\n this.preload();\n }\n }\n this._isLoaded = true;\n }\n return this.filterDeleted(this.loaded, opts);\n }\n\n set(other: U, opts: { percolating?: boolean } = {}): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#hasBeenSet = true;\n if (other === this.loaded) {\n this._isLoaded = true;\n return;\n }\n if (this._isLoaded) {\n if (this.loaded && !opts.percolating) {\n this.getOtherRelation(this.loaded).set(undefined);\n }\n }\n const { fieldLogger } = getEmInternalApi(this.entity.em);\n fieldLogger.logSet(this.entity, this.fieldName, other);\n this.loaded = other;\n this._isLoaded = true;\n // This will no-op and mark other dirty if necessary\n if (other && !opts.percolating) {\n this.getOtherRelation(other).set(this.entity);\n }\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.getPreloaded();\n }\n\n preload(): void {\n this.loaded = this.getPreloaded()?.[0];\n this._isLoaded = true;\n }\n\n import(other: OneToOneReferenceImpl<T, U>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n get getWithDeleted(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n private doGet(): U | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded) {\n // This should only be callable in the type system if we've already resolved this to an instance\n throw new Error(\"get was called when not loaded\");\n }\n return this.loaded;\n }\n\n // internal impl\n\n setFromOpts(other: U): void {\n this.set(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete && this.loaded) {\n this.entity.em.delete(this.loaded);\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const otherSide = this.getOtherRelation(current);\n // Don't call `ReactiveReference.set` because it'll blow up\n if (!isReactiveReference(otherSide)) {\n otherSide.set(undefined as any);\n }\n setField(current, this.otherFieldName, undefined);\n }\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n public toString(): string {\n return `OneToOneReference(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n private filterDeleted(entity: U | undefined, opts?: { withDeleted?: boolean }): U | undefined {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : undefined;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReference<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation(this.entity.idTagged, this.fieldName);\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n [RelationT] = null!;\n [RelationU] = null!;\n [ReferenceN] = null!;\n [OneToOne] = null!;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OneToOneReference.js","names":[],"sources":["../../src/relations/OneToOneReference.ts"],"sourcesContent":["import { oneToOneBatchLoader } from \"src/batchloaders/oneToOneBatchLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type EntityMetadata } from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport {\n type IdOf,\n type LoadedReference,\n type OneToOneField,\n type TaggedId,\n appendStack,\n deTagId,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { type ManyToOneReference, failIfNewEntity, failNoId } from \"src/relations/ManyToOneReference.ts\";\nimport { isReactiveReference } from \"src/relations/ReactiveReference.ts\";\nimport { type Reference } from \"src/relations/Reference.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nconst OneToOne = Symbol();\n\n/** An alias for creating `OneToOneReference`s. */\nexport function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U> {\n return lazyField((entity: T, fieldName) => {\n const o2o = getMetadata(entity).allFields[fieldName] as OneToOneField;\n return new OneToOneReferenceImpl<T, U>(entity, o2o);\n });\n}\n\n/** The lazy-loaded/lookup side of a one-to-one, i.e. the side w/o the unique foreign key column. */\nexport interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {\n // Need to differentiate OneToOneReference from Reference\n [OneToOne]: T;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {\n get: U | undefined;\n\n getWithDeleted: U | undefined;\n\n // Once OneToOneReference is loaded, it can get a lot of the ManyToOneReference methods that\n // are available even in an unloaded state; below is mostly a copy/paste of those.\n\n /** Returns the id of the current assigned entity or a runtime error if it's either a) unset or b) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n idIfSet: IdOf<U> | undefined;\n\n idUntagged: string;\n\n idUntaggedMaybe: string | undefined;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/** Type guard utility for determining if an entity field is a Reference. */\nexport function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any> {\n return maybeReference instanceof OneToOneReferenceImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded Reference. */\nexport function isLoadedOneToOneReference(\n maybeReference: any,\n): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any> {\n return isOneToOneReference(maybeReference) && maybeReference.isLoaded;\n}\n\n/**\n * Represents the \"many\" side of a one-to-one relationship.\n *\n * I.e. in a one-to-many from Book -> Reviews, there is a review.book_id that can have many books.\n *\n * This class is for when that `review.book_id` column is itself unique, i.e. like `image.book_id`, and\n * so instead of `Book.images: OneToManyCollection` we have a `Book.image: OneToOneReference`.\n *\n * This class implements `Reference` because it is essentially like \"one entity pointing/refereing to another\",\n * however because we require a `.load` call to lazily know the value of other side (unlike ManyToOneReference\n * which has it's `book_id` column immediately available in the entity `data` hash), there is some wonkiness\n * around methods like `Reference.id` that are usually callable without `load`/`populate`, that for this\n * class can actually only be called post `load`/`populate`.\n *\n * Currently we enforce this with a runtime check, which is not great, but the trade-off of implementing\n * `Reference` seemed worth the downside of a un-type-safe `.id` property.\n */\nexport class OneToOneReferenceImpl<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U>\n implements OneToOneReference<T, U>\n{\n #field: OneToOneField;\n private loaded: U | undefined;\n private _isLoaded: boolean = false;\n #hasBeenSet = false;\n\n constructor(entity: T, field: OneToOneField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idIfSet(): IdOf<U> | undefined {\n if (this._isLoaded) {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idMaybe as IdOf<U> | undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idTaggedMaybe;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n get isSet(): boolean {\n if (this._isLoaded) {\n return this.loaded !== undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded || opts.forceReload) {\n if (!this.entity.isNewEntity) {\n const joinLoaded = this.getPreloaded();\n if (joinLoaded) {\n this.loaded = joinLoaded[0];\n } else {\n try {\n await oneToOneBatchLoader(this.entity.em, this).load(this.entity.idTagged);\n } catch (err) {\n throw appendStack(err as Error, new Error());\n }\n this.preload();\n }\n }\n this._isLoaded = true;\n }\n return this.filterDeleted(this.loaded, opts);\n }\n\n set(other: U, opts: { percolating?: boolean } = {}): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#hasBeenSet = true;\n if (other === this.loaded) {\n this._isLoaded = true;\n return;\n }\n if (this._isLoaded) {\n if (this.loaded && !opts.percolating) {\n this.getOtherRelation(this.loaded).set(undefined);\n }\n }\n const { fieldLogger } = getEmInternalApi(this.entity.em);\n fieldLogger.logSet(this.entity, this.fieldName, other);\n this.loaded = other;\n this._isLoaded = true;\n // This will no-op and mark other dirty if necessary\n if (other && !opts.percolating) {\n this.getOtherRelation(other).set(this.entity);\n }\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.getPreloaded();\n }\n\n preload(): void {\n this.loaded = this.getPreloaded()?.[0];\n this._isLoaded = true;\n }\n\n import(other: OneToOneReferenceImpl<T, U>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n get getWithDeleted(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n private doGet(): U | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded) {\n // This should only be callable in the type system if we've already resolved this to an instance\n throw new Error(\"get was called when not loaded\");\n }\n return this.loaded;\n }\n\n // internal impl\n\n setFromOpts(other: U): void {\n this.set(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete && this.loaded) {\n this.entity.em.delete(this.loaded);\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const otherSide = this.getOtherRelation(current);\n // Don't call `ReactiveReference.set` because it'll blow up\n if (!isReactiveReference(otherSide)) {\n otherSide.set(undefined as any);\n }\n setField(current, this.otherFieldName, undefined);\n }\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n public toString(): string {\n return `OneToOneReference(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n private filterDeleted(entity: U | undefined, opts?: { withDeleted?: boolean }): U | undefined {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : undefined;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReference<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation(this.entity.idTagged, this.fieldName);\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n [RelationT] = null!;\n [RelationU] = null!;\n [ReferenceN] = null!;\n [OneToOne] = null!;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolymorphicReference.cjs","names":["lazyField","AbstractRelationImpl","getMetadata","getInstanceData","maybeGetConstructorFromReference","isCascadeDelete","isEntity","getConstructorFromTaggedId","failNoId","maybeResolveReferenceToId","failIfNewEntity","#hasBeenSet","OneToManyCollection","sameEntity","getField","RelationT","RelationU","ReferenceN"],"sources":["../../src/relations/PolymorphicReference.ts"],"sourcesContent":["import { maybeGetConstructorFromReference } from \"src/configure.ts\";\nimport { type Entity, isEntity } from \"src/Entity.ts\";\nimport { type IdOf, type TaggedId, sameEntity } from \"src/EntityManager.ts\";\nimport { type PolymorphicFieldComponent, getMetadata } from \"src/EntityMetadata.ts\";\nimport { getField, setField } from \"src/fields.ts\";\nimport {\n type OneToOneReference,\n type PolymorphicField,\n type Reference,\n ensureNotDeleted,\n fail,\n getConstructorFromTaggedId,\n getInstanceData,\n maybeResolveReferenceToId,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { failIfNewEntity, failNoId } from \"src/relations/ManyToOneReference.ts\";\nimport { OneToManyCollection } from \"src/relations/OneToManyCollection.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nexport function hasOnePolymorphic<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n>(): PolymorphicReference<T, U, N> {\n return lazyField((entity: T, fieldName) => {\n return new PolymorphicReferenceImpl<T, U, N>(entity, fieldName as keyof T & string);\n });\n}\n\n/** Type guard utility for determining if an entity field is a PolymorphicReference. */\nexport function isPolymorphicReference(maybeReference: any): maybeReference is PolymorphicReference<any, any, any> {\n return maybeReference instanceof PolymorphicReferenceImpl;\n}\n\n/**\n * A reference that can be assigned to multiple different entity types.\n *\n * I.e. a `Comment.parent` reference that can be an `Author` or `Book`.\n *\n * The `U` generic will be the type union of `Author | Book`.\n */\nexport interface PolymorphicReference<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n> extends Reference<T, U, N> {\n /** Returns the id of the current assigned entity, or a runtime error if either 1) unset or 2) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n /** Returns the id of the current assigned entity, undefined if unset, or a runtime error if set to a new entity. */\n idIfSet: IdOf<U> | undefined;\n\n /** Returns the id of the current assigned entity, undefined if unset, or undefined if set to a new entity. */\n idMaybe: IdOf<U> | undefined;\n\n idTagged: string;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/**\n * Manages a set of foreign keys from one entity to another, i.e. `Comment.parent --> Book | BookReview`.\n *\n * We keep the current `parent` / `parent.id` value in the `__orm.data` hash, where the\n * current value could be either the `comments.parent_book_id` / `comments.parent_book_review_id` id (as a tagged string)\n * from the database, or an entity `Book` / `BookReview` that the user has set.\n *\n * Note that if any of our columns (eg `comments.parent_book_review_id`) is unique, this `PolymorphicReference` will\n * essentially be half of a one-to-one relationship, but we'll keep using this reference on the \"owning\" side; the other\n * side, i.e. `BookReview.comment` will use a `OneToOneReference` to point back to us.\n */\nexport class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N extends never | undefined>\n extends AbstractRelationImpl<T, U>\n implements PolymorphicReference<T, U, N>\n{\n private loaded: U | N | undefined;\n // We need a separate boolean to b/c loaded == undefined can still mean \"_isLoaded\" for nullable fks.\n private _isLoaded = false;\n private field: PolymorphicField;\n #hasBeenSet = false;\n\n constructor(\n entity: T,\n public fieldName: keyof T & string,\n ) {\n super(entity);\n this.field = getMetadata(entity).allFields[this.fieldName] as PolymorphicField;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n private get currentComponent(): PolymorphicFieldComponent | N {\n const cstr = maybeGetConstructorFromReference(this.current());\n return this.field.components.find((c) => c.otherMetadata().cstr === cstr) as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n const current = this.current();\n // Resolve the id to an entity\n if (!this._isLoaded || opts.forceReload) {\n this.loaded =\n isEntity(current) || current === undefined\n ? (current as U | undefined)\n : ((await this.entity.em.load(getConstructorFromTaggedId(current), current)) as U);\n }\n this._isLoaded = true;\n return this.filterDeleted(this.loaded!, opts);\n }\n\n set(other: U | N): void {\n this.setImpl(other);\n }\n\n get isSet(): boolean {\n return this.current() !== undefined;\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n /**\n * Looks for an entity in `EntityManager`, b/c we may have it in memory even if\n * our reference is not specifically loaded.\n */\n maybeFindEntity(): U | undefined {\n // Check this.loaded first b/c a new entity won't have an id yet\n const { idTaggedMaybe } = this;\n return this.loaded ?? (idTaggedMaybe !== undefined ? (this.entity.em.getEntity(idTaggedMaybe) as U) : undefined);\n }\n\n get isPreloaded(): boolean {\n return !!this.maybeFindEntity();\n }\n\n preload(): void {\n this.loaded = this.maybeFindEntity();\n this._isLoaded = true;\n }\n\n private unload(): void {\n this.loaded = undefined;\n this._isLoaded = false;\n }\n\n import(other: PolymorphicReferenceImpl<T, U, N>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n ensureNotDeleted(this.entity, \"pending\");\n // This should only be callable in the type system if we've already resolved this to an instance,\n // but, just in case we somehow got here in an unloaded state, check to see if we're already in the UoW\n if (!this._isLoaded) {\n const existing = this.maybeFindExisting();\n if (existing === undefined) {\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n this.loaded = existing;\n this._isLoaded = true;\n }\n\n return this.filterDeleted(this.loaded!, opts);\n }\n\n get getWithDeleted(): U | N {\n return this.doGet({ withDeleted: true });\n }\n\n get get(): U | N {\n return this.doGet({ withDeleted: false });\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current()) as IdOf<U> | undefined;\n }\n\n get idIfSet(): IdOf<U> | N | undefined {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get idTagged(): string {\n return this.idTaggedMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idTaggedMaybe(): string | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current());\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n // private impl\n\n setFromOpts(other: U): void {\n this.setImpl(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n const current = this.current({ withDeleted: true });\n if (current !== undefined && typeof current !== \"string\") {\n this.entity.em.delete(current as U);\n }\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const o2m = this.getOtherRelation(current);\n if (o2m instanceof OneToManyCollection) {\n o2m.remove(this.entity, { requireLoaded: false });\n } else {\n o2m.set(undefined as any);\n }\n }\n setField(this.entity, this.fieldName, undefined);\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n // Internal method used by PolymorphicReference\n setImpl(other: U | N): void {\n this.#hasBeenSet = true;\n\n if (sameEntity(other, this.current({ withDeleted: true }))) {\n return;\n }\n\n if (\n other !== undefined &&\n !this.field.components.some(\n (c) =>\n other instanceof c.otherMetadata().cstr ||\n (typeof other === \"string\" && getConstructorFromTaggedId(other) === c.otherMetadata().cstr),\n )\n ) {\n fail(`${other} cannot be set as '${this.field.fieldName}' on ${this.entity}`);\n }\n\n // we may not be loaded yet, but our previous entity might already be in the UoW\n const previousLoaded = this.loaded ?? this.maybeFindExisting();\n\n ensureNotDeleted(this.entity, \"pending\");\n\n // Keep the entity when its tagged id cannot distinguish between sibling subtypes.\n if (isEntity(other)) {\n const otherMeta = getMetadata(other);\n const hasComponentsWithSameBaseType =\n otherMeta.baseType &&\n this.field.components.some(\n (component) =>\n component.otherMetadata().baseType === otherMeta.baseType &&\n !(other instanceof component.otherMetadata().cstr),\n );\n setField(\n this.entity,\n this.fieldName,\n other.isNewEntity || hasComponentsWithSameBaseType ? other : other.idTagged,\n );\n } else {\n setField(this.entity, this.fieldName, other);\n }\n\n if (typeof other === \"string\") {\n this.loaded = undefined;\n this._isLoaded = false;\n } else {\n this.loaded = other;\n this._isLoaded = true;\n }\n\n // If had an existing value, remove us from its collection\n if (previousLoaded) {\n const prevRelation = this.getOtherRelation(previousLoaded);\n if (prevRelation instanceof OneToManyCollection) {\n prevRelation.removeIfLoaded(this.entity);\n } else {\n prevRelation.set(undefined as any);\n }\n }\n if (other !== undefined && isEntity(other)) {\n const newRelation = this.getOtherRelation(other);\n if (newRelation instanceof OneToManyCollection) {\n newRelation.add(this.entity);\n } else {\n newRelation.set(this.entity);\n }\n }\n }\n\n // We need to keep U in data[fieldName] to handle entities without an id assigned yet.\n current(opts?: { withDeleted?: boolean }): U | TaggedId | N {\n const current = getField(this.entity, this.fieldName);\n if (current !== undefined && isEntity(current)) {\n return this.filterDeleted(current as U, opts);\n }\n return current;\n }\n\n public toString(): string {\n return `PolymorphicReference(entity: ${this.entity}, fieldName: ${\n this.fieldName\n }, otherType: ${this.currentComponent?.otherMetadata().type}, otherFieldName: ${\n this.currentComponent?.otherFieldName\n }, id: ${this.id})`;\n }\n\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : (undefined as N);\n }\n\n /** Returns the other relation that points back at us, i.e. we're `comment.parent_book_id` and this is `Book.comments`. */\n private getOtherRelation(other: U): OneToManyCollection<U, T> | OneToOneReference<U, T> {\n const component = this.field.components.find((c) => other instanceof c.otherMetadata().cstr) as any;\n return (other as U)[component?.otherFieldName as keyof U] as any;\n }\n\n private maybeFindExisting(): U | undefined {\n return this.idTaggedMaybe !== undefined ? (this.entity.em.getEntity(this.idTagged) as U) : undefined;\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PolymorphicReference.cjs","names":["lazyField","AbstractRelationImpl","getMetadata","getInstanceData","maybeGetConstructorFromReference","isCascadeDelete","isEntity","getConstructorFromTaggedId","failNoId","maybeResolveReferenceToId","failIfNewEntity","OneToManyCollection","sameEntity","getField","RelationT","RelationU","ReferenceN"],"sources":["../../src/relations/PolymorphicReference.ts"],"sourcesContent":["import { maybeGetConstructorFromReference } from \"src/configure.ts\";\nimport { type Entity, isEntity } from \"src/Entity.ts\";\nimport { type IdOf, type TaggedId, sameEntity } from \"src/EntityManager.ts\";\nimport { type PolymorphicFieldComponent, getMetadata } from \"src/EntityMetadata.ts\";\nimport { getField, setField } from \"src/fields.ts\";\nimport {\n type OneToOneReference,\n type PolymorphicField,\n type Reference,\n ensureNotDeleted,\n fail,\n getConstructorFromTaggedId,\n getInstanceData,\n maybeResolveReferenceToId,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { failIfNewEntity, failNoId } from \"src/relations/ManyToOneReference.ts\";\nimport { OneToManyCollection } from \"src/relations/OneToManyCollection.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nexport function hasOnePolymorphic<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n>(): PolymorphicReference<T, U, N> {\n return lazyField((entity: T, fieldName) => {\n return new PolymorphicReferenceImpl<T, U, N>(entity, fieldName as keyof T & string);\n });\n}\n\n/** Type guard utility for determining if an entity field is a PolymorphicReference. */\nexport function isPolymorphicReference(maybeReference: any): maybeReference is PolymorphicReference<any, any, any> {\n return maybeReference instanceof PolymorphicReferenceImpl;\n}\n\n/**\n * A reference that can be assigned to multiple different entity types.\n *\n * I.e. a `Comment.parent` reference that can be an `Author` or `Book`.\n *\n * The `U` generic will be the type union of `Author | Book`.\n */\nexport interface PolymorphicReference<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n> extends Reference<T, U, N> {\n /** Returns the id of the current assigned entity, or a runtime error if either 1) unset or 2) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n /** Returns the id of the current assigned entity, undefined if unset, or a runtime error if set to a new entity. */\n idIfSet: IdOf<U> | undefined;\n\n /** Returns the id of the current assigned entity, undefined if unset, or undefined if set to a new entity. */\n idMaybe: IdOf<U> | undefined;\n\n idTagged: string;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/**\n * Manages a set of foreign keys from one entity to another, i.e. `Comment.parent --> Book | BookReview`.\n *\n * We keep the current `parent` / `parent.id` value in the `__orm.data` hash, where the\n * current value could be either the `comments.parent_book_id` / `comments.parent_book_review_id` id (as a tagged string)\n * from the database, or an entity `Book` / `BookReview` that the user has set.\n *\n * Note that if any of our columns (eg `comments.parent_book_review_id`) is unique, this `PolymorphicReference` will\n * essentially be half of a one-to-one relationship, but we'll keep using this reference on the \"owning\" side; the other\n * side, i.e. `BookReview.comment` will use a `OneToOneReference` to point back to us.\n */\nexport class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N extends never | undefined>\n extends AbstractRelationImpl<T, U>\n implements PolymorphicReference<T, U, N>\n{\n private loaded: U | N | undefined;\n // We need a separate boolean to b/c loaded == undefined can still mean \"_isLoaded\" for nullable fks.\n private _isLoaded = false;\n private field: PolymorphicField;\n #hasBeenSet = false;\n\n constructor(\n entity: T,\n public fieldName: keyof T & string,\n ) {\n super(entity);\n this.field = getMetadata(entity).allFields[this.fieldName] as PolymorphicField;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n private get currentComponent(): PolymorphicFieldComponent | N {\n const cstr = maybeGetConstructorFromReference(this.current());\n return this.field.components.find((c) => c.otherMetadata().cstr === cstr) as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n const current = this.current();\n // Resolve the id to an entity\n if (!this._isLoaded || opts.forceReload) {\n this.loaded =\n isEntity(current) || current === undefined\n ? (current as U | undefined)\n : ((await this.entity.em.load(getConstructorFromTaggedId(current), current)) as U);\n }\n this._isLoaded = true;\n return this.filterDeleted(this.loaded!, opts);\n }\n\n set(other: U | N): void {\n this.setImpl(other);\n }\n\n get isSet(): boolean {\n return this.current() !== undefined;\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n /**\n * Looks for an entity in `EntityManager`, b/c we may have it in memory even if\n * our reference is not specifically loaded.\n */\n maybeFindEntity(): U | undefined {\n // Check this.loaded first b/c a new entity won't have an id yet\n const { idTaggedMaybe } = this;\n return this.loaded ?? (idTaggedMaybe !== undefined ? (this.entity.em.getEntity(idTaggedMaybe) as U) : undefined);\n }\n\n get isPreloaded(): boolean {\n return !!this.maybeFindEntity();\n }\n\n preload(): void {\n this.loaded = this.maybeFindEntity();\n this._isLoaded = true;\n }\n\n private unload(): void {\n this.loaded = undefined;\n this._isLoaded = false;\n }\n\n import(other: PolymorphicReferenceImpl<T, U, N>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n ensureNotDeleted(this.entity, \"pending\");\n // This should only be callable in the type system if we've already resolved this to an instance,\n // but, just in case we somehow got here in an unloaded state, check to see if we're already in the UoW\n if (!this._isLoaded) {\n const existing = this.maybeFindExisting();\n if (existing === undefined) {\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n this.loaded = existing;\n this._isLoaded = true;\n }\n\n return this.filterDeleted(this.loaded!, opts);\n }\n\n get getWithDeleted(): U | N {\n return this.doGet({ withDeleted: true });\n }\n\n get get(): U | N {\n return this.doGet({ withDeleted: false });\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current()) as IdOf<U> | undefined;\n }\n\n get idIfSet(): IdOf<U> | N | undefined {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get idTagged(): string {\n return this.idTaggedMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idTaggedMaybe(): string | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current());\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n // private impl\n\n setFromOpts(other: U): void {\n this.setImpl(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n const current = this.current({ withDeleted: true });\n if (current !== undefined && typeof current !== \"string\") {\n this.entity.em.delete(current as U);\n }\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const o2m = this.getOtherRelation(current);\n if (o2m instanceof OneToManyCollection) {\n o2m.remove(this.entity, { requireLoaded: false });\n } else {\n o2m.set(undefined as any);\n }\n }\n setField(this.entity, this.fieldName, undefined);\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n // Internal method used by PolymorphicReference\n setImpl(other: U | N): void {\n this.#hasBeenSet = true;\n\n if (sameEntity(other, this.current({ withDeleted: true }))) {\n return;\n }\n\n if (\n other !== undefined &&\n !this.field.components.some(\n (c) =>\n other instanceof c.otherMetadata().cstr ||\n (typeof other === \"string\" && getConstructorFromTaggedId(other) === c.otherMetadata().cstr),\n )\n ) {\n fail(`${other} cannot be set as '${this.field.fieldName}' on ${this.entity}`);\n }\n\n // we may not be loaded yet, but our previous entity might already be in the UoW\n const previousLoaded = this.loaded ?? this.maybeFindExisting();\n\n ensureNotDeleted(this.entity, \"pending\");\n\n // Keep the entity when its tagged id cannot distinguish between sibling subtypes.\n if (isEntity(other)) {\n const otherMeta = getMetadata(other);\n const hasComponentsWithSameBaseType =\n otherMeta.baseType &&\n this.field.components.some(\n (component) =>\n component.otherMetadata().baseType === otherMeta.baseType &&\n !(other instanceof component.otherMetadata().cstr),\n );\n setField(\n this.entity,\n this.fieldName,\n other.isNewEntity || hasComponentsWithSameBaseType ? other : other.idTagged,\n );\n } else {\n setField(this.entity, this.fieldName, other);\n }\n\n if (typeof other === \"string\") {\n this.loaded = undefined;\n this._isLoaded = false;\n } else {\n this.loaded = other;\n this._isLoaded = true;\n }\n\n // If had an existing value, remove us from its collection\n if (previousLoaded) {\n const prevRelation = this.getOtherRelation(previousLoaded);\n if (prevRelation instanceof OneToManyCollection) {\n prevRelation.removeIfLoaded(this.entity);\n } else {\n prevRelation.set(undefined as any);\n }\n }\n if (other !== undefined && isEntity(other)) {\n const newRelation = this.getOtherRelation(other);\n if (newRelation instanceof OneToManyCollection) {\n newRelation.add(this.entity);\n } else {\n newRelation.set(this.entity);\n }\n }\n }\n\n // We need to keep U in data[fieldName] to handle entities without an id assigned yet.\n current(opts?: { withDeleted?: boolean }): U | TaggedId | N {\n const current = getField(this.entity, this.fieldName);\n if (current !== undefined && isEntity(current)) {\n return this.filterDeleted(current as U, opts);\n }\n return current;\n }\n\n public toString(): string {\n return `PolymorphicReference(entity: ${this.entity}, fieldName: ${\n this.fieldName\n }, otherType: ${this.currentComponent?.otherMetadata().type}, otherFieldName: ${\n this.currentComponent?.otherFieldName\n }, id: ${this.id})`;\n }\n\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : (undefined as N);\n }\n\n /** Returns the other relation that points back at us, i.e. we're `comment.parent_book_id` and this is `Book.comments`. */\n private getOtherRelation(other: U): OneToManyCollection<U, T> | OneToOneReference<U, T> {\n const component = this.field.components.find((c) => other instanceof c.otherMetadata().cstr) as any;\n return (other as U)[component?.otherFieldName as keyof U] as any;\n }\n\n private maybeFindExisting(): U | undefined {\n return this.idTaggedMaybe !== undefined ? (this.entity.em.getEntity(this.idTagged) as U) : undefined;\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n"],"mappings":"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"}
|
|
@@ -6,9 +6,9 @@ import "../index.cjs";
|
|
|
6
6
|
import { IdOf, TaggedId } from "../EntityManager.cjs";
|
|
7
7
|
import { Entity } from "../Entity.cjs";
|
|
8
8
|
//#region src/relations/PolymorphicReference.d.ts
|
|
9
|
-
declare function hasOnePolymorphic<T extends Entity, U extends Entity, N extends never | undefined>(): PolymorphicReference<T, U, N>;
|
|
9
|
+
export declare function hasOnePolymorphic<T extends Entity, U extends Entity, N extends never | undefined>(): PolymorphicReference<T, U, N>;
|
|
10
10
|
/** Type guard utility for determining if an entity field is a PolymorphicReference. */
|
|
11
|
-
declare function isPolymorphicReference(maybeReference: any): maybeReference is PolymorphicReference<any, any, any>;
|
|
11
|
+
export declare function isPolymorphicReference(maybeReference: any): maybeReference is PolymorphicReference<any, any, any>;
|
|
12
12
|
/**
|
|
13
13
|
* A reference that can be assigned to multiple different entity types.
|
|
14
14
|
*
|
|
@@ -16,7 +16,7 @@ declare function isPolymorphicReference(maybeReference: any): maybeReference is
|
|
|
16
16
|
*
|
|
17
17
|
* The `U` generic will be the type union of `Author | Book`.
|
|
18
18
|
*/
|
|
19
|
-
interface PolymorphicReference<T extends Entity, U extends Entity, N extends never | undefined> extends Reference<T, U, N> {
|
|
19
|
+
export interface PolymorphicReference<T extends Entity, U extends Entity, N extends never | undefined> extends Reference<T, U, N> {
|
|
20
20
|
/** Returns the id of the current assigned entity, or a runtime error if either 1) unset or 2) set to a new entity that doesn't have an `id` yet. */
|
|
21
21
|
id: IdOf<U>;
|
|
22
22
|
/** Returns the id of the current assigned entity, undefined if unset, or a runtime error if set to a new entity. */
|
|
@@ -38,7 +38,7 @@ interface PolymorphicReference<T extends Entity, U extends Entity, N extends nev
|
|
|
38
38
|
* essentially be half of a one-to-one relationship, but we'll keep using this reference on the "owning" side; the other
|
|
39
39
|
* side, i.e. `BookReview.comment` will use a `OneToOneReference` to point back to us.
|
|
40
40
|
*/
|
|
41
|
-
declare class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N extends never | undefined> extends AbstractRelationImpl<T, U> implements PolymorphicReference<T, U, N> {
|
|
41
|
+
export declare class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N extends never | undefined> extends AbstractRelationImpl<T, U> implements PolymorphicReference<T, U, N> {
|
|
42
42
|
#private;
|
|
43
43
|
fieldName: keyof T & string;
|
|
44
44
|
private loaded;
|
|
@@ -89,5 +89,4 @@ declare class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N ext
|
|
|
89
89
|
[ReferenceN]: N;
|
|
90
90
|
}
|
|
91
91
|
//#endregion
|
|
92
|
-
export { PolymorphicReference, PolymorphicReferenceImpl, hasOnePolymorphic, isPolymorphicReference };
|
|
93
92
|
//# sourceMappingURL=PolymorphicReference.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolymorphicReference.d.cts","names":[],"sources":["../../src/relations/PolymorphicReference.ts"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"PolymorphicReference.d.cts","names":[],"sources":["../../src/relations/PolymorphicReference.ts"],"mappings":";;;;;;;;wBAuBgB,kBACd,UAAU,QACV,UAAU,QACV,gCACG,qBAAqB,GAAG,GAAG;;wBAOhB,uBAAuB,sBAAsB,kBAAkB;;;;;;;;iBAW9D,qBACf,UAAU,QACV,UAAU,QACV,qCACQ,UAAU,GAAG,GAAG;;EAExB,IAAI,KAAK;;EAGT,SAAS,KAAK;;EAGd,SAAS,KAAK;EAEd;;WAGS;;;;;;;;;;;;;qBAcE,yBAAyB,UAAU,QAAQ,UAAU,QAAQ,qCAChE,qBAAqB,GAAG,cACrB,qBAAqB,GAAG,GAAG;;EAU7B,iBAAiB;UARlB;UAEA;UACA;EAGR,YACE,QAAQ,GACD,iBAAiB;cASd;cAKA;EAIN,KAAK;IAAQ;IAAuB;MAA+B,QAAQ,IAAI;EAcrF,IAAI,OAAO,IAAI;MAIX;MAIA;;;;;EAQJ,mBAAmB;MAMf;EAIJ;UAKQ;EAKR,OAAO,OAAO,yBAAyB,GAAG,GAAG,IAAI,aAAa,GAAG,MAAM;UAK/D;MAgBJ,kBAAkB,IAAI;MAItB,OAAO,IAAI;MAIX,MAAM,KAAK;MAIX,WAAW,KAAK;MAKhB,WAAW,KAAK,KAAK;MAIrB;MAIA;MAKA;EAMJ,YAAY,OAAO;EAInB;EASM,0BAA0B;EAkBhC,QAAQ,OAAO,IAAI;EAsEnB,QAAQ;IAAS;MAA0B,IAAI,WAAW;EAQnD;UAQC;;UAKA;UAKA;GAIP,YAAY;GACZ,YAAY;GACZ,aAAa"}
|
|
@@ -6,9 +6,9 @@ import "../index.mjs";
|
|
|
6
6
|
import { IdOf, TaggedId } from "../EntityManager.mjs";
|
|
7
7
|
import { Entity } from "../Entity.mjs";
|
|
8
8
|
//#region src/relations/PolymorphicReference.d.ts
|
|
9
|
-
declare function hasOnePolymorphic<T extends Entity, U extends Entity, N extends never | undefined>(): PolymorphicReference<T, U, N>;
|
|
9
|
+
export declare function hasOnePolymorphic<T extends Entity, U extends Entity, N extends never | undefined>(): PolymorphicReference<T, U, N>;
|
|
10
10
|
/** Type guard utility for determining if an entity field is a PolymorphicReference. */
|
|
11
|
-
declare function isPolymorphicReference(maybeReference: any): maybeReference is PolymorphicReference<any, any, any>;
|
|
11
|
+
export declare function isPolymorphicReference(maybeReference: any): maybeReference is PolymorphicReference<any, any, any>;
|
|
12
12
|
/**
|
|
13
13
|
* A reference that can be assigned to multiple different entity types.
|
|
14
14
|
*
|
|
@@ -16,7 +16,7 @@ declare function isPolymorphicReference(maybeReference: any): maybeReference is
|
|
|
16
16
|
*
|
|
17
17
|
* The `U` generic will be the type union of `Author | Book`.
|
|
18
18
|
*/
|
|
19
|
-
interface PolymorphicReference<T extends Entity, U extends Entity, N extends never | undefined> extends Reference<T, U, N> {
|
|
19
|
+
export interface PolymorphicReference<T extends Entity, U extends Entity, N extends never | undefined> extends Reference<T, U, N> {
|
|
20
20
|
/** Returns the id of the current assigned entity, or a runtime error if either 1) unset or 2) set to a new entity that doesn't have an `id` yet. */
|
|
21
21
|
id: IdOf<U>;
|
|
22
22
|
/** Returns the id of the current assigned entity, undefined if unset, or a runtime error if set to a new entity. */
|
|
@@ -38,7 +38,7 @@ interface PolymorphicReference<T extends Entity, U extends Entity, N extends nev
|
|
|
38
38
|
* essentially be half of a one-to-one relationship, but we'll keep using this reference on the "owning" side; the other
|
|
39
39
|
* side, i.e. `BookReview.comment` will use a `OneToOneReference` to point back to us.
|
|
40
40
|
*/
|
|
41
|
-
declare class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N extends never | undefined> extends AbstractRelationImpl<T, U> implements PolymorphicReference<T, U, N> {
|
|
41
|
+
export declare class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N extends never | undefined> extends AbstractRelationImpl<T, U> implements PolymorphicReference<T, U, N> {
|
|
42
42
|
#private;
|
|
43
43
|
fieldName: keyof T & string;
|
|
44
44
|
private loaded;
|
|
@@ -89,5 +89,4 @@ declare class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N ext
|
|
|
89
89
|
[ReferenceN]: N;
|
|
90
90
|
}
|
|
91
91
|
//#endregion
|
|
92
|
-
export { PolymorphicReference, PolymorphicReferenceImpl, hasOnePolymorphic, isPolymorphicReference };
|
|
93
92
|
//# sourceMappingURL=PolymorphicReference.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolymorphicReference.d.mts","names":[],"sources":["../../src/relations/PolymorphicReference.ts"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"PolymorphicReference.d.mts","names":[],"sources":["../../src/relations/PolymorphicReference.ts"],"mappings":";;;;;;;;wBAuBgB,kBACd,UAAU,QACV,UAAU,QACV,gCACG,qBAAqB,GAAG,GAAG;;wBAOhB,uBAAuB,sBAAsB,kBAAkB;;;;;;;;iBAW9D,qBACf,UAAU,QACV,UAAU,QACV,qCACQ,UAAU,GAAG,GAAG;;EAExB,IAAI,KAAK;;EAGT,SAAS,KAAK;;EAGd,SAAS,KAAK;EAEd;;WAGS;;;;;;;;;;;;;qBAcE,yBAAyB,UAAU,QAAQ,UAAU,QAAQ,qCAChE,qBAAqB,GAAG,cACrB,qBAAqB,GAAG,GAAG;;EAU7B,iBAAiB;UARlB;UAEA;UACA;EAGR,YACE,QAAQ,GACD,iBAAiB;cASd;cAKA;EAIN,KAAK;IAAQ;IAAuB;MAA+B,QAAQ,IAAI;EAcrF,IAAI,OAAO,IAAI;MAIX;MAIA;;;;;EAQJ,mBAAmB;MAMf;EAIJ;UAKQ;EAKR,OAAO,OAAO,yBAAyB,GAAG,GAAG,IAAI,aAAa,GAAG,MAAM;UAK/D;MAgBJ,kBAAkB,IAAI;MAItB,OAAO,IAAI;MAIX,MAAM,KAAK;MAIX,WAAW,KAAK;MAKhB,WAAW,KAAK,KAAK;MAIrB;MAIA;MAKA;EAMJ,YAAY,OAAO;EAInB;EASM,0BAA0B;EAkBhC,QAAQ,OAAO,IAAI;EAsEnB,QAAQ;IAAS;MAA0B,IAAI,WAAW;EAQnD;UAQC;;UAKA;UAKA;GAIP,YAAY;GACZ,YAAY;GACZ,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolymorphicReference.js","names":["#hasBeenSet"],"sources":["../../src/relations/PolymorphicReference.ts"],"sourcesContent":["import { maybeGetConstructorFromReference } from \"src/configure.ts\";\nimport { type Entity, isEntity } from \"src/Entity.ts\";\nimport { type IdOf, type TaggedId, sameEntity } from \"src/EntityManager.ts\";\nimport { type PolymorphicFieldComponent, getMetadata } from \"src/EntityMetadata.ts\";\nimport { getField, setField } from \"src/fields.ts\";\nimport {\n type OneToOneReference,\n type PolymorphicField,\n type Reference,\n ensureNotDeleted,\n fail,\n getConstructorFromTaggedId,\n getInstanceData,\n maybeResolveReferenceToId,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { failIfNewEntity, failNoId } from \"src/relations/ManyToOneReference.ts\";\nimport { OneToManyCollection } from \"src/relations/OneToManyCollection.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nexport function hasOnePolymorphic<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n>(): PolymorphicReference<T, U, N> {\n return lazyField((entity: T, fieldName) => {\n return new PolymorphicReferenceImpl<T, U, N>(entity, fieldName as keyof T & string);\n });\n}\n\n/** Type guard utility for determining if an entity field is a PolymorphicReference. */\nexport function isPolymorphicReference(maybeReference: any): maybeReference is PolymorphicReference<any, any, any> {\n return maybeReference instanceof PolymorphicReferenceImpl;\n}\n\n/**\n * A reference that can be assigned to multiple different entity types.\n *\n * I.e. a `Comment.parent` reference that can be an `Author` or `Book`.\n *\n * The `U` generic will be the type union of `Author | Book`.\n */\nexport interface PolymorphicReference<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n> extends Reference<T, U, N> {\n /** Returns the id of the current assigned entity, or a runtime error if either 1) unset or 2) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n /** Returns the id of the current assigned entity, undefined if unset, or a runtime error if set to a new entity. */\n idIfSet: IdOf<U> | undefined;\n\n /** Returns the id of the current assigned entity, undefined if unset, or undefined if set to a new entity. */\n idMaybe: IdOf<U> | undefined;\n\n idTagged: string;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/**\n * Manages a set of foreign keys from one entity to another, i.e. `Comment.parent --> Book | BookReview`.\n *\n * We keep the current `parent` / `parent.id` value in the `__orm.data` hash, where the\n * current value could be either the `comments.parent_book_id` / `comments.parent_book_review_id` id (as a tagged string)\n * from the database, or an entity `Book` / `BookReview` that the user has set.\n *\n * Note that if any of our columns (eg `comments.parent_book_review_id`) is unique, this `PolymorphicReference` will\n * essentially be half of a one-to-one relationship, but we'll keep using this reference on the \"owning\" side; the other\n * side, i.e. `BookReview.comment` will use a `OneToOneReference` to point back to us.\n */\nexport class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N extends never | undefined>\n extends AbstractRelationImpl<T, U>\n implements PolymorphicReference<T, U, N>\n{\n private loaded: U | N | undefined;\n // We need a separate boolean to b/c loaded == undefined can still mean \"_isLoaded\" for nullable fks.\n private _isLoaded = false;\n private field: PolymorphicField;\n #hasBeenSet = false;\n\n constructor(\n entity: T,\n public fieldName: keyof T & string,\n ) {\n super(entity);\n this.field = getMetadata(entity).allFields[this.fieldName] as PolymorphicField;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n private get currentComponent(): PolymorphicFieldComponent | N {\n const cstr = maybeGetConstructorFromReference(this.current());\n return this.field.components.find((c) => c.otherMetadata().cstr === cstr) as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n const current = this.current();\n // Resolve the id to an entity\n if (!this._isLoaded || opts.forceReload) {\n this.loaded =\n isEntity(current) || current === undefined\n ? (current as U | undefined)\n : ((await this.entity.em.load(getConstructorFromTaggedId(current), current)) as U);\n }\n this._isLoaded = true;\n return this.filterDeleted(this.loaded!, opts);\n }\n\n set(other: U | N): void {\n this.setImpl(other);\n }\n\n get isSet(): boolean {\n return this.current() !== undefined;\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n /**\n * Looks for an entity in `EntityManager`, b/c we may have it in memory even if\n * our reference is not specifically loaded.\n */\n maybeFindEntity(): U | undefined {\n // Check this.loaded first b/c a new entity won't have an id yet\n const { idTaggedMaybe } = this;\n return this.loaded ?? (idTaggedMaybe !== undefined ? (this.entity.em.getEntity(idTaggedMaybe) as U) : undefined);\n }\n\n get isPreloaded(): boolean {\n return !!this.maybeFindEntity();\n }\n\n preload(): void {\n this.loaded = this.maybeFindEntity();\n this._isLoaded = true;\n }\n\n private unload(): void {\n this.loaded = undefined;\n this._isLoaded = false;\n }\n\n import(other: PolymorphicReferenceImpl<T, U, N>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n ensureNotDeleted(this.entity, \"pending\");\n // This should only be callable in the type system if we've already resolved this to an instance,\n // but, just in case we somehow got here in an unloaded state, check to see if we're already in the UoW\n if (!this._isLoaded) {\n const existing = this.maybeFindExisting();\n if (existing === undefined) {\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n this.loaded = existing;\n this._isLoaded = true;\n }\n\n return this.filterDeleted(this.loaded!, opts);\n }\n\n get getWithDeleted(): U | N {\n return this.doGet({ withDeleted: true });\n }\n\n get get(): U | N {\n return this.doGet({ withDeleted: false });\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current()) as IdOf<U> | undefined;\n }\n\n get idIfSet(): IdOf<U> | N | undefined {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get idTagged(): string {\n return this.idTaggedMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idTaggedMaybe(): string | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current());\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n // private impl\n\n setFromOpts(other: U): void {\n this.setImpl(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n const current = this.current({ withDeleted: true });\n if (current !== undefined && typeof current !== \"string\") {\n this.entity.em.delete(current as U);\n }\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const o2m = this.getOtherRelation(current);\n if (o2m instanceof OneToManyCollection) {\n o2m.remove(this.entity, { requireLoaded: false });\n } else {\n o2m.set(undefined as any);\n }\n }\n setField(this.entity, this.fieldName, undefined);\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n // Internal method used by PolymorphicReference\n setImpl(other: U | N): void {\n this.#hasBeenSet = true;\n\n if (sameEntity(other, this.current({ withDeleted: true }))) {\n return;\n }\n\n if (\n other !== undefined &&\n !this.field.components.some(\n (c) =>\n other instanceof c.otherMetadata().cstr ||\n (typeof other === \"string\" && getConstructorFromTaggedId(other) === c.otherMetadata().cstr),\n )\n ) {\n fail(`${other} cannot be set as '${this.field.fieldName}' on ${this.entity}`);\n }\n\n // we may not be loaded yet, but our previous entity might already be in the UoW\n const previousLoaded = this.loaded ?? this.maybeFindExisting();\n\n ensureNotDeleted(this.entity, \"pending\");\n\n // Keep the entity when its tagged id cannot distinguish between sibling subtypes.\n if (isEntity(other)) {\n const otherMeta = getMetadata(other);\n const hasComponentsWithSameBaseType =\n otherMeta.baseType &&\n this.field.components.some(\n (component) =>\n component.otherMetadata().baseType === otherMeta.baseType &&\n !(other instanceof component.otherMetadata().cstr),\n );\n setField(\n this.entity,\n this.fieldName,\n other.isNewEntity || hasComponentsWithSameBaseType ? other : other.idTagged,\n );\n } else {\n setField(this.entity, this.fieldName, other);\n }\n\n if (typeof other === \"string\") {\n this.loaded = undefined;\n this._isLoaded = false;\n } else {\n this.loaded = other;\n this._isLoaded = true;\n }\n\n // If had an existing value, remove us from its collection\n if (previousLoaded) {\n const prevRelation = this.getOtherRelation(previousLoaded);\n if (prevRelation instanceof OneToManyCollection) {\n prevRelation.removeIfLoaded(this.entity);\n } else {\n prevRelation.set(undefined as any);\n }\n }\n if (other !== undefined && isEntity(other)) {\n const newRelation = this.getOtherRelation(other);\n if (newRelation instanceof OneToManyCollection) {\n newRelation.add(this.entity);\n } else {\n newRelation.set(this.entity);\n }\n }\n }\n\n // We need to keep U in data[fieldName] to handle entities without an id assigned yet.\n current(opts?: { withDeleted?: boolean }): U | TaggedId | N {\n const current = getField(this.entity, this.fieldName);\n if (current !== undefined && isEntity(current)) {\n return this.filterDeleted(current as U, opts);\n }\n return current;\n }\n\n public toString(): string {\n return `PolymorphicReference(entity: ${this.entity}, fieldName: ${\n this.fieldName\n }, otherType: ${this.currentComponent?.otherMetadata().type}, otherFieldName: ${\n this.currentComponent?.otherFieldName\n }, id: ${this.id})`;\n }\n\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : (undefined as N);\n }\n\n /** Returns the other relation that points back at us, i.e. we're `comment.parent_book_id` and this is `Book.comments`. */\n private getOtherRelation(other: U): OneToManyCollection<U, T> | OneToOneReference<U, T> {\n const component = this.field.components.find((c) => other instanceof c.otherMetadata().cstr) as any;\n return (other as U)[component?.otherFieldName as keyof U] as any;\n }\n\n private maybeFindExisting(): U | undefined {\n return this.idTaggedMaybe !== undefined ? (this.entity.em.getEntity(this.idTagged) as U) : undefined;\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PolymorphicReference.js","names":[],"sources":["../../src/relations/PolymorphicReference.ts"],"sourcesContent":["import { maybeGetConstructorFromReference } from \"src/configure.ts\";\nimport { type Entity, isEntity } from \"src/Entity.ts\";\nimport { type IdOf, type TaggedId, sameEntity } from \"src/EntityManager.ts\";\nimport { type PolymorphicFieldComponent, getMetadata } from \"src/EntityMetadata.ts\";\nimport { getField, setField } from \"src/fields.ts\";\nimport {\n type OneToOneReference,\n type PolymorphicField,\n type Reference,\n ensureNotDeleted,\n fail,\n getConstructorFromTaggedId,\n getInstanceData,\n maybeResolveReferenceToId,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { failIfNewEntity, failNoId } from \"src/relations/ManyToOneReference.ts\";\nimport { OneToManyCollection } from \"src/relations/OneToManyCollection.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nexport function hasOnePolymorphic<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n>(): PolymorphicReference<T, U, N> {\n return lazyField((entity: T, fieldName) => {\n return new PolymorphicReferenceImpl<T, U, N>(entity, fieldName as keyof T & string);\n });\n}\n\n/** Type guard utility for determining if an entity field is a PolymorphicReference. */\nexport function isPolymorphicReference(maybeReference: any): maybeReference is PolymorphicReference<any, any, any> {\n return maybeReference instanceof PolymorphicReferenceImpl;\n}\n\n/**\n * A reference that can be assigned to multiple different entity types.\n *\n * I.e. a `Comment.parent` reference that can be an `Author` or `Book`.\n *\n * The `U` generic will be the type union of `Author | Book`.\n */\nexport interface PolymorphicReference<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n> extends Reference<T, U, N> {\n /** Returns the id of the current assigned entity, or a runtime error if either 1) unset or 2) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n /** Returns the id of the current assigned entity, undefined if unset, or a runtime error if set to a new entity. */\n idIfSet: IdOf<U> | undefined;\n\n /** Returns the id of the current assigned entity, undefined if unset, or undefined if set to a new entity. */\n idMaybe: IdOf<U> | undefined;\n\n idTagged: string;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/**\n * Manages a set of foreign keys from one entity to another, i.e. `Comment.parent --> Book | BookReview`.\n *\n * We keep the current `parent` / `parent.id` value in the `__orm.data` hash, where the\n * current value could be either the `comments.parent_book_id` / `comments.parent_book_review_id` id (as a tagged string)\n * from the database, or an entity `Book` / `BookReview` that the user has set.\n *\n * Note that if any of our columns (eg `comments.parent_book_review_id`) is unique, this `PolymorphicReference` will\n * essentially be half of a one-to-one relationship, but we'll keep using this reference on the \"owning\" side; the other\n * side, i.e. `BookReview.comment` will use a `OneToOneReference` to point back to us.\n */\nexport class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N extends never | undefined>\n extends AbstractRelationImpl<T, U>\n implements PolymorphicReference<T, U, N>\n{\n private loaded: U | N | undefined;\n // We need a separate boolean to b/c loaded == undefined can still mean \"_isLoaded\" for nullable fks.\n private _isLoaded = false;\n private field: PolymorphicField;\n #hasBeenSet = false;\n\n constructor(\n entity: T,\n public fieldName: keyof T & string,\n ) {\n super(entity);\n this.field = getMetadata(entity).allFields[this.fieldName] as PolymorphicField;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n private get currentComponent(): PolymorphicFieldComponent | N {\n const cstr = maybeGetConstructorFromReference(this.current());\n return this.field.components.find((c) => c.otherMetadata().cstr === cstr) as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n const current = this.current();\n // Resolve the id to an entity\n if (!this._isLoaded || opts.forceReload) {\n this.loaded =\n isEntity(current) || current === undefined\n ? (current as U | undefined)\n : ((await this.entity.em.load(getConstructorFromTaggedId(current), current)) as U);\n }\n this._isLoaded = true;\n return this.filterDeleted(this.loaded!, opts);\n }\n\n set(other: U | N): void {\n this.setImpl(other);\n }\n\n get isSet(): boolean {\n return this.current() !== undefined;\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n /**\n * Looks for an entity in `EntityManager`, b/c we may have it in memory even if\n * our reference is not specifically loaded.\n */\n maybeFindEntity(): U | undefined {\n // Check this.loaded first b/c a new entity won't have an id yet\n const { idTaggedMaybe } = this;\n return this.loaded ?? (idTaggedMaybe !== undefined ? (this.entity.em.getEntity(idTaggedMaybe) as U) : undefined);\n }\n\n get isPreloaded(): boolean {\n return !!this.maybeFindEntity();\n }\n\n preload(): void {\n this.loaded = this.maybeFindEntity();\n this._isLoaded = true;\n }\n\n private unload(): void {\n this.loaded = undefined;\n this._isLoaded = false;\n }\n\n import(other: PolymorphicReferenceImpl<T, U, N>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n ensureNotDeleted(this.entity, \"pending\");\n // This should only be callable in the type system if we've already resolved this to an instance,\n // but, just in case we somehow got here in an unloaded state, check to see if we're already in the UoW\n if (!this._isLoaded) {\n const existing = this.maybeFindExisting();\n if (existing === undefined) {\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n this.loaded = existing;\n this._isLoaded = true;\n }\n\n return this.filterDeleted(this.loaded!, opts);\n }\n\n get getWithDeleted(): U | N {\n return this.doGet({ withDeleted: true });\n }\n\n get get(): U | N {\n return this.doGet({ withDeleted: false });\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current()) as IdOf<U> | undefined;\n }\n\n get idIfSet(): IdOf<U> | N | undefined {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get idTagged(): string {\n return this.idTaggedMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idTaggedMaybe(): string | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current());\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n // private impl\n\n setFromOpts(other: U): void {\n this.setImpl(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n const current = this.current({ withDeleted: true });\n if (current !== undefined && typeof current !== \"string\") {\n this.entity.em.delete(current as U);\n }\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const o2m = this.getOtherRelation(current);\n if (o2m instanceof OneToManyCollection) {\n o2m.remove(this.entity, { requireLoaded: false });\n } else {\n o2m.set(undefined as any);\n }\n }\n setField(this.entity, this.fieldName, undefined);\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n // Internal method used by PolymorphicReference\n setImpl(other: U | N): void {\n this.#hasBeenSet = true;\n\n if (sameEntity(other, this.current({ withDeleted: true }))) {\n return;\n }\n\n if (\n other !== undefined &&\n !this.field.components.some(\n (c) =>\n other instanceof c.otherMetadata().cstr ||\n (typeof other === \"string\" && getConstructorFromTaggedId(other) === c.otherMetadata().cstr),\n )\n ) {\n fail(`${other} cannot be set as '${this.field.fieldName}' on ${this.entity}`);\n }\n\n // we may not be loaded yet, but our previous entity might already be in the UoW\n const previousLoaded = this.loaded ?? this.maybeFindExisting();\n\n ensureNotDeleted(this.entity, \"pending\");\n\n // Keep the entity when its tagged id cannot distinguish between sibling subtypes.\n if (isEntity(other)) {\n const otherMeta = getMetadata(other);\n const hasComponentsWithSameBaseType =\n otherMeta.baseType &&\n this.field.components.some(\n (component) =>\n component.otherMetadata().baseType === otherMeta.baseType &&\n !(other instanceof component.otherMetadata().cstr),\n );\n setField(\n this.entity,\n this.fieldName,\n other.isNewEntity || hasComponentsWithSameBaseType ? other : other.idTagged,\n );\n } else {\n setField(this.entity, this.fieldName, other);\n }\n\n if (typeof other === \"string\") {\n this.loaded = undefined;\n this._isLoaded = false;\n } else {\n this.loaded = other;\n this._isLoaded = true;\n }\n\n // If had an existing value, remove us from its collection\n if (previousLoaded) {\n const prevRelation = this.getOtherRelation(previousLoaded);\n if (prevRelation instanceof OneToManyCollection) {\n prevRelation.removeIfLoaded(this.entity);\n } else {\n prevRelation.set(undefined as any);\n }\n }\n if (other !== undefined && isEntity(other)) {\n const newRelation = this.getOtherRelation(other);\n if (newRelation instanceof OneToManyCollection) {\n newRelation.add(this.entity);\n } else {\n newRelation.set(this.entity);\n }\n }\n }\n\n // We need to keep U in data[fieldName] to handle entities without an id assigned yet.\n current(opts?: { withDeleted?: boolean }): U | TaggedId | N {\n const current = getField(this.entity, this.fieldName);\n if (current !== undefined && isEntity(current)) {\n return this.filterDeleted(current as U, opts);\n }\n return current;\n }\n\n public toString(): string {\n return `PolymorphicReference(entity: ${this.entity}, fieldName: ${\n this.fieldName\n }, otherType: ${this.currentComponent?.otherMetadata().type}, otherFieldName: ${\n this.currentComponent?.otherFieldName\n }, id: ${this.id})`;\n }\n\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : (undefined as N);\n }\n\n /** Returns the other relation that points back at us, i.e. we're `comment.parent_book_id` and this is `Book.comments`. */\n private getOtherRelation(other: U): OneToManyCollection<U, T> | OneToOneReference<U, T> {\n const component = this.field.components.find((c) => other instanceof c.otherMetadata().cstr) as any;\n return (other as U)[component?.otherFieldName as keyof U] as any;\n }\n\n private maybeFindExisting(): U | undefined {\n return this.idTaggedMaybe !== undefined ? (this.entity.em.getEntity(this.idTagged) as U) : undefined;\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PropertySymbols.d.cts","names":[],"sources":["../../src/relations/PropertySymbols.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"PropertySymbols.d.cts","names":[],"sources":["../../src/relations/PropertySymbols.ts"],"mappings":";qBAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PropertySymbols.d.mts","names":[],"sources":["../../src/relations/PropertySymbols.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"PropertySymbols.d.mts","names":[],"sources":["../../src/relations/PropertySymbols.ts"],"mappings":";qBAAa"}
|