joist-core 2.3.0-next.97 → 2.3.0-next.99
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.cjs.map +1 -1
- package/build/BaseEntity.js.map +1 -1
- package/build/Entity.cjs.map +1 -1
- package/build/Entity.js.map +1 -1
- package/build/EntityManager.cjs +45 -46
- package/build/EntityManager.cjs.map +1 -1
- package/build/EntityManager.d.cts +7 -7
- package/build/EntityManager.d.cts.map +1 -1
- package/build/EntityManager.d.mts +7 -7
- package/build/EntityManager.d.mts.map +1 -1
- package/build/EntityManager.js +27 -28
- package/build/EntityManager.js.map +1 -1
- package/build/EntityMetadata.cjs +0 -2
- package/build/EntityMetadata.cjs.map +1 -1
- package/build/EntityMetadata.d.cts +3 -3
- package/build/EntityMetadata.d.mts +3 -3
- package/build/EntityMetadata.js +0 -2
- package/build/EntityMetadata.js.map +1 -1
- package/build/IndexManager.cjs +1 -1
- package/build/IndexManager.cjs.map +1 -1
- package/build/IndexManager.js +1 -1
- package/build/IndexManager.js.map +1 -1
- package/build/InstanceData.cjs.map +1 -1
- package/build/InstanceData.js.map +1 -1
- package/build/PluginManager.cjs +0 -1
- package/build/PluginManager.cjs.map +1 -1
- package/build/PluginManager.d.cts +1 -1
- package/build/PluginManager.d.mts +1 -1
- package/build/PluginManager.js +0 -1
- package/build/PluginManager.js.map +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.cjs +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.cjs.map +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.cts +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.mts +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.js +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.js.map +1 -1
- package/build/batchloaders/loadBatchLoader.cjs +3 -4
- package/build/batchloaders/loadBatchLoader.cjs.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.cts +1 -1
- package/build/batchloaders/loadBatchLoader.d.mts +1 -1
- package/build/batchloaders/loadBatchLoader.js +2 -3
- package/build/batchloaders/loadBatchLoader.js.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.cjs +1 -1
- package/build/batchloaders/manyToManyBatchLoader.cjs.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.d.cts +1 -1
- package/build/batchloaders/manyToManyBatchLoader.d.mts +1 -1
- package/build/batchloaders/manyToManyBatchLoader.js +1 -1
- package/build/batchloaders/manyToManyBatchLoader.js.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.cjs +1 -1
- package/build/batchloaders/oneToManyBatchLoader.cjs.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.js +1 -1
- package/build/batchloaders/oneToManyBatchLoader.js.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.cjs +1 -1
- package/build/batchloaders/oneToOneBatchLoader.cjs.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.js +1 -1
- package/build/batchloaders/oneToOneBatchLoader.js.map +1 -1
- package/build/batchloaders/populateBatchLoader.cjs +11 -12
- package/build/batchloaders/populateBatchLoader.cjs.map +1 -1
- package/build/batchloaders/populateBatchLoader.d.cts +1 -1
- package/build/batchloaders/populateBatchLoader.d.mts +1 -1
- package/build/batchloaders/populateBatchLoader.js +7 -8
- package/build/batchloaders/populateBatchLoader.js.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.cjs +2 -2
- package/build/batchloaders/recursiveChildrenBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.js +2 -2
- package/build/batchloaders/recursiveChildrenBatchLoader.js.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.cjs +2 -2
- package/build/batchloaders/recursiveM2mBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.js +2 -2
- package/build/batchloaders/recursiveM2mBatchLoader.js.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.cjs +2 -2
- package/build/batchloaders/recursiveParentsBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.js +2 -2
- package/build/batchloaders/recursiveParentsBatchLoader.js.map +1 -1
- package/build/changes.cjs +2 -3
- package/build/changes.cjs.map +1 -1
- package/build/changes.js +2 -3
- package/build/changes.js.map +1 -1
- package/build/config.cjs +3 -3
- package/build/config.cjs.map +1 -1
- package/build/config.d.cts +2 -2
- package/build/config.d.mts +2 -2
- package/build/config.js +1 -1
- package/build/config.js.map +1 -1
- package/build/configure.cjs +10 -10
- package/build/configure.cjs.map +1 -1
- package/build/configure.js +5 -5
- package/build/configure.js.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.cjs +8 -8
- package/build/dataloaders/fastWhereFilterHash.cjs.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.d.cts.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.d.mts.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.js +3 -3
- package/build/dataloaders/fastWhereFilterHash.js.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.cjs.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.js.map +1 -1
- package/build/dataloaders/findCountDataLoader.cjs +2 -2
- package/build/dataloaders/findCountDataLoader.cjs.map +1 -1
- package/build/dataloaders/findCountDataLoader.js +1 -1
- package/build/dataloaders/findCountDataLoader.js.map +1 -1
- package/build/dataloaders/findDataLoader.cjs +6 -6
- package/build/dataloaders/findDataLoader.cjs.map +1 -1
- package/build/dataloaders/findDataLoader.d.cts +1 -1
- package/build/dataloaders/findDataLoader.d.mts +1 -1
- package/build/dataloaders/findDataLoader.js +3 -3
- package/build/dataloaders/findDataLoader.js.map +1 -1
- package/build/dataloaders/findIdsDataLoader.cjs +3 -3
- package/build/dataloaders/findIdsDataLoader.cjs.map +1 -1
- package/build/dataloaders/findIdsDataLoader.js +2 -2
- package/build/dataloaders/findIdsDataLoader.js.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.cjs +1 -1
- package/build/dataloaders/findOrCreateDataLoader.cjs.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.js +1 -1
- package/build/dataloaders/findOrCreateDataLoader.js.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.cjs +6 -6
- package/build/dataloaders/findPaginatedDataLoader.cjs.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.cts +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.mts +1 -1
- package/build/dataloaders/findPaginatedDataLoader.js +3 -3
- package/build/dataloaders/findPaginatedDataLoader.js.map +1 -1
- package/build/dataloaders/lensDataLoader.cjs +3 -3
- package/build/dataloaders/lensDataLoader.cjs.map +1 -1
- package/build/dataloaders/lensDataLoader.d.cts.map +1 -1
- package/build/dataloaders/lensDataLoader.d.mts.map +1 -1
- package/build/dataloaders/lensDataLoader.js +2 -2
- package/build/dataloaders/lensDataLoader.js.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.cjs +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.cjs.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.js +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.js.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.cjs +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.cjs.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.js +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.js.map +1 -1
- package/build/defaults.cjs +5 -5
- package/build/defaults.cjs.map +1 -1
- package/build/defaults.d.cts +1 -1
- package/build/defaults.d.cts.map +1 -1
- package/build/defaults.d.mts +1 -1
- package/build/defaults.d.mts.map +1 -1
- package/build/defaults.js +4 -4
- package/build/defaults.js.map +1 -1
- package/build/drivers/Driver.cjs +0 -1
- package/build/drivers/Driver.d.cts +1 -1
- package/build/drivers/Driver.d.mts +1 -1
- package/build/drivers/Driver.js +0 -1
- package/build/drivers/EntityWriter.cjs +6 -7
- package/build/drivers/EntityWriter.cjs.map +1 -1
- package/build/drivers/EntityWriter.d.cts +1 -1
- package/build/drivers/EntityWriter.d.mts +1 -1
- package/build/drivers/EntityWriter.js +2 -3
- package/build/drivers/EntityWriter.js.map +1 -1
- package/build/drivers/IdAssigner.cjs +0 -1
- package/build/drivers/IdAssigner.cjs.map +1 -1
- package/build/drivers/IdAssigner.d.cts +1 -1
- package/build/drivers/IdAssigner.d.mts +1 -1
- package/build/drivers/IdAssigner.js +0 -1
- package/build/drivers/IdAssigner.js.map +1 -1
- package/build/drivers/driverApi.cjs +19 -0
- package/build/drivers/driverApi.cjs.map +1 -0
- package/build/drivers/driverApi.d.cts +22 -0
- package/build/drivers/driverApi.d.cts.map +1 -0
- package/build/drivers/driverApi.d.mts +22 -0
- package/build/drivers/driverApi.d.mts.map +1 -0
- package/build/drivers/driverApi.js +18 -0
- package/build/drivers/driverApi.js.map +1 -0
- package/build/fields.cjs +3 -3
- package/build/fields.cjs.map +1 -1
- package/build/fields.js +2 -2
- package/build/fields.js.map +1 -1
- package/build/{FlushLock.cjs → flush/FlushLock.cjs} +1 -1
- package/build/flush/FlushLock.cjs.map +1 -0
- package/build/{FlushLock.d.cts → flush/FlushLock.d.cts} +1 -1
- package/build/flush/FlushLock.d.cts.map +1 -0
- package/build/{FlushLock.d.mts → flush/FlushLock.d.mts} +1 -1
- package/build/flush/FlushLock.d.mts.map +1 -0
- package/build/{FlushLock.js → flush/FlushLock.js} +1 -1
- package/build/flush/FlushLock.js.map +1 -0
- package/build/{JoinRows.cjs → flush/JoinRows.cjs} +5 -8
- package/build/flush/JoinRows.cjs.map +1 -0
- package/build/{JoinRows.d.cts → flush/JoinRows.d.cts} +5 -5
- package/build/flush/JoinRows.d.cts.map +1 -0
- package/build/{JoinRows.d.mts → flush/JoinRows.d.mts} +5 -5
- package/build/flush/JoinRows.d.mts.map +1 -0
- package/build/{JoinRows.js → flush/JoinRows.js} +5 -8
- package/build/flush/JoinRows.js.map +1 -0
- package/build/{PendingChanges.cjs → flush/PendingChanges.cjs} +0 -1
- package/build/{PendingChanges.d.cts → flush/PendingChanges.d.cts} +2 -2
- package/build/flush/PendingChanges.d.cts.map +1 -0
- package/build/{PendingChanges.d.mts → flush/PendingChanges.d.mts} +2 -2
- package/build/flush/PendingChanges.d.mts.map +1 -0
- package/build/flush/PendingChanges.js +1 -0
- package/build/{Todo.cjs → flush/Todo.cjs} +4 -6
- package/build/flush/Todo.cjs.map +1 -0
- package/build/{Todo.d.cts → flush/Todo.d.cts} +3 -3
- package/build/flush/Todo.d.cts.map +1 -0
- package/build/{Todo.d.mts → flush/Todo.d.mts} +3 -3
- package/build/flush/Todo.d.mts.map +1 -0
- package/build/{Todo.js → flush/Todo.js} +4 -6
- package/build/flush/Todo.js.map +1 -0
- package/build/getProperties.cjs.map +1 -1
- package/build/getProperties.js.map +1 -1
- package/build/index.cjs +100 -100
- package/build/index.cjs.map +1 -1
- package/build/index.d.cts +15 -15
- package/build/index.d.mts +15 -15
- package/build/index.js +42 -42
- package/build/index.js.map +1 -1
- package/build/json.cjs +4 -4
- package/build/json.cjs.map +1 -1
- package/build/json.js +3 -3
- package/build/json.js.map +1 -1
- package/build/keys.cjs +1 -1
- package/build/keys.cjs.map +1 -1
- package/build/keys.js +1 -1
- package/build/keys.js.map +1 -1
- package/build/{HintTree.cjs → loading/HintTree.cjs} +2 -5
- package/build/loading/HintTree.cjs.map +1 -0
- package/build/{HintTree.d.cts → loading/HintTree.d.cts} +3 -3
- package/build/loading/HintTree.d.cts.map +1 -0
- package/build/{HintTree.d.mts → loading/HintTree.d.mts} +3 -3
- package/build/loading/HintTree.d.mts.map +1 -0
- package/build/{HintTree.js → loading/HintTree.js} +2 -5
- package/build/loading/HintTree.js.map +1 -0
- package/build/{IsLoadedCache.cjs → loading/IsLoadedCache.cjs} +2 -3
- package/build/loading/IsLoadedCache.cjs.map +1 -0
- package/build/{IsLoadedCache.d.cts → loading/IsLoadedCache.d.cts} +2 -2
- package/build/loading/IsLoadedCache.d.cts.map +1 -0
- package/build/{IsLoadedCache.d.mts → loading/IsLoadedCache.d.mts} +2 -2
- package/build/loading/IsLoadedCache.d.mts.map +1 -0
- package/build/{IsLoadedCache.js → loading/IsLoadedCache.js} +2 -3
- package/build/{IsLoadedCache.cjs.map → loading/IsLoadedCache.js.map} +1 -1
- package/build/{loadHints.cjs → loading/loadHints.cjs} +6 -11
- package/build/loading/loadHints.cjs.map +1 -0
- package/build/{loadHints.d.cts → loading/loadHints.d.cts} +14 -14
- package/build/loading/loadHints.d.cts.map +1 -0
- package/build/{loadHints.d.mts → loading/loadHints.d.mts} +14 -14
- package/build/loading/loadHints.d.mts.map +1 -0
- package/build/{loadHints.js → loading/loadHints.js} +3 -8
- package/build/loading/loadHints.js.map +1 -0
- package/build/{loadLens.cjs → loading/loadLens.cjs} +8 -9
- package/build/loading/loadLens.cjs.map +1 -0
- package/build/{loadLens.d.cts → loading/loadLens.d.cts} +3 -3
- package/build/loading/loadLens.d.cts.map +1 -0
- package/build/{loadLens.d.mts → loading/loadLens.d.mts} +3 -3
- package/build/loading/loadLens.d.mts.map +1 -0
- package/build/{loadLens.js → loading/loadLens.js} +8 -9
- package/build/loading/loadLens.js.map +1 -0
- package/build/{withLoaded.cjs → loading/withLoaded.cjs} +12 -13
- package/build/loading/withLoaded.cjs.map +1 -0
- package/build/{withLoaded.d.cts → loading/withLoaded.d.cts} +9 -9
- package/build/loading/withLoaded.d.cts.map +1 -0
- package/build/{withLoaded.d.mts → loading/withLoaded.d.mts} +9 -9
- package/build/loading/withLoaded.d.mts.map +1 -0
- package/build/{withLoaded.js → loading/withLoaded.js} +10 -11
- package/build/loading/withLoaded.js.map +1 -0
- package/build/logging/FactoryLogger.cjs.map +1 -1
- package/build/logging/FactoryLogger.d.cts.map +1 -1
- package/build/logging/FactoryLogger.d.mts.map +1 -1
- package/build/logging/FactoryLogger.js.map +1 -1
- package/build/logging/FieldLogger.cjs.map +1 -1
- package/build/logging/FieldLogger.d.cts.map +1 -1
- package/build/logging/FieldLogger.d.mts.map +1 -1
- package/build/logging/FieldLogger.js.map +1 -1
- package/build/logging/ReactionLogger.cjs +0 -2
- package/build/logging/ReactionLogger.cjs.map +1 -1
- package/build/logging/ReactionLogger.d.cts +2 -2
- package/build/logging/ReactionLogger.d.cts.map +1 -1
- package/build/logging/ReactionLogger.d.mts +2 -2
- package/build/logging/ReactionLogger.d.mts.map +1 -1
- package/build/logging/ReactionLogger.js +0 -2
- package/build/logging/ReactionLogger.js.map +1 -1
- package/build/newEntity.cjs.map +1 -1
- package/build/newEntity.js.map +1 -1
- package/build/newTestInstance.cjs +3 -3
- package/build/newTestInstance.cjs.map +1 -1
- package/build/newTestInstance.d.cts +1 -1
- package/build/newTestInstance.d.cts.map +1 -1
- package/build/newTestInstance.d.mts +1 -1
- package/build/newTestInstance.d.mts.map +1 -1
- package/build/newTestInstance.js +2 -2
- package/build/newTestInstance.js.map +1 -1
- package/build/normalizeHints.cjs +0 -2
- package/build/normalizeHints.cjs.map +1 -1
- package/build/normalizeHints.d.cts +2 -2
- package/build/normalizeHints.d.mts +2 -2
- package/build/normalizeHints.js +0 -2
- package/build/normalizeHints.js.map +1 -1
- package/build/nowUTC.cjs +2 -2
- package/build/nowUTC.cjs.map +1 -1
- package/build/nowUTC.d.cts +1 -1
- package/build/nowUTC.d.mts +1 -1
- package/build/nowUTC.js +1 -1
- package/build/nowUTC.js.map +1 -1
- package/build/plugins/ImmutableEntitiesPlugin.cjs.map +1 -1
- package/build/plugins/ImmutableEntitiesPlugin.js.map +1 -1
- package/build/plugins/PreloadPlugin.cjs +0 -2
- package/build/plugins/PreloadPlugin.d.cts +2 -2
- package/build/plugins/PreloadPlugin.d.mts +2 -2
- package/build/plugins/PreloadPlugin.js +0 -2
- package/build/preloading/JsonAggregatePreloader.cjs +1 -4
- package/build/preloading/JsonAggregatePreloader.cjs.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.cts +2 -2
- package/build/preloading/JsonAggregatePreloader.d.cts.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.mts +2 -2
- package/build/preloading/JsonAggregatePreloader.d.mts.map +1 -1
- package/build/preloading/JsonAggregatePreloader.js +1 -4
- package/build/preloading/JsonAggregatePreloader.js.map +1 -1
- package/build/preloading/canPreload.cjs.map +1 -1
- package/build/preloading/canPreload.js.map +1 -1
- package/build/preloading/partitionHint.cjs +2 -3
- package/build/preloading/partitionHint.cjs.map +1 -1
- package/build/preloading/partitionHint.d.cts +1 -1
- package/build/preloading/partitionHint.d.mts +1 -1
- package/build/preloading/partitionHint.js +2 -3
- package/build/preloading/partitionHint.js.map +1 -1
- package/build/queries/ConditionBuilder.cjs.map +1 -1
- package/build/queries/ConditionBuilder.d.cts +1 -1
- package/build/queries/ConditionBuilder.d.mts +1 -1
- package/build/queries/ConditionBuilder.js.map +1 -1
- package/build/queries/conditions.cjs.map +1 -1
- package/build/queries/conditions.js.map +1 -1
- package/build/queries/entityQueryUtils.cjs.map +1 -1
- package/build/queries/entityQueryUtils.js.map +1 -1
- package/build/queries/find/Aliases.cjs +1 -1
- package/build/queries/find/Aliases.cjs.map +1 -1
- package/build/queries/find/Aliases.d.cts.map +1 -1
- package/build/queries/find/Aliases.d.mts.map +1 -1
- package/build/queries/find/Aliases.js +1 -1
- package/build/queries/find/Aliases.js.map +1 -1
- package/build/queries/find/DeferredAlias.cjs.map +1 -1
- package/build/queries/find/DeferredAlias.js.map +1 -1
- package/build/queries/find/EntityFilter.cjs.map +1 -1
- package/build/queries/find/EntityFilter.js.map +1 -1
- package/build/queries/find/EntityGraphQLFilter.cjs.map +1 -1
- package/build/queries/find/EntityGraphQLFilter.js.map +1 -1
- package/build/queries/find/QueryParser.cjs +2 -2
- package/build/queries/find/QueryParser.cjs.map +1 -1
- package/build/queries/find/QueryParser.collectionJoins.cjs.map +1 -1
- package/build/queries/find/QueryParser.collectionJoins.js.map +1 -1
- package/build/queries/find/QueryParser.d.cts.map +1 -1
- package/build/queries/find/QueryParser.d.mts.map +1 -1
- package/build/queries/find/QueryParser.js +2 -2
- package/build/queries/find/QueryParser.js.map +1 -1
- package/build/queries/find/QueryParser.pruning.cjs.map +1 -1
- package/build/queries/find/QueryParser.pruning.js.map +1 -1
- package/build/queries/find/QueryVisitor.cjs.map +1 -1
- package/build/queries/find/QueryVisitor.js.map +1 -1
- package/build/queries/find/buildFindQuery.cjs.map +1 -1
- package/build/queries/find/buildFindQuery.js.map +1 -1
- package/build/queries/find/scopes.cjs.map +1 -1
- package/build/queries/find/scopes.d.cts +1 -1
- package/build/queries/find/scopes.d.mts +1 -1
- package/build/queries/find/scopes.js.map +1 -1
- package/build/queries/parsedConditions.cjs.map +1 -1
- package/build/queries/parsedConditions.js.map +1 -1
- package/build/queries/renderConditions.cjs.map +1 -1
- package/build/queries/renderConditions.js.map +1 -1
- package/build/queries/skipCondition.cjs.map +1 -1
- package/build/queries/skipCondition.js.map +1 -1
- package/build/queries/sql/AliasAssigner.cjs.map +1 -1
- package/build/queries/sql/AliasAssigner.js.map +1 -1
- package/build/queries/sql/Expr.cjs +2 -2
- package/build/queries/sql/Expr.cjs.map +1 -1
- package/build/queries/sql/Expr.d.cts +1 -1
- package/build/queries/sql/Expr.d.mts +1 -1
- package/build/queries/sql/Expr.js +1 -1
- package/build/queries/sql/Expr.js.map +1 -1
- package/build/queries/sql/Tables.cjs +1 -1
- package/build/queries/sql/Tables.cjs.map +1 -1
- package/build/queries/sql/Tables.d.cts.map +1 -1
- package/build/queries/sql/Tables.d.mts.map +1 -1
- package/build/queries/sql/Tables.js +1 -1
- package/build/queries/sql/Tables.js.map +1 -1
- package/build/queries/sql/execute.cjs +1 -1
- package/build/queries/sql/execute.cjs.map +1 -1
- package/build/queries/sql/execute.js +1 -1
- package/build/queries/sql/execute.js.map +1 -1
- package/build/queries/sql/expressions/arrayAgg.cjs.map +1 -1
- package/build/queries/sql/expressions/arrayAgg.js.map +1 -1
- package/build/queries/sql/expressions/case.cjs.map +1 -1
- package/build/queries/sql/expressions/case.js.map +1 -1
- package/build/queries/sql/expressions/coalesce.cjs.map +1 -1
- package/build/queries/sql/expressions/coalesce.js.map +1 -1
- package/build/queries/sql/expressions/codecs.cjs +2 -2
- package/build/queries/sql/expressions/codecs.cjs.map +1 -1
- package/build/queries/sql/expressions/codecs.js +1 -1
- package/build/queries/sql/expressions/codecs.js.map +1 -1
- package/build/queries/sql/expressions/expression.cjs.map +1 -1
- package/build/queries/sql/expressions/expression.d.cts.map +1 -1
- package/build/queries/sql/expressions/expression.d.mts.map +1 -1
- package/build/queries/sql/expressions/expression.js.map +1 -1
- package/build/queries/sql/expressions/greatest.cjs.map +1 -1
- package/build/queries/sql/expressions/greatest.js.map +1 -1
- package/build/queries/sql/expressions/least.cjs.map +1 -1
- package/build/queries/sql/expressions/least.js.map +1 -1
- package/build/queries/sql/expressions/nullIf.cjs.map +1 -1
- package/build/queries/sql/expressions/nullIf.js.map +1 -1
- package/build/queries/sql/expressions/parseExpression.cjs.map +1 -1
- package/build/queries/sql/expressions/parseExpression.js.map +1 -1
- package/build/queries/sql/expressions/types.d.cts.map +1 -1
- package/build/queries/sql/expressions/types.d.mts.map +1 -1
- package/build/queries/sql/query.cjs +1 -1
- package/build/queries/sql/query.cjs.map +1 -1
- package/build/queries/sql/query.d.cts +1 -1
- package/build/queries/sql/query.d.mts +1 -1
- package/build/queries/sql/query.js +1 -1
- package/build/queries/sql/query.js.map +1 -1
- package/build/{unnest.cjs → queries/unnest.cjs} +1 -2
- package/build/queries/unnest.cjs.map +1 -0
- package/build/{unnest.d.cts → queries/unnest.d.cts} +3 -3
- package/build/queries/unnest.d.cts.map +1 -0
- package/build/{unnest.d.mts → queries/unnest.d.mts} +3 -3
- package/build/queries/unnest.d.mts.map +1 -0
- package/build/{unnest.js → queries/unnest.js} +1 -2
- package/build/queries/unnest.js.map +1 -0
- package/build/queries/valueFilters.cjs.map +1 -1
- package/build/queries/valueFilters.d.cts +1 -1
- package/build/queries/valueFilters.d.cts.map +1 -1
- package/build/queries/valueFilters.d.mts +1 -1
- package/build/queries/valueFilters.d.mts.map +1 -1
- package/build/queries/valueFilters.js.map +1 -1
- package/build/{ReactionsManager.cjs → reactivity/ReactionsManager.cjs} +8 -10
- package/build/reactivity/ReactionsManager.cjs.map +1 -0
- package/build/{ReactionsManager.d.cts → reactivity/ReactionsManager.d.cts} +5 -6
- package/build/reactivity/ReactionsManager.d.cts.map +1 -0
- package/build/{ReactionsManager.d.mts → reactivity/ReactionsManager.d.mts} +5 -6
- package/build/reactivity/ReactionsManager.d.mts.map +1 -0
- package/build/{ReactionsManager.js → reactivity/ReactionsManager.js} +6 -8
- package/build/reactivity/ReactionsManager.js.map +1 -0
- package/build/{reactiveHints.cjs → reactivity/reactiveHints.cjs} +12 -16
- package/build/reactivity/reactiveHints.cjs.map +1 -0
- package/build/{reactiveHints.d.cts → reactivity/reactiveHints.d.cts} +17 -17
- package/build/reactivity/reactiveHints.d.cts.map +1 -0
- package/build/{reactiveHints.d.mts → reactivity/reactiveHints.d.mts} +17 -17
- package/build/reactivity/reactiveHints.d.mts.map +1 -0
- package/build/{reactiveHints.js → reactivity/reactiveHints.js} +12 -16
- package/build/reactivity/reactiveHints.js.map +1 -0
- package/build/relations/AbstractRelationImpl.cjs.map +1 -1
- package/build/relations/AbstractRelationImpl.js.map +1 -1
- package/build/relations/AsyncProperty.cjs.map +1 -1
- package/build/relations/AsyncProperty.js.map +1 -1
- package/build/relations/AsyncReactiveField.cjs +6 -6
- package/build/relations/AsyncReactiveField.cjs.map +1 -1
- package/build/relations/AsyncReactiveField.d.cts +1 -1
- package/build/relations/AsyncReactiveField.d.mts +1 -1
- package/build/relations/AsyncReactiveField.js +4 -4
- package/build/relations/AsyncReactiveField.js.map +1 -1
- package/build/relations/Collection.cjs +1 -1
- package/build/relations/Collection.cjs.map +1 -1
- package/build/relations/Collection.js +1 -1
- package/build/relations/Collection.js.map +1 -1
- package/build/relations/CustomCollection.cjs.map +1 -1
- package/build/relations/CustomCollection.d.cts +1 -1
- package/build/relations/CustomCollection.d.mts +1 -1
- package/build/relations/CustomCollection.js.map +1 -1
- package/build/relations/CustomReference.cjs +1 -1
- package/build/relations/CustomReference.cjs.map +1 -1
- package/build/relations/CustomReference.d.cts +1 -1
- package/build/relations/CustomReference.d.mts +1 -1
- package/build/relations/CustomReference.js +1 -1
- package/build/relations/CustomReference.js.map +1 -1
- package/build/relations/EnumCollection.cjs.map +1 -1
- package/build/relations/EnumCollection.d.cts +1 -1
- package/build/relations/EnumCollection.d.mts +1 -1
- package/build/relations/EnumCollection.js.map +1 -1
- package/build/relations/LazyField.cjs +4 -4
- package/build/relations/LazyField.cjs.map +1 -1
- package/build/relations/LazyField.js +4 -4
- package/build/relations/LazyField.js.map +1 -1
- package/build/relations/ManyToManyCollection.cjs +3 -3
- package/build/relations/ManyToManyCollection.cjs.map +1 -1
- package/build/relations/ManyToManyCollection.js +3 -3
- package/build/relations/ManyToManyCollection.js.map +1 -1
- package/build/relations/ManyToManyLargeCollection.cjs +3 -3
- package/build/relations/ManyToManyLargeCollection.cjs.map +1 -1
- package/build/relations/ManyToManyLargeCollection.js +3 -3
- package/build/relations/ManyToManyLargeCollection.js.map +1 -1
- package/build/relations/ManyToOneReference.cjs +4 -4
- package/build/relations/ManyToOneReference.cjs.map +1 -1
- package/build/relations/ManyToOneReference.js +4 -4
- package/build/relations/ManyToOneReference.js.map +1 -1
- package/build/relations/OneToManyCollection.cjs +1 -2
- package/build/relations/OneToManyCollection.cjs.map +1 -1
- package/build/relations/OneToManyCollection.d.cts +1 -1
- package/build/relations/OneToManyCollection.d.mts +1 -1
- package/build/relations/OneToManyCollection.js +1 -2
- package/build/relations/OneToManyCollection.js.map +1 -1
- package/build/relations/OneToManyLargeCollection.cjs +1 -1
- package/build/relations/OneToManyLargeCollection.cjs.map +1 -1
- package/build/relations/OneToManyLargeCollection.js +1 -1
- package/build/relations/OneToManyLargeCollection.js.map +1 -1
- package/build/relations/OneToOneReference.cjs +5 -5
- package/build/relations/OneToOneReference.cjs.map +1 -1
- package/build/relations/OneToOneReference.js +5 -5
- package/build/relations/OneToOneReference.js.map +1 -1
- package/build/relations/PolymorphicReference.cjs +3 -3
- package/build/relations/PolymorphicReference.cjs.map +1 -1
- package/build/relations/PolymorphicReference.js +3 -3
- package/build/relations/PolymorphicReference.js.map +1 -1
- package/build/relations/ReactiveField.cjs +5 -6
- package/build/relations/ReactiveField.cjs.map +1 -1
- package/build/relations/ReactiveField.d.cts +2 -2
- package/build/relations/ReactiveField.d.mts +2 -2
- package/build/relations/ReactiveField.js +3 -4
- package/build/relations/ReactiveField.js.map +1 -1
- package/build/relations/ReactiveGetter.cjs +0 -1
- package/build/relations/ReactiveGetter.cjs.map +1 -1
- package/build/relations/ReactiveGetter.d.cts +1 -1
- package/build/relations/ReactiveGetter.d.mts +1 -1
- package/build/relations/ReactiveGetter.js +0 -1
- package/build/relations/ReactiveGetter.js.map +1 -1
- package/build/relations/ReactiveManyToMany.cjs +5 -6
- package/build/relations/ReactiveManyToMany.cjs.map +1 -1
- package/build/relations/ReactiveManyToMany.d.cts +2 -2
- package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
- package/build/relations/ReactiveManyToMany.d.mts +2 -2
- package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
- package/build/relations/ReactiveManyToMany.js +3 -4
- package/build/relations/ReactiveManyToMany.js.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.cjs +1 -3
- package/build/relations/ReactiveManyToManyOtherSide.cjs.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.d.cts +2 -2
- package/build/relations/ReactiveManyToManyOtherSide.d.mts +2 -2
- package/build/relations/ReactiveManyToManyOtherSide.js +1 -3
- package/build/relations/ReactiveManyToManyOtherSide.js.map +1 -1
- package/build/relations/ReactiveReference.cjs +8 -9
- package/build/relations/ReactiveReference.cjs.map +1 -1
- package/build/relations/ReactiveReference.d.cts +2 -2
- package/build/relations/ReactiveReference.d.cts.map +1 -1
- package/build/relations/ReactiveReference.d.mts +2 -2
- package/build/relations/ReactiveReference.d.mts.map +1 -1
- package/build/relations/ReactiveReference.js +6 -7
- package/build/relations/ReactiveReference.js.map +1 -1
- package/build/relations/ReadOnlyCollection.cjs.map +1 -1
- package/build/relations/ReadOnlyCollection.js.map +1 -1
- package/build/relations/RecursiveCollection.cjs +3 -4
- package/build/relations/RecursiveCollection.cjs.map +1 -1
- package/build/relations/RecursiveCollection.d.cts +1 -1
- package/build/relations/RecursiveCollection.d.mts +1 -1
- package/build/relations/RecursiveCollection.js +3 -4
- package/build/relations/RecursiveCollection.js.map +1 -1
- package/build/relations/RecursiveCycleError.cjs.map +1 -1
- package/build/relations/RecursiveCycleError.js.map +1 -1
- package/build/relations/Reference.cjs +1 -1
- package/build/relations/Reference.cjs.map +1 -1
- package/build/relations/Reference.js +1 -1
- package/build/relations/Reference.js.map +1 -1
- package/build/relations/Relation.cjs.map +1 -1
- package/build/relations/Relation.js.map +1 -1
- package/build/relations/hasAsyncMethod.cjs +2 -2
- package/build/relations/hasAsyncMethod.cjs.map +1 -1
- package/build/relations/hasAsyncMethod.d.cts +1 -1
- package/build/relations/hasAsyncMethod.d.mts +1 -1
- package/build/relations/hasAsyncMethod.js +1 -1
- package/build/relations/hasAsyncMethod.js.map +1 -1
- package/build/relations/hasManyDerived.cjs +3 -3
- package/build/relations/hasManyDerived.cjs.map +1 -1
- package/build/relations/hasManyDerived.d.cts +1 -1
- package/build/relations/hasManyDerived.d.mts +1 -1
- package/build/relations/hasManyDerived.js +2 -2
- package/build/relations/hasManyDerived.js.map +1 -1
- package/build/relations/hasManyThrough.cjs +6 -6
- package/build/relations/hasManyThrough.cjs.map +1 -1
- package/build/relations/hasManyThrough.d.cts +1 -1
- package/build/relations/hasManyThrough.d.mts +1 -1
- package/build/relations/hasManyThrough.js +2 -2
- package/build/relations/hasManyThrough.js.map +1 -1
- package/build/relations/hasOneDerived.cjs +3 -3
- package/build/relations/hasOneDerived.cjs.map +1 -1
- package/build/relations/hasOneDerived.d.cts +1 -1
- package/build/relations/hasOneDerived.d.mts +1 -1
- package/build/relations/hasOneDerived.js +2 -2
- package/build/relations/hasOneDerived.js.map +1 -1
- package/build/relations/hasOneThrough.cjs +7 -7
- package/build/relations/hasOneThrough.cjs.map +1 -1
- package/build/relations/hasOneThrough.d.cts +1 -1
- package/build/relations/hasOneThrough.d.mts +1 -1
- package/build/relations/hasOneThrough.js +2 -2
- package/build/relations/hasOneThrough.js.map +1 -1
- package/build/relations/hasProperty.cjs +4 -4
- package/build/relations/hasProperty.cjs.map +1 -1
- package/build/relations/hasProperty.d.cts +2 -2
- package/build/relations/hasProperty.d.mts +2 -2
- package/build/relations/hasProperty.js +2 -2
- package/build/relations/hasProperty.js.map +1 -1
- package/build/relations/index.cjs +10 -10
- package/build/relations/index.js +10 -10
- package/build/relations/isCascadeDelete.cjs.map +1 -1
- package/build/relations/isCascadeDelete.js.map +1 -1
- package/build/resurrection.cjs.map +1 -1
- package/build/resurrection.js.map +1 -1
- package/build/rules.cjs +3 -4
- package/build/rules.cjs.map +1 -1
- package/build/rules.d.cts +1 -1
- package/build/rules.d.mts +1 -1
- package/build/rules.js +3 -4
- package/build/rules.js.map +1 -1
- package/build/runtimeConfig.cjs.map +1 -1
- package/build/runtimeConfig.js.map +1 -1
- package/build/{TypeInfo.cjs → serde/TypeInfo.cjs} +1 -1
- package/build/serde/TypeInfo.cjs.map +1 -0
- package/build/{TypeInfo.d.cts → serde/TypeInfo.d.cts} +2 -2
- package/build/serde/TypeInfo.d.cts.map +1 -0
- package/build/{TypeInfo.d.mts → serde/TypeInfo.d.mts} +2 -2
- package/build/serde/TypeInfo.d.mts.map +1 -0
- package/build/{TypeInfo.js → serde/TypeInfo.js} +1 -1
- package/build/serde/TypeInfo.js.map +1 -0
- package/build/{columns.cjs → serde/columns.cjs} +1 -1
- package/build/serde/columns.cjs.map +1 -0
- package/build/{columns.d.cts → serde/columns.d.cts} +2 -2
- package/build/serde/columns.d.cts.map +1 -0
- package/build/{columns.d.mts → serde/columns.d.mts} +2 -2
- package/build/serde/columns.d.mts.map +1 -0
- package/build/{columns.js → serde/columns.js} +1 -1
- package/build/serde/columns.js.map +1 -0
- package/build/{fieldSerde.cjs → serde/fieldSerde.cjs} +6 -6
- package/build/serde/fieldSerde.cjs.map +1 -0
- package/build/{fieldSerde.d.cts → serde/fieldSerde.d.cts} +5 -5
- package/build/serde/fieldSerde.d.cts.map +1 -0
- package/build/{fieldSerde.d.mts → serde/fieldSerde.d.mts} +5 -5
- package/build/serde/fieldSerde.d.mts.map +1 -0
- package/build/{fieldSerde.js → serde/fieldSerde.js} +6 -6
- package/build/serde/fieldSerde.js.map +1 -0
- package/build/{serde.cjs → serde/serde.cjs} +25 -26
- package/build/serde/serde.cjs.map +1 -0
- package/build/{serde.d.cts → serde/serde.d.cts} +1 -1
- package/build/serde/serde.d.cts.map +1 -0
- package/build/{serde.d.mts → serde/serde.d.mts} +1 -1
- package/build/serde/serde.d.mts.map +1 -0
- package/build/{serde.js → serde/serde.js} +4 -5
- package/build/serde/serde.js.map +1 -0
- package/build/{temporal.cjs → serde/temporal.cjs} +1 -1
- package/build/serde/temporal.cjs.map +1 -0
- package/build/{temporal.d.cts → serde/temporal.d.cts} +1 -1
- package/build/serde/temporal.d.cts.map +1 -0
- package/build/{temporal.d.mts → serde/temporal.d.mts} +1 -1
- package/build/serde/temporal.d.mts.map +1 -0
- package/build/{temporal.js → serde/temporal.js} +1 -1
- package/build/serde/temporal.js.map +1 -0
- package/build/{temporalMappers.cjs → serde/temporalMappers.cjs} +4 -5
- package/build/serde/temporalMappers.cjs.map +1 -0
- package/build/{temporalMappers.d.cts → serde/temporalMappers.d.cts} +1 -1
- package/build/serde/temporalMappers.d.cts.map +1 -0
- package/build/{temporalMappers.d.mts → serde/temporalMappers.d.mts} +1 -1
- package/build/serde/temporalMappers.d.mts.map +1 -0
- package/build/{temporalMappers.js → serde/temporalMappers.js} +2 -3
- package/build/serde/temporalMappers.js.map +1 -0
- package/build/upsert.cjs +1 -1
- package/build/upsert.cjs.map +1 -1
- package/build/upsert.d.cts.map +1 -1
- package/build/upsert.d.mts.map +1 -1
- package/build/upsert.js +1 -1
- package/build/upsert.js.map +1 -1
- package/build/utils.cjs +0 -1
- package/build/utils.cjs.map +1 -1
- package/build/utils.d.cts +1 -1
- package/build/utils.d.mts +1 -1
- package/build/utils.js +0 -1
- package/build/utils.js.map +1 -1
- package/package.json +2 -2
- package/build/FlushLock.cjs.map +0 -1
- package/build/FlushLock.d.cts.map +0 -1
- package/build/FlushLock.d.mts.map +0 -1
- package/build/FlushLock.js.map +0 -1
- package/build/HintTree.cjs.map +0 -1
- package/build/HintTree.d.cts.map +0 -1
- package/build/HintTree.d.mts.map +0 -1
- package/build/HintTree.js.map +0 -1
- package/build/IsLoadedCache.d.cts.map +0 -1
- package/build/IsLoadedCache.d.mts.map +0 -1
- package/build/IsLoadedCache.js.map +0 -1
- package/build/JoinRows.cjs.map +0 -1
- package/build/JoinRows.d.cts.map +0 -1
- package/build/JoinRows.d.mts.map +0 -1
- package/build/JoinRows.js.map +0 -1
- package/build/PendingChanges.d.cts.map +0 -1
- package/build/PendingChanges.d.mts.map +0 -1
- package/build/PendingChanges.js +0 -2
- package/build/ReactionsManager.cjs.map +0 -1
- package/build/ReactionsManager.d.cts.map +0 -1
- package/build/ReactionsManager.d.mts.map +0 -1
- package/build/ReactionsManager.js.map +0 -1
- package/build/Todo.cjs.map +0 -1
- package/build/Todo.d.cts.map +0 -1
- package/build/Todo.d.mts.map +0 -1
- package/build/Todo.js.map +0 -1
- package/build/TypeInfo.cjs.map +0 -1
- package/build/TypeInfo.d.cts.map +0 -1
- package/build/TypeInfo.d.mts.map +0 -1
- package/build/TypeInfo.js.map +0 -1
- package/build/columns.cjs.map +0 -1
- package/build/columns.d.cts.map +0 -1
- package/build/columns.d.mts.map +0 -1
- package/build/columns.js.map +0 -1
- package/build/driverApi.cjs +0 -18
- package/build/driverApi.cjs.map +0 -1
- package/build/driverApi.d.cts +0 -22
- package/build/driverApi.d.cts.map +0 -1
- package/build/driverApi.d.mts +0 -22
- package/build/driverApi.d.mts.map +0 -1
- package/build/driverApi.js +0 -18
- package/build/driverApi.js.map +0 -1
- package/build/fieldSerde.cjs.map +0 -1
- package/build/fieldSerde.d.cts.map +0 -1
- package/build/fieldSerde.d.mts.map +0 -1
- package/build/fieldSerde.js.map +0 -1
- package/build/loadHints.cjs.map +0 -1
- package/build/loadHints.d.cts.map +0 -1
- package/build/loadHints.d.mts.map +0 -1
- package/build/loadHints.js.map +0 -1
- package/build/loadLens.cjs.map +0 -1
- package/build/loadLens.d.cts.map +0 -1
- package/build/loadLens.d.mts.map +0 -1
- package/build/loadLens.js.map +0 -1
- package/build/reactiveHints.cjs.map +0 -1
- package/build/reactiveHints.d.cts.map +0 -1
- package/build/reactiveHints.d.mts.map +0 -1
- package/build/reactiveHints.js.map +0 -1
- package/build/serde.cjs.map +0 -1
- package/build/serde.d.cts.map +0 -1
- package/build/serde.d.mts.map +0 -1
- package/build/serde.js.map +0 -1
- package/build/temporal.cjs.map +0 -1
- package/build/temporal.d.cts.map +0 -1
- package/build/temporal.d.mts.map +0 -1
- package/build/temporal.js.map +0 -1
- package/build/temporalMappers.cjs.map +0 -1
- package/build/temporalMappers.d.cts.map +0 -1
- package/build/temporalMappers.d.mts.map +0 -1
- package/build/temporalMappers.js.map +0 -1
- package/build/unnest.cjs.map +0 -1
- package/build/unnest.d.cts.map +0 -1
- package/build/unnest.d.mts.map +0 -1
- package/build/unnest.js.map +0 -1
- package/build/withLoaded.cjs.map +0 -1
- package/build/withLoaded.d.cts.map +0 -1
- package/build/withLoaded.d.mts.map +0 -1
- package/build/withLoaded.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LazyField.js","names":["#fieldName","#loaded","#loadPromise","#value"],"sources":["../../src/relations/LazyField.ts"],"sourcesContent":["import { getInstanceData } from \"
|
|
1
|
+
{"version":3,"file":"LazyField.js","names":["#fieldName","#loaded","#loadPromise","#value"],"sources":["../../src/relations/LazyField.ts"],"sourcesContent":["import { getInstanceData } from \"src/BaseEntity.ts\";\nimport { type BatchLoader } from \"src/batchloaders/BatchLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type EntityManager } from \"src/EntityManager.ts\";\nimport { type EntityMetadata, type PrimitiveField, getMetadata } from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport { keyToNumber, tagId } from \"src/keys.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport type { ParsedFindQuery } from \"src/queries/find/QueryParser.ts\";\nimport { kqDot } from \"src/queries/sql/keywords.ts\";\nimport { AbstractPropertyImpl } from \"src/relations/AbstractPropertyImpl.ts\";\nimport { type LoadedProperty, type Property } from \"src/relations/hasProperty.ts\";\nimport { PropertyT } from \"src/relations/PropertySymbols.ts\";\nimport { PojoRowData } from \"src/RowData.ts\";\nimport { abbreviation } from \"src/utils.ts\";\n\nexport const lazyColumnLoadOperation = \"lazy-column-load\";\n\n/**\n * The \"original value\" of an unloaded lazy column: unknown, and never equal to any set value.\n *\n * Seeded into `__orm.data` by `LazyFieldImpl.set` so that setting an unloaded column (even to\n * `undefined`) always registers as a change, i.e. instead of comparing equal to the `undefined`\n * that the excluded column would otherwise read as.\n */\nexport const notLoadedValue = Symbol(\"notLoadedValue\");\n\n/**\n * A single-column primitive (i.e. a large `jsonb`/`text`) that is deliberately excluded from the\n * entity's default SELECT and only fetched from the database on demand.\n *\n * I.e. `await author.someBigColumn.load()`, or synchronously via `.get` after `em.populate`.\n */\nexport interface LazyField<T extends Entity, V> extends Property<T, V> {\n load(opts?: { forceReload?: boolean }): Promise<V>;\n /** Sets the value in memory (dirtied for the next flush), i.e. without loading the current db value first. */\n set(value: V): void;\n}\n\n/** Creates a `LazyField` for a column that codegen has marked `lazy: true`. */\nexport function hasLazyField<T extends Entity, V>(): LazyField<T, V> {\n return lazyField((entity: T, fieldName: string) => new LazyFieldImpl<T, V>(entity, fieldName));\n}\n\nexport class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T> implements LazyField<T, V> {\n #fieldName: string;\n #loaded = false;\n #loadPromise: Promise<V> | undefined;\n\n constructor(entity: T, fieldName: string) {\n super(entity);\n this.#fieldName = fieldName;\n }\n\n /** Fetches this column from the database (batched across peers) and caches it on the entity. */\n load(opts?: { forceReload?: boolean }): Promise<V> {\n const { entity } = this;\n if (opts?.forceReload) {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n if (this.isLoaded) return Promise.resolve(this.#value);\n const meta = getMetadata(entity);\n return (this.#loadPromise ??= lazyColumnBatchLoader(entity.em, meta, this.#fieldName)\n .load(entity.idTagged)\n .then(() => {\n this.#loaded = true;\n return this.#value;\n }));\n }\n\n get get(): V {\n if (!this.isLoaded) {\n throw new Error(`${this.#fieldName} has not been loaded yet, use '.load()' or an 'em.populate' hint`);\n }\n return this.#value;\n }\n\n /** Sets the value in memory; the column is dirtied and written on the next `em.flush`. */\n set(value: V): void {\n if (this.isLoaded) {\n setField(this.entity, this.#fieldName, value);\n } else {\n // Seed `notLoadedValue` as the current value so the set always registers as a change against\n // the unknown db value: an unloaded column otherwise reads as `undefined`, which would make\n // `set(undefined)` a silent no-op, and a later `set(undefined)` falsely revert to clean.\n const { data } = getInstanceData(this.entity);\n data[this.#fieldName] = notLoadedValue;\n try {\n setField(this.entity, this.#fieldName, value);\n } catch (e) {\n // Don't leak the marker as a readable value, i.e. if setting on a deleted entity throws\n delete data[this.#fieldName];\n throw e;\n }\n }\n this.#loaded = true;\n }\n\n get isLoaded(): boolean {\n // New entities keep their value in-memory, so there's nothing to lazy-load.\n if (getInstanceData(this.entity).isOrWasNew) return true;\n return this.#loaded;\n }\n\n /** Called after em.flush to invalidate the cached value, since the db state may have changed. */\n resetAfterFlush(): void {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n\n /** The domain value, which `load`/`set` keep in the entity's `__orm.data` like any other column. */\n get #value(): V {\n return getInstanceData(this.entity).data[this.#fieldName] as V;\n }\n\n [PropertyT] = undefined as any as T;\n}\n\n/** Type guard utility for determining if an entity field is a LazyField. */\nexport function isLazyField(maybe: any): maybe is LazyField<any, any> {\n return maybe instanceof LazyFieldImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded LazyField. */\nexport function isLoadedLazyField(maybe: any): maybe is LazyField<any, any> & LoadedProperty<any, any> {\n return isLazyField(maybe) && maybe.isLoaded;\n}\n\n/** Batches `LazyField.load`s for the same column into a single `SELECT id, <column> ... WHERE id IN (...)`. */\nfunction lazyColumnBatchLoader(em: EntityManager, meta: EntityMetadata, fieldName: string): BatchLoader<string> {\n return em.getBatchLoader(lazyColumnLoadOperation, `${meta.tableName}-${fieldName}`, async (taggedIds) => {\n const field = meta.allFields[fieldName] as PrimitiveField;\n const column = field.serde.columns[0];\n const alias = abbreviation(meta.tableName);\n const keys = taggedIds.map((id) => keyToNumber(meta, id));\n const query: ParsedFindQuery = {\n selects: [`${kqDot(alias, \"id\")} as id`, kqDot(alias, column.columnName)],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: {\n kind: \"exp\",\n op: \"and\",\n conditions: [{ kind: \"column\", alias, column: \"id\", dbType: meta.idDbType, cond: { kind: \"in\", value: keys } }],\n },\n orderBys: [],\n };\n const rows = await em[\"executeFind\"](meta, lazyColumnLoadOperation, query, {});\n const rowData = new PojoRowData(rows);\n for (let i = 0; i < rows.length; i++) {\n const entity = em.findExistingInstance(tagId(meta, rows[i].id));\n if (entity) getInstanceData(entity).data[fieldName] = field.serde.fromRow(rowData, i);\n }\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_relations_AbstractRelationImpl = require("./AbstractRelationImpl.cjs");
|
|
3
3
|
const require_relations_RelationSymbols = require("./RelationSymbols.cjs");
|
|
4
|
+
const require_keys = require("../keys.cjs");
|
|
5
|
+
const require_batchloaders_manyToManyBatchLoader = require("../batchloaders/manyToManyBatchLoader.cjs");
|
|
6
|
+
const require_dataloaders_manyToManyFindDataLoader = require("../dataloaders/manyToManyFindDataLoader.cjs");
|
|
4
7
|
const require_relations_isCascadeDelete = require("./isCascadeDelete.cjs");
|
|
5
8
|
const require_utils = require("../utils.cjs");
|
|
6
9
|
const require_newEntity = require("../newEntity.cjs");
|
|
7
|
-
const require_batchloaders_manyToManyBatchLoader = require("../batchloaders/manyToManyBatchLoader.cjs");
|
|
8
|
-
const require_dataloaders_manyToManyFindDataLoader = require("../dataloaders/manyToManyFindDataLoader.cjs");
|
|
9
|
-
const require_keys = require("../keys.cjs");
|
|
10
10
|
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
11
11
|
const require_index = require("../index.cjs");
|
|
12
12
|
const require_EntityManager = require("../EntityManager.cjs");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManyToManyCollection.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","#field","getInstanceData","#state","#getPreloaded","#loadPromise","manyToManyBatchLoader","appendStack","manyToManyFindDataLoader","toTaggedId","#isCascadeDelete","getMetadataForField","isCascadeDelete","getEmInternalApi","RelationT","RelationU","#m2m","#added","#removed","#pendingSet","#loaded","#hasBeenSet"],"sources":["../../src/relations/ManyToManyCollection.ts"],"sourcesContent":["import {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type ManyToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n toTaggedId,\n} from \"..//index.ts\";\nimport { manyToManyBatchLoader } from \"../batchloaders/manyToManyBatchLoader.ts\";\nimport { manyToManyFindDataLoader } from \"../dataloaders/manyToManyFindDataLoader.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { maybeAdd, maybeRemove, remove } from \"../utils.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\n/** An alias for creating `ManyToManyCollections`s. */\nexport function hasManyToMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const m2m = getMetadata(entity).allFields[fieldName] as ManyToManyField;\n return new ManyToManyCollection<T, U>(entity, m2m);\n });\n}\n\nexport class ManyToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>\n{\n readonly #field: ManyToManyField;\n #loadPromise: any;\n #state: M2MState<T, U>;\n\n // I.e. when entity = Book:\n // fieldName == tags, because it's our collection to tags\n // columnName = book_id, what we use as the `where book_id = us` to find our join table rows\n // otherFieldName = books, how tags points to us\n // otherColumnName = tag_id, how the other side finds its join table rows\n constructor(entity: T, field: ManyToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new LoadedState<T, U>(this, [], false);\n } else {\n this.#state = new UnloadedPristineState<T, U>(this);\n }\n }\n\n /** @internal */\n percolateAdd(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).add(this.entity, true);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).remove(this.entity, true);\n }\n\n /** @internal */\n registerJoinRowAdd(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addNew(this, this.entity, other);\n }\n\n /** @internal */\n registerJoinRowRemove(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addRemove(this, this.entity, other);\n }\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n private filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n if (opts?.withDeleted === true) return [...entities];\n // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n return entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<ReadonlyArray<U>> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const key = `${this.columnName}=${this.entity.id}`;\n const maybePreloaded = this.#getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= manyToManyBatchLoader(this.entity.em, this).load(key))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n }\n return this.filterDeleted(this.#state.doGet(), opts) as ReadonlyArray<U>;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.find(id);\n if (inMemory) return inMemory;\n if (this.#state.isLoaded) return undefined;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${id}`;\n const includes = await manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n const taggedId = toTaggedId(this.otherMeta, id);\n return includes ? (this.entity.em.load(taggedId) as Promise<U>) : undefined;\n }\n\n async includes(other: U): Promise<boolean> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.includesInMemory(other);\n if (inMemory !== undefined) return inMemory;\n if (other.isNewEntity) return false;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${other.id}`;\n return manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function includes(err) {\n throw appendStack(err, new Error());\n });\n }\n\n add(other: U, percolated = false): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other, percolated);\n }\n\n remove(other: U, percolated = false): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, percolated);\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.#getPreloaded();\n }\n\n preload(): void {\n const preloaded = this.#getPreloaded();\n if (preloaded) {\n this.#state = this.#state.applyLoad(preloaded);\n }\n }\n\n import(other: ManyToManyCollection<T, U>, _: unknown, mapEntities: (e: U[] | undefined) => U[] | undefined): void {\n this.#state = other.#state.import(this, mapEntities);\n }\n\n private doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n return this.#state.doGet();\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#state.isLoaded) {\n throw new Error(\"removeAll was called when not loaded\");\n }\n for (const other of [...this.#state.doGet()]) {\n this.remove(other);\n }\n }\n\n // impl details\n\n setFromOpts(others: U[]): void {\n this.#state = new LoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n maybeCascadeDelete() {\n if (this.#isCascadeDelete) {\n this.filterDeleted(this.#state.current({ withDeleted: true }), { withDeleted: true }).forEach((e) =>\n this.entity.em.delete(e),\n );\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n if (this.#isCascadeDelete) return;\n const entities = await this.load({ withDeleted: true });\n entities.forEach((other) => {\n const m2m = other[this.otherFieldName] as any as ManyToManyCollection<U, T>;\n m2m.remove(this.entity);\n });\n if (this.#state instanceof LoadedState) {\n this.#state.setLoaded([]);\n }\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n get joinTableName(): string {\n return this.#field.joinTableName;\n }\n\n get fieldName(): string {\n return this.#field.fieldName;\n }\n\n get otherFieldName(): string & keyof U {\n return this.#field.otherFieldName as string & keyof U;\n }\n\n get columnName(): string {\n return this.#field.columnNames[0];\n }\n\n get otherColumnName(): string {\n return this.#field.columnNames[1];\n }\n\n get hasJoinTableId(): boolean {\n return this.#field.hasJoinTableId;\n }\n\n get #isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n #getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<U>(this.entity.idTagged, this.fieldName);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for ManyToManyCollection state machine.\n *\n * State transitions:\n * ```\n * Constructor (existing entity) → UnloadedPristine\n * Constructor (new entity) → Loaded\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + applyLoad → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + applyLoad → Loaded (merges tracked adds/removes)\n *\n * PendingSet + applyLoad → Loaded (diffs pending values against DB)\n *\n * Loaded + applyLoad (forceReload) → Loaded (refreshed)\n * ```\n */\ninterface M2MState<T extends Entity, U extends Entity> {\n /** Adds an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n add(other: U, percolated: boolean): M2MState<T, U>;\n /** Removes an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n remove(other: U, percolated: boolean): M2MState<T, U>;\n /** Sets the collection; transitions UnloadedPristine/UnloadedAddedRemoved → PendingSet. */\n set(values: readonly U[]): M2MState<T, U>;\n /** Returns the current entities; throws if not loaded (except PendingSet returns pending values). */\n doGet(): U[];\n /** Finds an entity by id in memory; returns undefined if not found or not tracked. */\n find(id: IdOf<U>): U | undefined;\n /** Checks if entity is in memory; returns undefined if async lookup needed. */\n includesInMemory(other: U): boolean | undefined;\n /** Applies loaded DB entities; always transitions to Loaded. */\n applyLoad(dbEntities: U[]): LoadedState<T, U>;\n /** Returns current entities for cascade delete (works in any state). */\n current(opts?: { withDeleted?: boolean }): U[];\n /** Creates a copy of this state for a different collection (used by em.clone). */\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass UnloadedPristineState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n\n constructor(m2m: ManyToManyCollection<T, U>) {\n this.#m2m = m2m;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n const newState = new UnloadedAddedRemovedState<T, U>(this.#m2m, [other], []);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return newState;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n return new UnloadedAddedRemovedState<T, U>(this.#m2m, [], [other]);\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n includesInMemory(_other: U): boolean | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n return new LoadedState<T, U>(this.#m2m, dbEntities, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return [];\n }\n\n import(m2m: ManyToManyCollection<T, U>, _mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n return new UnloadedPristineState<T, U>(m2m);\n }\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass UnloadedAddedRemovedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n #added: U[];\n #removed: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#m2m = m2m;\n this.#added = added;\n this.#removed = removed;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n maybeRemove(this.#removed, other);\n if (!this.#added.includes(other)) {\n this.#added.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n maybeRemove(this.#added, other);\n maybeAdd(this.#removed, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#added.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n if (this.#added.includes(other)) return true;\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n for (const e of this.#added) {\n if (!loaded.includes(e)) {\n loaded.unshift(e);\n this.#m2m.registerJoinRowAdd(e);\n }\n }\n for (const e of this.#removed) {\n remove(loaded, e);\n this.#m2m.registerJoinRowRemove(e);\n }\n return new LoadedState<T, U>(this.#m2m, loaded, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#added;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const added = mapEntities(this.#added);\n const removed = mapEntities(this.#removed);\n return new UnloadedAddedRemovedState<T, U>(m2m, added ?? [], removed ?? []);\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass PendingSetState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #m2m: ManyToManyCollection<T, U>;\n #pendingSet: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, pendingSet: U[]) {\n this.#m2m = m2m;\n this.#pendingSet = pendingSet;\n getEmInternalApi(m2m.entity.em).pendingLoads.add(m2m);\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (!this.#pendingSet.includes(other)) {\n this.#pendingSet.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#pendingSet, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#pendingSet = [...values];\n return this;\n }\n\n doGet(): U[] {\n return this.#pendingSet;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#pendingSet.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#pendingSet.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n const pending = this.#pendingSet;\n for (const other of [...loaded]) {\n if (!pending.includes(other)) {\n remove(loaded, other);\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n }\n for (const other of pending) {\n if (!loaded.includes(other)) {\n loaded.push(other);\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n }\n return new LoadedState<T, U>(this.#m2m, loaded, true);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#pendingSet;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const pendingSet = mapEntities(this.#pendingSet);\n return new PendingSetState<T, U>(m2m, pendingSet ?? []);\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass LoadedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = true;\n #m2m: ManyToManyCollection<T, U>;\n #loaded: U[];\n #hasBeenSet: boolean;\n\n constructor(m2m: ManyToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean) {\n this.#m2m = m2m;\n this.#loaded = loaded;\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (this.#loaded.includes(other)) return this;\n this.#loaded.push(other);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#loaded, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#hasBeenSet = true;\n const loaded = new Set(this.#loaded);\n const valuesSet = new Set(values);\n for (const other of loaded) {\n if (!valuesSet.has(other)) {\n this.remove(other, false);\n }\n }\n for (const other of values) {\n if (!loaded.has(other)) {\n this.add(other, false);\n }\n }\n return this;\n }\n\n doGet(): U[] {\n return this.#loaded;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#loaded.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#loaded.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n this.#loaded = dbEntities;\n return this;\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#loaded;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const loaded = mapEntities(this.#loaded);\n return new LoadedState<T, U>(m2m, loaded ?? [], this.#hasBeenSet);\n }\n\n getLoaded(): U[] {\n return this.#loaded;\n }\n\n setLoaded(entities: U[]): void {\n this.#loaded = entities;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ManyToManyCollection.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","#field","getInstanceData","#state","#getPreloaded","#loadPromise","manyToManyBatchLoader","appendStack","manyToManyFindDataLoader","toTaggedId","#isCascadeDelete","getMetadataForField","isCascadeDelete","getEmInternalApi","RelationT","RelationU","#m2m","#added","#removed","#pendingSet","#loaded","#hasBeenSet"],"sources":["../../src/relations/ManyToManyCollection.ts"],"sourcesContent":["import { manyToManyBatchLoader } from \"src/batchloaders/manyToManyBatchLoader.ts\";\nimport { manyToManyFindDataLoader } from \"src/dataloaders/manyToManyFindDataLoader.ts\";\nimport {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type ManyToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n toTaggedId,\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 { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { maybeAdd, maybeRemove, remove } from \"src/utils.ts\";\n\n/** An alias for creating `ManyToManyCollections`s. */\nexport function hasManyToMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const m2m = getMetadata(entity).allFields[fieldName] as ManyToManyField;\n return new ManyToManyCollection<T, U>(entity, m2m);\n });\n}\n\nexport class ManyToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>\n{\n readonly #field: ManyToManyField;\n #loadPromise: any;\n #state: M2MState<T, U>;\n\n // I.e. when entity = Book:\n // fieldName == tags, because it's our collection to tags\n // columnName = book_id, what we use as the `where book_id = us` to find our join table rows\n // otherFieldName = books, how tags points to us\n // otherColumnName = tag_id, how the other side finds its join table rows\n constructor(entity: T, field: ManyToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new LoadedState<T, U>(this, [], false);\n } else {\n this.#state = new UnloadedPristineState<T, U>(this);\n }\n }\n\n /** @internal */\n percolateAdd(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).add(this.entity, true);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).remove(this.entity, true);\n }\n\n /** @internal */\n registerJoinRowAdd(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addNew(this, this.entity, other);\n }\n\n /** @internal */\n registerJoinRowRemove(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addRemove(this, this.entity, other);\n }\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n private filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n if (opts?.withDeleted === true) return [...entities];\n // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n return entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<ReadonlyArray<U>> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const key = `${this.columnName}=${this.entity.id}`;\n const maybePreloaded = this.#getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= manyToManyBatchLoader(this.entity.em, this).load(key))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n }\n return this.filterDeleted(this.#state.doGet(), opts) as ReadonlyArray<U>;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.find(id);\n if (inMemory) return inMemory;\n if (this.#state.isLoaded) return undefined;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${id}`;\n const includes = await manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n const taggedId = toTaggedId(this.otherMeta, id);\n return includes ? (this.entity.em.load(taggedId) as Promise<U>) : undefined;\n }\n\n async includes(other: U): Promise<boolean> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.includesInMemory(other);\n if (inMemory !== undefined) return inMemory;\n if (other.isNewEntity) return false;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${other.id}`;\n return manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function includes(err) {\n throw appendStack(err, new Error());\n });\n }\n\n add(other: U, percolated = false): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other, percolated);\n }\n\n remove(other: U, percolated = false): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, percolated);\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.#getPreloaded();\n }\n\n preload(): void {\n const preloaded = this.#getPreloaded();\n if (preloaded) {\n this.#state = this.#state.applyLoad(preloaded);\n }\n }\n\n import(other: ManyToManyCollection<T, U>, _: unknown, mapEntities: (e: U[] | undefined) => U[] | undefined): void {\n this.#state = other.#state.import(this, mapEntities);\n }\n\n private doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n return this.#state.doGet();\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#state.isLoaded) {\n throw new Error(\"removeAll was called when not loaded\");\n }\n for (const other of [...this.#state.doGet()]) {\n this.remove(other);\n }\n }\n\n // impl details\n\n setFromOpts(others: U[]): void {\n this.#state = new LoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n maybeCascadeDelete() {\n if (this.#isCascadeDelete) {\n this.filterDeleted(this.#state.current({ withDeleted: true }), { withDeleted: true }).forEach((e) =>\n this.entity.em.delete(e),\n );\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n if (this.#isCascadeDelete) return;\n const entities = await this.load({ withDeleted: true });\n entities.forEach((other) => {\n const m2m = other[this.otherFieldName] as any as ManyToManyCollection<U, T>;\n m2m.remove(this.entity);\n });\n if (this.#state instanceof LoadedState) {\n this.#state.setLoaded([]);\n }\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n get joinTableName(): string {\n return this.#field.joinTableName;\n }\n\n get fieldName(): string {\n return this.#field.fieldName;\n }\n\n get otherFieldName(): string & keyof U {\n return this.#field.otherFieldName as string & keyof U;\n }\n\n get columnName(): string {\n return this.#field.columnNames[0];\n }\n\n get otherColumnName(): string {\n return this.#field.columnNames[1];\n }\n\n get hasJoinTableId(): boolean {\n return this.#field.hasJoinTableId;\n }\n\n get #isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n #getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<U>(this.entity.idTagged, this.fieldName);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for ManyToManyCollection state machine.\n *\n * State transitions:\n * ```\n * Constructor (existing entity) → UnloadedPristine\n * Constructor (new entity) → Loaded\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + applyLoad → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + applyLoad → Loaded (merges tracked adds/removes)\n *\n * PendingSet + applyLoad → Loaded (diffs pending values against DB)\n *\n * Loaded + applyLoad (forceReload) → Loaded (refreshed)\n * ```\n */\ninterface M2MState<T extends Entity, U extends Entity> {\n /** Adds an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n add(other: U, percolated: boolean): M2MState<T, U>;\n /** Removes an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n remove(other: U, percolated: boolean): M2MState<T, U>;\n /** Sets the collection; transitions UnloadedPristine/UnloadedAddedRemoved → PendingSet. */\n set(values: readonly U[]): M2MState<T, U>;\n /** Returns the current entities; throws if not loaded (except PendingSet returns pending values). */\n doGet(): U[];\n /** Finds an entity by id in memory; returns undefined if not found or not tracked. */\n find(id: IdOf<U>): U | undefined;\n /** Checks if entity is in memory; returns undefined if async lookup needed. */\n includesInMemory(other: U): boolean | undefined;\n /** Applies loaded DB entities; always transitions to Loaded. */\n applyLoad(dbEntities: U[]): LoadedState<T, U>;\n /** Returns current entities for cascade delete (works in any state). */\n current(opts?: { withDeleted?: boolean }): U[];\n /** Creates a copy of this state for a different collection (used by em.clone). */\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass UnloadedPristineState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n\n constructor(m2m: ManyToManyCollection<T, U>) {\n this.#m2m = m2m;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n const newState = new UnloadedAddedRemovedState<T, U>(this.#m2m, [other], []);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return newState;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n return new UnloadedAddedRemovedState<T, U>(this.#m2m, [], [other]);\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n includesInMemory(_other: U): boolean | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n return new LoadedState<T, U>(this.#m2m, dbEntities, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return [];\n }\n\n import(m2m: ManyToManyCollection<T, U>, _mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n return new UnloadedPristineState<T, U>(m2m);\n }\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass UnloadedAddedRemovedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n #added: U[];\n #removed: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#m2m = m2m;\n this.#added = added;\n this.#removed = removed;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n maybeRemove(this.#removed, other);\n if (!this.#added.includes(other)) {\n this.#added.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n maybeRemove(this.#added, other);\n maybeAdd(this.#removed, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#added.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n if (this.#added.includes(other)) return true;\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n for (const e of this.#added) {\n if (!loaded.includes(e)) {\n loaded.unshift(e);\n this.#m2m.registerJoinRowAdd(e);\n }\n }\n for (const e of this.#removed) {\n remove(loaded, e);\n this.#m2m.registerJoinRowRemove(e);\n }\n return new LoadedState<T, U>(this.#m2m, loaded, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#added;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const added = mapEntities(this.#added);\n const removed = mapEntities(this.#removed);\n return new UnloadedAddedRemovedState<T, U>(m2m, added ?? [], removed ?? []);\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass PendingSetState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #m2m: ManyToManyCollection<T, U>;\n #pendingSet: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, pendingSet: U[]) {\n this.#m2m = m2m;\n this.#pendingSet = pendingSet;\n getEmInternalApi(m2m.entity.em).pendingLoads.add(m2m);\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (!this.#pendingSet.includes(other)) {\n this.#pendingSet.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#pendingSet, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#pendingSet = [...values];\n return this;\n }\n\n doGet(): U[] {\n return this.#pendingSet;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#pendingSet.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#pendingSet.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n const pending = this.#pendingSet;\n for (const other of [...loaded]) {\n if (!pending.includes(other)) {\n remove(loaded, other);\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n }\n for (const other of pending) {\n if (!loaded.includes(other)) {\n loaded.push(other);\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n }\n return new LoadedState<T, U>(this.#m2m, loaded, true);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#pendingSet;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const pendingSet = mapEntities(this.#pendingSet);\n return new PendingSetState<T, U>(m2m, pendingSet ?? []);\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass LoadedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = true;\n #m2m: ManyToManyCollection<T, U>;\n #loaded: U[];\n #hasBeenSet: boolean;\n\n constructor(m2m: ManyToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean) {\n this.#m2m = m2m;\n this.#loaded = loaded;\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (this.#loaded.includes(other)) return this;\n this.#loaded.push(other);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#loaded, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#hasBeenSet = true;\n const loaded = new Set(this.#loaded);\n const valuesSet = new Set(values);\n for (const other of loaded) {\n if (!valuesSet.has(other)) {\n this.remove(other, false);\n }\n }\n for (const other of values) {\n if (!loaded.has(other)) {\n this.add(other, false);\n }\n }\n return this;\n }\n\n doGet(): U[] {\n return this.#loaded;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#loaded.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#loaded.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n this.#loaded = dbEntities;\n return this;\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#loaded;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const loaded = mapEntities(this.#loaded);\n return new LoadedState<T, U>(m2m, loaded ?? [], this.#hasBeenSet);\n }\n\n getLoaded(): U[] {\n return this.#loaded;\n }\n\n setLoaded(entities: U[]): void {\n this.#loaded = entities;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { AbstractRelationImpl } from "./AbstractRelationImpl.js";
|
|
2
2
|
import { RelationT, RelationU } from "./RelationSymbols.js";
|
|
3
|
+
import { toTaggedId } from "../keys.js";
|
|
4
|
+
import { manyToManyBatchLoader } from "../batchloaders/manyToManyBatchLoader.js";
|
|
5
|
+
import { manyToManyFindDataLoader } from "../dataloaders/manyToManyFindDataLoader.js";
|
|
3
6
|
import { isCascadeDelete } from "./isCascadeDelete.js";
|
|
4
7
|
import { maybeAdd, maybeRemove, remove } from "../utils.js";
|
|
5
8
|
import { lazyField } from "../newEntity.js";
|
|
6
|
-
import { manyToManyBatchLoader } from "../batchloaders/manyToManyBatchLoader.js";
|
|
7
|
-
import { manyToManyFindDataLoader } from "../dataloaders/manyToManyFindDataLoader.js";
|
|
8
|
-
import { toTaggedId } from "../keys.js";
|
|
9
9
|
import { getMetadata, getMetadataForField } from "../EntityMetadata.js";
|
|
10
10
|
import { ensureNotDeleted } from "../index.js";
|
|
11
11
|
import { appendStack, getEmInternalApi } from "../EntityManager.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManyToManyCollection.js","names":["#field","#state","#getPreloaded","#loadPromise","#isCascadeDelete","#m2m","#added","#removed","#pendingSet","#loaded","#hasBeenSet"],"sources":["../../src/relations/ManyToManyCollection.ts"],"sourcesContent":["import {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type ManyToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n toTaggedId,\n} from \"..//index.ts\";\nimport { manyToManyBatchLoader } from \"../batchloaders/manyToManyBatchLoader.ts\";\nimport { manyToManyFindDataLoader } from \"../dataloaders/manyToManyFindDataLoader.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { maybeAdd, maybeRemove, remove } from \"../utils.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\n/** An alias for creating `ManyToManyCollections`s. */\nexport function hasManyToMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const m2m = getMetadata(entity).allFields[fieldName] as ManyToManyField;\n return new ManyToManyCollection<T, U>(entity, m2m);\n });\n}\n\nexport class ManyToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>\n{\n readonly #field: ManyToManyField;\n #loadPromise: any;\n #state: M2MState<T, U>;\n\n // I.e. when entity = Book:\n // fieldName == tags, because it's our collection to tags\n // columnName = book_id, what we use as the `where book_id = us` to find our join table rows\n // otherFieldName = books, how tags points to us\n // otherColumnName = tag_id, how the other side finds its join table rows\n constructor(entity: T, field: ManyToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new LoadedState<T, U>(this, [], false);\n } else {\n this.#state = new UnloadedPristineState<T, U>(this);\n }\n }\n\n /** @internal */\n percolateAdd(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).add(this.entity, true);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).remove(this.entity, true);\n }\n\n /** @internal */\n registerJoinRowAdd(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addNew(this, this.entity, other);\n }\n\n /** @internal */\n registerJoinRowRemove(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addRemove(this, this.entity, other);\n }\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n private filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n if (opts?.withDeleted === true) return [...entities];\n // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n return entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<ReadonlyArray<U>> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const key = `${this.columnName}=${this.entity.id}`;\n const maybePreloaded = this.#getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= manyToManyBatchLoader(this.entity.em, this).load(key))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n }\n return this.filterDeleted(this.#state.doGet(), opts) as ReadonlyArray<U>;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.find(id);\n if (inMemory) return inMemory;\n if (this.#state.isLoaded) return undefined;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${id}`;\n const includes = await manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n const taggedId = toTaggedId(this.otherMeta, id);\n return includes ? (this.entity.em.load(taggedId) as Promise<U>) : undefined;\n }\n\n async includes(other: U): Promise<boolean> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.includesInMemory(other);\n if (inMemory !== undefined) return inMemory;\n if (other.isNewEntity) return false;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${other.id}`;\n return manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function includes(err) {\n throw appendStack(err, new Error());\n });\n }\n\n add(other: U, percolated = false): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other, percolated);\n }\n\n remove(other: U, percolated = false): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, percolated);\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.#getPreloaded();\n }\n\n preload(): void {\n const preloaded = this.#getPreloaded();\n if (preloaded) {\n this.#state = this.#state.applyLoad(preloaded);\n }\n }\n\n import(other: ManyToManyCollection<T, U>, _: unknown, mapEntities: (e: U[] | undefined) => U[] | undefined): void {\n this.#state = other.#state.import(this, mapEntities);\n }\n\n private doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n return this.#state.doGet();\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#state.isLoaded) {\n throw new Error(\"removeAll was called when not loaded\");\n }\n for (const other of [...this.#state.doGet()]) {\n this.remove(other);\n }\n }\n\n // impl details\n\n setFromOpts(others: U[]): void {\n this.#state = new LoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n maybeCascadeDelete() {\n if (this.#isCascadeDelete) {\n this.filterDeleted(this.#state.current({ withDeleted: true }), { withDeleted: true }).forEach((e) =>\n this.entity.em.delete(e),\n );\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n if (this.#isCascadeDelete) return;\n const entities = await this.load({ withDeleted: true });\n entities.forEach((other) => {\n const m2m = other[this.otherFieldName] as any as ManyToManyCollection<U, T>;\n m2m.remove(this.entity);\n });\n if (this.#state instanceof LoadedState) {\n this.#state.setLoaded([]);\n }\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n get joinTableName(): string {\n return this.#field.joinTableName;\n }\n\n get fieldName(): string {\n return this.#field.fieldName;\n }\n\n get otherFieldName(): string & keyof U {\n return this.#field.otherFieldName as string & keyof U;\n }\n\n get columnName(): string {\n return this.#field.columnNames[0];\n }\n\n get otherColumnName(): string {\n return this.#field.columnNames[1];\n }\n\n get hasJoinTableId(): boolean {\n return this.#field.hasJoinTableId;\n }\n\n get #isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n #getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<U>(this.entity.idTagged, this.fieldName);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for ManyToManyCollection state machine.\n *\n * State transitions:\n * ```\n * Constructor (existing entity) → UnloadedPristine\n * Constructor (new entity) → Loaded\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + applyLoad → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + applyLoad → Loaded (merges tracked adds/removes)\n *\n * PendingSet + applyLoad → Loaded (diffs pending values against DB)\n *\n * Loaded + applyLoad (forceReload) → Loaded (refreshed)\n * ```\n */\ninterface M2MState<T extends Entity, U extends Entity> {\n /** Adds an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n add(other: U, percolated: boolean): M2MState<T, U>;\n /** Removes an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n remove(other: U, percolated: boolean): M2MState<T, U>;\n /** Sets the collection; transitions UnloadedPristine/UnloadedAddedRemoved → PendingSet. */\n set(values: readonly U[]): M2MState<T, U>;\n /** Returns the current entities; throws if not loaded (except PendingSet returns pending values). */\n doGet(): U[];\n /** Finds an entity by id in memory; returns undefined if not found or not tracked. */\n find(id: IdOf<U>): U | undefined;\n /** Checks if entity is in memory; returns undefined if async lookup needed. */\n includesInMemory(other: U): boolean | undefined;\n /** Applies loaded DB entities; always transitions to Loaded. */\n applyLoad(dbEntities: U[]): LoadedState<T, U>;\n /** Returns current entities for cascade delete (works in any state). */\n current(opts?: { withDeleted?: boolean }): U[];\n /** Creates a copy of this state for a different collection (used by em.clone). */\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass UnloadedPristineState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n\n constructor(m2m: ManyToManyCollection<T, U>) {\n this.#m2m = m2m;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n const newState = new UnloadedAddedRemovedState<T, U>(this.#m2m, [other], []);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return newState;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n return new UnloadedAddedRemovedState<T, U>(this.#m2m, [], [other]);\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n includesInMemory(_other: U): boolean | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n return new LoadedState<T, U>(this.#m2m, dbEntities, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return [];\n }\n\n import(m2m: ManyToManyCollection<T, U>, _mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n return new UnloadedPristineState<T, U>(m2m);\n }\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass UnloadedAddedRemovedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n #added: U[];\n #removed: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#m2m = m2m;\n this.#added = added;\n this.#removed = removed;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n maybeRemove(this.#removed, other);\n if (!this.#added.includes(other)) {\n this.#added.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n maybeRemove(this.#added, other);\n maybeAdd(this.#removed, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#added.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n if (this.#added.includes(other)) return true;\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n for (const e of this.#added) {\n if (!loaded.includes(e)) {\n loaded.unshift(e);\n this.#m2m.registerJoinRowAdd(e);\n }\n }\n for (const e of this.#removed) {\n remove(loaded, e);\n this.#m2m.registerJoinRowRemove(e);\n }\n return new LoadedState<T, U>(this.#m2m, loaded, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#added;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const added = mapEntities(this.#added);\n const removed = mapEntities(this.#removed);\n return new UnloadedAddedRemovedState<T, U>(m2m, added ?? [], removed ?? []);\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass PendingSetState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #m2m: ManyToManyCollection<T, U>;\n #pendingSet: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, pendingSet: U[]) {\n this.#m2m = m2m;\n this.#pendingSet = pendingSet;\n getEmInternalApi(m2m.entity.em).pendingLoads.add(m2m);\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (!this.#pendingSet.includes(other)) {\n this.#pendingSet.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#pendingSet, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#pendingSet = [...values];\n return this;\n }\n\n doGet(): U[] {\n return this.#pendingSet;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#pendingSet.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#pendingSet.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n const pending = this.#pendingSet;\n for (const other of [...loaded]) {\n if (!pending.includes(other)) {\n remove(loaded, other);\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n }\n for (const other of pending) {\n if (!loaded.includes(other)) {\n loaded.push(other);\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n }\n return new LoadedState<T, U>(this.#m2m, loaded, true);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#pendingSet;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const pendingSet = mapEntities(this.#pendingSet);\n return new PendingSetState<T, U>(m2m, pendingSet ?? []);\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass LoadedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = true;\n #m2m: ManyToManyCollection<T, U>;\n #loaded: U[];\n #hasBeenSet: boolean;\n\n constructor(m2m: ManyToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean) {\n this.#m2m = m2m;\n this.#loaded = loaded;\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (this.#loaded.includes(other)) return this;\n this.#loaded.push(other);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#loaded, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#hasBeenSet = true;\n const loaded = new Set(this.#loaded);\n const valuesSet = new Set(values);\n for (const other of loaded) {\n if (!valuesSet.has(other)) {\n this.remove(other, false);\n }\n }\n for (const other of values) {\n if (!loaded.has(other)) {\n this.add(other, false);\n }\n }\n return this;\n }\n\n doGet(): U[] {\n return this.#loaded;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#loaded.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#loaded.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n this.#loaded = dbEntities;\n return this;\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#loaded;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const loaded = mapEntities(this.#loaded);\n return new LoadedState<T, U>(m2m, loaded ?? [], this.#hasBeenSet);\n }\n\n getLoaded(): U[] {\n return this.#loaded;\n }\n\n setLoaded(entities: U[]): void {\n this.#loaded = entities;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ManyToManyCollection.js","names":["#field","#state","#getPreloaded","#loadPromise","#isCascadeDelete","#m2m","#added","#removed","#pendingSet","#loaded","#hasBeenSet"],"sources":["../../src/relations/ManyToManyCollection.ts"],"sourcesContent":["import { manyToManyBatchLoader } from \"src/batchloaders/manyToManyBatchLoader.ts\";\nimport { manyToManyFindDataLoader } from \"src/dataloaders/manyToManyFindDataLoader.ts\";\nimport {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type ManyToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n toTaggedId,\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 { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { maybeAdd, maybeRemove, remove } from \"src/utils.ts\";\n\n/** An alias for creating `ManyToManyCollections`s. */\nexport function hasManyToMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const m2m = getMetadata(entity).allFields[fieldName] as ManyToManyField;\n return new ManyToManyCollection<T, U>(entity, m2m);\n });\n}\n\nexport class ManyToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>\n{\n readonly #field: ManyToManyField;\n #loadPromise: any;\n #state: M2MState<T, U>;\n\n // I.e. when entity = Book:\n // fieldName == tags, because it's our collection to tags\n // columnName = book_id, what we use as the `where book_id = us` to find our join table rows\n // otherFieldName = books, how tags points to us\n // otherColumnName = tag_id, how the other side finds its join table rows\n constructor(entity: T, field: ManyToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new LoadedState<T, U>(this, [], false);\n } else {\n this.#state = new UnloadedPristineState<T, U>(this);\n }\n }\n\n /** @internal */\n percolateAdd(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).add(this.entity, true);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).remove(this.entity, true);\n }\n\n /** @internal */\n registerJoinRowAdd(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addNew(this, this.entity, other);\n }\n\n /** @internal */\n registerJoinRowRemove(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addRemove(this, this.entity, other);\n }\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n private filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n if (opts?.withDeleted === true) return [...entities];\n // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n return entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<ReadonlyArray<U>> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const key = `${this.columnName}=${this.entity.id}`;\n const maybePreloaded = this.#getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= manyToManyBatchLoader(this.entity.em, this).load(key))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n }\n return this.filterDeleted(this.#state.doGet(), opts) as ReadonlyArray<U>;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.find(id);\n if (inMemory) return inMemory;\n if (this.#state.isLoaded) return undefined;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${id}`;\n const includes = await manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n const taggedId = toTaggedId(this.otherMeta, id);\n return includes ? (this.entity.em.load(taggedId) as Promise<U>) : undefined;\n }\n\n async includes(other: U): Promise<boolean> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.includesInMemory(other);\n if (inMemory !== undefined) return inMemory;\n if (other.isNewEntity) return false;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${other.id}`;\n return manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function includes(err) {\n throw appendStack(err, new Error());\n });\n }\n\n add(other: U, percolated = false): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other, percolated);\n }\n\n remove(other: U, percolated = false): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, percolated);\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.#getPreloaded();\n }\n\n preload(): void {\n const preloaded = this.#getPreloaded();\n if (preloaded) {\n this.#state = this.#state.applyLoad(preloaded);\n }\n }\n\n import(other: ManyToManyCollection<T, U>, _: unknown, mapEntities: (e: U[] | undefined) => U[] | undefined): void {\n this.#state = other.#state.import(this, mapEntities);\n }\n\n private doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n return this.#state.doGet();\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#state.isLoaded) {\n throw new Error(\"removeAll was called when not loaded\");\n }\n for (const other of [...this.#state.doGet()]) {\n this.remove(other);\n }\n }\n\n // impl details\n\n setFromOpts(others: U[]): void {\n this.#state = new LoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n maybeCascadeDelete() {\n if (this.#isCascadeDelete) {\n this.filterDeleted(this.#state.current({ withDeleted: true }), { withDeleted: true }).forEach((e) =>\n this.entity.em.delete(e),\n );\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n if (this.#isCascadeDelete) return;\n const entities = await this.load({ withDeleted: true });\n entities.forEach((other) => {\n const m2m = other[this.otherFieldName] as any as ManyToManyCollection<U, T>;\n m2m.remove(this.entity);\n });\n if (this.#state instanceof LoadedState) {\n this.#state.setLoaded([]);\n }\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n get joinTableName(): string {\n return this.#field.joinTableName;\n }\n\n get fieldName(): string {\n return this.#field.fieldName;\n }\n\n get otherFieldName(): string & keyof U {\n return this.#field.otherFieldName as string & keyof U;\n }\n\n get columnName(): string {\n return this.#field.columnNames[0];\n }\n\n get otherColumnName(): string {\n return this.#field.columnNames[1];\n }\n\n get hasJoinTableId(): boolean {\n return this.#field.hasJoinTableId;\n }\n\n get #isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n #getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<U>(this.entity.idTagged, this.fieldName);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for ManyToManyCollection state machine.\n *\n * State transitions:\n * ```\n * Constructor (existing entity) → UnloadedPristine\n * Constructor (new entity) → Loaded\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + applyLoad → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + applyLoad → Loaded (merges tracked adds/removes)\n *\n * PendingSet + applyLoad → Loaded (diffs pending values against DB)\n *\n * Loaded + applyLoad (forceReload) → Loaded (refreshed)\n * ```\n */\ninterface M2MState<T extends Entity, U extends Entity> {\n /** Adds an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n add(other: U, percolated: boolean): M2MState<T, U>;\n /** Removes an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n remove(other: U, percolated: boolean): M2MState<T, U>;\n /** Sets the collection; transitions UnloadedPristine/UnloadedAddedRemoved → PendingSet. */\n set(values: readonly U[]): M2MState<T, U>;\n /** Returns the current entities; throws if not loaded (except PendingSet returns pending values). */\n doGet(): U[];\n /** Finds an entity by id in memory; returns undefined if not found or not tracked. */\n find(id: IdOf<U>): U | undefined;\n /** Checks if entity is in memory; returns undefined if async lookup needed. */\n includesInMemory(other: U): boolean | undefined;\n /** Applies loaded DB entities; always transitions to Loaded. */\n applyLoad(dbEntities: U[]): LoadedState<T, U>;\n /** Returns current entities for cascade delete (works in any state). */\n current(opts?: { withDeleted?: boolean }): U[];\n /** Creates a copy of this state for a different collection (used by em.clone). */\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass UnloadedPristineState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n\n constructor(m2m: ManyToManyCollection<T, U>) {\n this.#m2m = m2m;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n const newState = new UnloadedAddedRemovedState<T, U>(this.#m2m, [other], []);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return newState;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n return new UnloadedAddedRemovedState<T, U>(this.#m2m, [], [other]);\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n includesInMemory(_other: U): boolean | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n return new LoadedState<T, U>(this.#m2m, dbEntities, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return [];\n }\n\n import(m2m: ManyToManyCollection<T, U>, _mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n return new UnloadedPristineState<T, U>(m2m);\n }\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass UnloadedAddedRemovedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n #added: U[];\n #removed: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#m2m = m2m;\n this.#added = added;\n this.#removed = removed;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n maybeRemove(this.#removed, other);\n if (!this.#added.includes(other)) {\n this.#added.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n maybeRemove(this.#added, other);\n maybeAdd(this.#removed, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#added.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n if (this.#added.includes(other)) return true;\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n for (const e of this.#added) {\n if (!loaded.includes(e)) {\n loaded.unshift(e);\n this.#m2m.registerJoinRowAdd(e);\n }\n }\n for (const e of this.#removed) {\n remove(loaded, e);\n this.#m2m.registerJoinRowRemove(e);\n }\n return new LoadedState<T, U>(this.#m2m, loaded, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#added;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const added = mapEntities(this.#added);\n const removed = mapEntities(this.#removed);\n return new UnloadedAddedRemovedState<T, U>(m2m, added ?? [], removed ?? []);\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass PendingSetState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #m2m: ManyToManyCollection<T, U>;\n #pendingSet: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, pendingSet: U[]) {\n this.#m2m = m2m;\n this.#pendingSet = pendingSet;\n getEmInternalApi(m2m.entity.em).pendingLoads.add(m2m);\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (!this.#pendingSet.includes(other)) {\n this.#pendingSet.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#pendingSet, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#pendingSet = [...values];\n return this;\n }\n\n doGet(): U[] {\n return this.#pendingSet;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#pendingSet.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#pendingSet.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n const pending = this.#pendingSet;\n for (const other of [...loaded]) {\n if (!pending.includes(other)) {\n remove(loaded, other);\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n }\n for (const other of pending) {\n if (!loaded.includes(other)) {\n loaded.push(other);\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n }\n return new LoadedState<T, U>(this.#m2m, loaded, true);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#pendingSet;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const pendingSet = mapEntities(this.#pendingSet);\n return new PendingSetState<T, U>(m2m, pendingSet ?? []);\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass LoadedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = true;\n #m2m: ManyToManyCollection<T, U>;\n #loaded: U[];\n #hasBeenSet: boolean;\n\n constructor(m2m: ManyToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean) {\n this.#m2m = m2m;\n this.#loaded = loaded;\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (this.#loaded.includes(other)) return this;\n this.#loaded.push(other);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#loaded, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#hasBeenSet = true;\n const loaded = new Set(this.#loaded);\n const valuesSet = new Set(values);\n for (const other of loaded) {\n if (!valuesSet.has(other)) {\n this.remove(other, false);\n }\n }\n for (const other of values) {\n if (!loaded.has(other)) {\n this.add(other, false);\n }\n }\n return this;\n }\n\n doGet(): U[] {\n return this.#loaded;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#loaded.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#loaded.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n this.#loaded = dbEntities;\n return this;\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#loaded;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const loaded = mapEntities(this.#loaded);\n return new LoadedState<T, U>(m2m, loaded ?? [], this.#hasBeenSet);\n }\n\n getLoaded(): U[] {\n return this.#loaded;\n }\n\n setLoaded(entities: U[]): void {\n this.#loaded = entities;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_relations_RelationSymbols = require("./RelationSymbols.cjs");
|
|
3
|
-
const
|
|
4
|
-
const require_newEntity = require("../newEntity.cjs");
|
|
3
|
+
const require_keys = require("../keys.cjs");
|
|
5
4
|
const require_dataloaders_manyToManyFindDataLoader = require("../dataloaders/manyToManyFindDataLoader.cjs");
|
|
6
5
|
require("./LargeCollection.cjs");
|
|
7
|
-
const
|
|
6
|
+
const require_utils = require("../utils.cjs");
|
|
7
|
+
const require_newEntity = require("../newEntity.cjs");
|
|
8
8
|
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
9
9
|
const require_index = require("../index.cjs");
|
|
10
10
|
const require_EntityManager = require("../EntityManager.cjs");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManyToManyLargeCollection.cjs","names":["lazyField","resolveOtherMeta","manyToManyFindDataLoader","appendStack","toTaggedId","getMetadataForField","getMetadata","RelationT","RelationU"],"sources":["../../src/relations/ManyToManyLargeCollection.ts"],"sourcesContent":["import { manyToManyFindDataLoader } from \"
|
|
1
|
+
{"version":3,"file":"ManyToManyLargeCollection.cjs","names":["lazyField","resolveOtherMeta","manyToManyFindDataLoader","appendStack","toTaggedId","getMetadataForField","getMetadata","RelationT","RelationU"],"sources":["../../src/relations/ManyToManyLargeCollection.ts"],"sourcesContent":["import { manyToManyFindDataLoader } from \"src/dataloaders/manyToManyFindDataLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, appendStack } from \"src/EntityManager.ts\";\nimport { type EntityMetadata, getMetadataForField } from \"src/EntityMetadata.ts\";\nimport { type ManyToManyCollection, ensureNotDeleted, getMetadata, toTaggedId } from \"src/index.ts\";\nimport { lazyField, resolveOtherMeta } from \"src/newEntity.ts\";\nimport { type LargeCollection } from \"src/relations/LargeCollection.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { remove } from \"src/utils.ts\";\n\n/** An alias for creating `ManyToManyLargeCollection`s. */\nexport function hasLargeManyToMany<T extends Entity, U extends Entity>(\n joinTableName: string,\n columnName: string,\n otherFieldName: keyof U & string,\n otherColumnName: string,\n hasJoinTableId: boolean,\n): LargeCollection<T, U> {\n let otherMeta: EntityMetadata<U>;\n return lazyField((entity: T, fieldName) => {\n otherMeta ??= resolveOtherMeta(entity, fieldName);\n return new ManyToManyLargeCollection(\n joinTableName,\n entity,\n fieldName as keyof T & string,\n columnName,\n otherMeta,\n otherFieldName,\n otherColumnName,\n hasJoinTableId,\n );\n });\n}\n\nexport class ManyToManyLargeCollection<T extends Entity, U extends Entity> implements LargeCollection<T, U> {\n // Even though a large collection can never be loaded, we do track local\n // mutations so that `find` can be accurate.\n private locallyAdded: U[] = [];\n private locallyRemoved: U[] = [];\n\n constructor(\n public joinTableName: string,\n // I.e. when entity = Book:\n // fieldName == tags, because it's our collection to tags\n // columnName = book_id, what we use as the `where book_id = us` to find our join table rows\n // otherFieldName = books, how tags points to us\n // otherColumnName = tag_id, how the other side finds its join table rows\n public entity: T,\n public fieldName: keyof T & string,\n public columnName: string,\n public otherMeta: EntityMetadata,\n public otherFieldName: keyof U & string,\n public otherColumnName: string,\n public hasJoinTableId: boolean = true,\n ) {}\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n\n // locallyAdded is never authorative b/c we never become fully loaded (unlike OneToManyCollection),\n // so we can probe our local collection, but if we don't find anything, we still have to query\n const localAdd = this.locallyAdded.find((u) => u.id === id);\n if (localAdd) {\n return localAdd;\n }\n\n const localRemove = this.locallyRemoved.find((u) => u.id === id);\n if (localRemove) {\n return undefined;\n }\n\n if (this.entity.isNewEntity) {\n return undefined;\n }\n\n // Make a cacheable tuple to look up this specific m2m row\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${id}`;\n const includes = await manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n const taggedId = toTaggedId(this.otherMeta, id);\n return includes ? (this.entity.em.load(taggedId) as Promise<U>) : undefined;\n }\n\n async includes(other: U): Promise<boolean> {\n const localAdd = this.locallyAdded.includes(other);\n if (localAdd) {\n return true;\n }\n\n const localRemove = this.locallyRemoved.includes(other);\n if (localRemove) {\n return false;\n }\n\n if (this.entity.isNewEntity || other.isNewEntity) {\n return false;\n }\n\n // Make a cacheable tuple to look up this specific m2m row\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${other.id}`;\n return manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function includes(err) {\n throw appendStack(err, new Error());\n });\n }\n\n add(other: U): void {\n remove(this.locallyRemoved, other);\n if (!this.locallyAdded.includes(other)) {\n this.locallyAdded.push(other);\n }\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).add(this.entity, true);\n }\n\n remove(other: U): void {\n remove(this.locallyAdded, other);\n if (!this.locallyRemoved.includes(other)) {\n this.locallyRemoved.push(other);\n }\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).remove(this.entity, true);\n }\n\n get hasBeenSet() {\n return false;\n }\n\n public get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n public toString(): string {\n return `ManyToManyLargeCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n isLoaded = false;\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { RelationT, RelationU } from "./RelationSymbols.js";
|
|
2
|
-
import {
|
|
3
|
-
import { lazyField, resolveOtherMeta } from "../newEntity.js";
|
|
2
|
+
import { toTaggedId } from "../keys.js";
|
|
4
3
|
import { manyToManyFindDataLoader } from "../dataloaders/manyToManyFindDataLoader.js";
|
|
5
4
|
import "./LargeCollection.js";
|
|
6
|
-
import {
|
|
5
|
+
import { remove } from "../utils.js";
|
|
6
|
+
import { lazyField, resolveOtherMeta } from "../newEntity.js";
|
|
7
7
|
import { getMetadata, getMetadataForField } from "../EntityMetadata.js";
|
|
8
8
|
import { ensureNotDeleted } from "../index.js";
|
|
9
9
|
import { appendStack } from "../EntityManager.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManyToManyLargeCollection.js","names":[],"sources":["../../src/relations/ManyToManyLargeCollection.ts"],"sourcesContent":["import { manyToManyFindDataLoader } from \"
|
|
1
|
+
{"version":3,"file":"ManyToManyLargeCollection.js","names":[],"sources":["../../src/relations/ManyToManyLargeCollection.ts"],"sourcesContent":["import { manyToManyFindDataLoader } from \"src/dataloaders/manyToManyFindDataLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, appendStack } from \"src/EntityManager.ts\";\nimport { type EntityMetadata, getMetadataForField } from \"src/EntityMetadata.ts\";\nimport { type ManyToManyCollection, ensureNotDeleted, getMetadata, toTaggedId } from \"src/index.ts\";\nimport { lazyField, resolveOtherMeta } from \"src/newEntity.ts\";\nimport { type LargeCollection } from \"src/relations/LargeCollection.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { remove } from \"src/utils.ts\";\n\n/** An alias for creating `ManyToManyLargeCollection`s. */\nexport function hasLargeManyToMany<T extends Entity, U extends Entity>(\n joinTableName: string,\n columnName: string,\n otherFieldName: keyof U & string,\n otherColumnName: string,\n hasJoinTableId: boolean,\n): LargeCollection<T, U> {\n let otherMeta: EntityMetadata<U>;\n return lazyField((entity: T, fieldName) => {\n otherMeta ??= resolveOtherMeta(entity, fieldName);\n return new ManyToManyLargeCollection(\n joinTableName,\n entity,\n fieldName as keyof T & string,\n columnName,\n otherMeta,\n otherFieldName,\n otherColumnName,\n hasJoinTableId,\n );\n });\n}\n\nexport class ManyToManyLargeCollection<T extends Entity, U extends Entity> implements LargeCollection<T, U> {\n // Even though a large collection can never be loaded, we do track local\n // mutations so that `find` can be accurate.\n private locallyAdded: U[] = [];\n private locallyRemoved: U[] = [];\n\n constructor(\n public joinTableName: string,\n // I.e. when entity = Book:\n // fieldName == tags, because it's our collection to tags\n // columnName = book_id, what we use as the `where book_id = us` to find our join table rows\n // otherFieldName = books, how tags points to us\n // otherColumnName = tag_id, how the other side finds its join table rows\n public entity: T,\n public fieldName: keyof T & string,\n public columnName: string,\n public otherMeta: EntityMetadata,\n public otherFieldName: keyof U & string,\n public otherColumnName: string,\n public hasJoinTableId: boolean = true,\n ) {}\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n\n // locallyAdded is never authorative b/c we never become fully loaded (unlike OneToManyCollection),\n // so we can probe our local collection, but if we don't find anything, we still have to query\n const localAdd = this.locallyAdded.find((u) => u.id === id);\n if (localAdd) {\n return localAdd;\n }\n\n const localRemove = this.locallyRemoved.find((u) => u.id === id);\n if (localRemove) {\n return undefined;\n }\n\n if (this.entity.isNewEntity) {\n return undefined;\n }\n\n // Make a cacheable tuple to look up this specific m2m row\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${id}`;\n const includes = await manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n const taggedId = toTaggedId(this.otherMeta, id);\n return includes ? (this.entity.em.load(taggedId) as Promise<U>) : undefined;\n }\n\n async includes(other: U): Promise<boolean> {\n const localAdd = this.locallyAdded.includes(other);\n if (localAdd) {\n return true;\n }\n\n const localRemove = this.locallyRemoved.includes(other);\n if (localRemove) {\n return false;\n }\n\n if (this.entity.isNewEntity || other.isNewEntity) {\n return false;\n }\n\n // Make a cacheable tuple to look up this specific m2m row\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${other.id}`;\n return manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function includes(err) {\n throw appendStack(err, new Error());\n });\n }\n\n add(other: U): void {\n remove(this.locallyRemoved, other);\n if (!this.locallyAdded.includes(other)) {\n this.locallyAdded.push(other);\n }\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).add(this.entity, true);\n }\n\n remove(other: U): void {\n remove(this.locallyAdded, other);\n if (!this.locallyRemoved.includes(other)) {\n this.locallyRemoved.push(other);\n }\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).remove(this.entity, true);\n }\n\n get hasBeenSet() {\n return false;\n }\n\n public get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n public toString(): string {\n return `ManyToManyLargeCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n isLoaded = false;\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,mBACd,eACA,YACA,gBACA,iBACA,gBACuB;CACvB,IAAI;CACJ,OAAO,WAAW,QAAW,cAAc;EACzC,cAAc,iBAAiB,QAAQ,SAAS;EAChD,OAAO,IAAI,0BACT,eACA,QACA,WACA,YACA,WACA,gBACA,iBACA,cACF;CACF,CAAC;AACH;AAEA,IAAa,4BAAb,MAA4G;CAOjG;CAMA;CACA;CACA;CACA;CACA;CACA;CACA;CAhBT,eAA4B,CAAC;CAC7B,iBAA8B,CAAC;CAE/B,YACE,eAMA,QACA,WACA,YACA,WACA,gBACA,iBACA,iBAAiC,MACjC;EAbO,KAAA,gBAAA;EAMA,KAAA,SAAA;EACA,KAAA,YAAA;EACA,KAAA,aAAA;EACA,KAAA,YAAA;EACA,KAAA,iBAAA;EACA,KAAA,kBAAA;EACA,KAAA,iBAAA;CACN;CAEH,MAAM,KAAK,IAAqC;EAC9C,iBAAiB,KAAK,QAAQ,SAAS;EAIvC,MAAM,WAAW,KAAK,aAAa,MAAM,MAAM,EAAE,OAAO,EAAE;EAC1D,IAAI,UACF,OAAO;EAIT,IADoB,KAAK,eAAe,MAAM,MAAM,EAAE,OAAO,EAC/C,GACZ;EAGF,IAAI,KAAK,OAAO,aACd;EAIF,MAAM,MAAM,GAAG,KAAK,WAAW,GAAG,KAAK,OAAO,GAAG,GAAG,KAAK,gBAAgB,GAAG;EAC5E,MAAM,WAAW,MAAM,yBAAyB,KAAK,OAAO,IAAI,IAAI,CAAC,CAClE,KAAK,GAAG,CAAC,CACT,MAAM,SAAS,KAAK,KAAK;GACxB,MAAM,YAAY,qBAAK,IAAI,MAAM,CAAC;EACpC,CAAC;EACH,MAAM,WAAW,WAAW,KAAK,WAAW,EAAE;EAC9C,OAAO,WAAY,KAAK,OAAO,GAAG,KAAK,QAAQ,IAAmB,KAAA;CACpE;CAEA,MAAM,SAAS,OAA4B;EAEzC,IADiB,KAAK,aAAa,SAAS,KACjC,GACT,OAAO;EAIT,IADoB,KAAK,eAAe,SAAS,KACnC,GACZ,OAAO;EAGT,IAAI,KAAK,OAAO,eAAe,MAAM,aACnC,OAAO;EAIT,MAAM,MAAM,GAAG,KAAK,WAAW,GAAG,KAAK,OAAO,GAAG,GAAG,KAAK,gBAAgB,GAAG,MAAM;EAClF,OAAO,yBAAyB,KAAK,OAAO,IAAI,IAAI,CAAC,CAClD,KAAK,GAAG,CAAC,CACT,MAAM,SAAS,SAAS,KAAK;GAC5B,MAAM,YAAY,qBAAK,IAAI,MAAM,CAAC;EACpC,CAAC;CACL;CAEA,IAAI,OAAgB;EAClB,OAAO,KAAK,gBAAgB,KAAK;EACjC,IAAI,CAAC,KAAK,aAAa,SAAS,KAAK,GACnC,KAAK,aAAa,KAAK,KAAK;EAE9B,MAAO,KAAK,eAAe,CAAuC,IAAI,KAAK,QAAQ,IAAI;CACzF;CAEA,OAAO,OAAgB;EACrB,OAAO,KAAK,cAAc,KAAK;EAC/B,IAAI,CAAC,KAAK,eAAe,SAAS,KAAK,GACrC,KAAK,eAAe,KAAK,KAAK;EAEhC,MAAO,KAAK,eAAe,CAAuC,OAAO,KAAK,QAAQ,IAAI;CAC5F;CAEA,IAAI,aAAa;EACf,OAAO;CACT;CAEA,IAAW,OAAuB;EAChC,OAAO,oBAAoB,YAAY,KAAK,MAAM,GAAG,KAAK,SAAS;CACrE;CAEA,WAA0B;EACxB,OAAO,qCAAqC,KAAK,OAAO,eAAe,KAAK,UAAU,eAAe,KAAK,UAAU,KAAK,oBAAoB,KAAK,eAAe;CACnK;CAEA,WAAW;CAEX,CAAC,aAAgB;CACjB,CAAC,aAAgB;AACnB"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_fields = require("../fields.cjs");
|
|
3
2
|
const require_relations_AbstractRelationImpl = require("./AbstractRelationImpl.cjs");
|
|
4
3
|
const require_relations_RelationSymbols = require("./RelationSymbols.cjs");
|
|
4
|
+
const require_relations_ReferenceSymbols = require("./ReferenceSymbols.cjs");
|
|
5
|
+
const require_fields = require("../fields.cjs");
|
|
6
|
+
const require_keys = require("../keys.cjs");
|
|
5
7
|
const require_relations_isCascadeDelete = require("./isCascadeDelete.cjs");
|
|
6
8
|
const require_relations_OneToManyCollection = require("./OneToManyCollection.cjs");
|
|
7
|
-
const
|
|
9
|
+
const require_relations_OneToManyLargeCollection = require("./OneToManyLargeCollection.cjs");
|
|
8
10
|
const require_relations_OneToOneReference = require("./OneToOneReference.cjs");
|
|
9
11
|
const require_utils = require("../utils.cjs");
|
|
10
12
|
const require_newEntity = require("../newEntity.cjs");
|
|
11
|
-
const require_relations_OneToManyLargeCollection = require("./OneToManyLargeCollection.cjs");
|
|
12
|
-
const require_keys = require("../keys.cjs");
|
|
13
13
|
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
14
14
|
const require_index = require("../index.cjs");
|
|
15
15
|
const require_EntityManager = require("../EntityManager.cjs");
|