joist-core 2.3.0-next.97 → 2.3.0-next.98
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/EntityManager.cjs +45 -46
- package/build/EntityManager.cjs.map +1 -1
- package/build/EntityManager.d.cts +7 -7
- package/build/EntityManager.d.mts +7 -7
- 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.js +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.d.cts +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.mts +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.js +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.d.cts +1 -1
- package/build/batchloaders/manyToManyBatchLoader.d.mts +1 -1
- package/build/batchloaders/manyToManyBatchLoader.js +1 -1
- package/build/batchloaders/oneToManyBatchLoader.cjs +1 -1
- package/build/batchloaders/oneToManyBatchLoader.js +1 -1
- package/build/batchloaders/oneToOneBatchLoader.cjs +1 -1
- package/build/batchloaders/oneToOneBatchLoader.js +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.js +2 -2
- package/build/batchloaders/recursiveM2mBatchLoader.cjs +2 -2
- package/build/batchloaders/recursiveM2mBatchLoader.js +2 -2
- package/build/batchloaders/recursiveParentsBatchLoader.cjs +2 -2
- package/build/batchloaders/recursiveParentsBatchLoader.js +2 -2
- 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.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.js +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.js +2 -2
- package/build/dataloaders/lensDataLoader.js.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.cjs +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.js +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.cjs +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.js +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.mts +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/index.cjs +99 -99
- 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 +41 -41
- 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.js +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/loading/IsLoadedCache.js.map +1 -0
- 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/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.mts +2 -2
- package/build/logging/ReactionLogger.js +0 -2
- package/build/logging/ReactionLogger.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.mts +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/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.mts +2 -2
- package/build/preloading/JsonAggregatePreloader.js +1 -4
- package/build/preloading/JsonAggregatePreloader.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/find/Aliases.cjs +1 -1
- package/build/queries/find/Aliases.cjs.map +1 -1
- package/build/queries/find/Aliases.js +1 -1
- package/build/queries/find/Aliases.js.map +1 -1
- package/build/queries/find/QueryParser.cjs +1 -1
- package/build/queries/find/QueryParser.js +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/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.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/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.js.map +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.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.mts +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/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.js +1 -1
- package/build/relations/CustomCollection.d.cts +1 -1
- package/build/relations/CustomCollection.d.mts +1 -1
- package/build/relations/CustomReference.cjs +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/EnumCollection.d.cts +1 -1
- package/build/relations/EnumCollection.d.mts +1 -1
- package/build/relations/LazyField.cjs +4 -4
- package/build/relations/LazyField.js +4 -4
- package/build/relations/ManyToManyCollection.cjs +3 -3
- package/build/relations/ManyToManyCollection.js +3 -3
- package/build/relations/ManyToManyLargeCollection.cjs +3 -3
- package/build/relations/ManyToManyLargeCollection.js +3 -3
- package/build/relations/ManyToOneReference.cjs +4 -4
- package/build/relations/ManyToOneReference.js +4 -4
- 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.js +1 -1
- package/build/relations/OneToOneReference.cjs +5 -5
- package/build/relations/OneToOneReference.js +5 -5
- package/build/relations/PolymorphicReference.cjs +3 -3
- package/build/relations/PolymorphicReference.js +3 -3
- 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/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/Reference.cjs +1 -1
- package/build/relations/Reference.js +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/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/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/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/{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.js +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.cjs.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,7 +1,7 @@
|
|
|
1
1
|
import { AbstractRelationImpl } from "./AbstractRelationImpl.mjs";
|
|
2
2
|
import { RelationT, RelationU } from "./RelationSymbols.mjs";
|
|
3
3
|
import { EnumMetadata } from "../EnumMetadata.mjs";
|
|
4
|
-
import { ManyToManyLike } from "../JoinRows.mjs";
|
|
4
|
+
import { ManyToManyLike } from "../flush/JoinRows.mjs";
|
|
5
5
|
import { EntityMetadata, ManyToManyEnumField } from "../EntityMetadata.mjs";
|
|
6
6
|
import "../index.mjs";
|
|
7
7
|
import { Entity } from "../Entity.mjs";
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../batchloaders/BatchLoader.cjs");
|
|
3
|
-
const require_fields = require("../fields.cjs");
|
|
4
3
|
const require_relations_AbstractPropertyImpl = require("./AbstractPropertyImpl.cjs");
|
|
5
|
-
const require_queries_sql_keywords = require("../queries/sql/keywords.cjs");
|
|
6
|
-
const require_RowData = require("../RowData.cjs");
|
|
7
4
|
const require_relations_PropertySymbols = require("./PropertySymbols.cjs");
|
|
8
5
|
require("./hasProperty.cjs");
|
|
6
|
+
const require_fields = require("../fields.cjs");
|
|
7
|
+
const require_keys = require("../keys.cjs");
|
|
8
|
+
const require_queries_sql_keywords = require("../queries/sql/keywords.cjs");
|
|
9
|
+
const require_RowData = require("../RowData.cjs");
|
|
9
10
|
const require_utils = require("../utils.cjs");
|
|
10
11
|
const require_newEntity = require("../newEntity.cjs");
|
|
11
|
-
const require_keys = require("../keys.cjs");
|
|
12
12
|
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
13
13
|
require("../EntityManager.cjs");
|
|
14
14
|
require("../Entity.cjs");
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import "../batchloaders/BatchLoader.js";
|
|
2
|
-
import { setField } from "../fields.js";
|
|
3
2
|
import { AbstractPropertyImpl } from "./AbstractPropertyImpl.js";
|
|
4
|
-
import { kqDot } from "../queries/sql/keywords.js";
|
|
5
|
-
import { PojoRowData } from "../RowData.js";
|
|
6
3
|
import { PropertyT } from "./PropertySymbols.js";
|
|
7
4
|
import "./hasProperty.js";
|
|
5
|
+
import { setField } from "../fields.js";
|
|
6
|
+
import { keyToNumber, tagId } from "../keys.js";
|
|
7
|
+
import { kqDot } from "../queries/sql/keywords.js";
|
|
8
|
+
import { PojoRowData } from "../RowData.js";
|
|
8
9
|
import { abbreviation } from "../utils.js";
|
|
9
10
|
import { lazyField } from "../newEntity.js";
|
|
10
|
-
import { keyToNumber, tagId } from "../keys.js";
|
|
11
11
|
import { getMetadata } from "../EntityMetadata.js";
|
|
12
12
|
import "../EntityManager.js";
|
|
13
13
|
import "../Entity.js";
|
|
@@ -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,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,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,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,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");
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { getField, setField } from "../fields.js";
|
|
2
1
|
import { AbstractRelationImpl } from "./AbstractRelationImpl.js";
|
|
3
2
|
import { RelationT, RelationU } from "./RelationSymbols.js";
|
|
3
|
+
import { ReferenceN } from "./ReferenceSymbols.js";
|
|
4
|
+
import { getField, setField } from "../fields.js";
|
|
5
|
+
import { deTagId, ensureTagged, maybeResolveReferenceToId, toIdOf, toTaggedId } from "../keys.js";
|
|
4
6
|
import { isCascadeDelete } from "./isCascadeDelete.js";
|
|
5
7
|
import { OneToManyCollection } from "./OneToManyCollection.js";
|
|
6
|
-
import {
|
|
8
|
+
import { OneToManyLargeCollection } from "./OneToManyLargeCollection.js";
|
|
7
9
|
import { OneToOneReferenceImpl } from "./OneToOneReference.js";
|
|
8
10
|
import { fail, maybeAdd, maybeRemove } from "../utils.js";
|
|
9
11
|
import { lazyField } from "../newEntity.js";
|
|
10
|
-
import { OneToManyLargeCollection } from "./OneToManyLargeCollection.js";
|
|
11
|
-
import { deTagId, ensureTagged, maybeResolveReferenceToId, toIdOf, toTaggedId } from "../keys.js";
|
|
12
12
|
import { getMetadata } from "../EntityMetadata.js";
|
|
13
13
|
import { NoIdError, ensureNotDeleted } from "../index.js";
|
|
14
14
|
import { getEmInternalApi, sameEntity } from "../EntityManager.js";
|
|
@@ -1,14 +1,13 @@
|
|
|
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");
|
|
4
5
|
const require_relations_isCascadeDelete = require("./isCascadeDelete.cjs");
|
|
5
6
|
const require_batchloaders_oneToManyBatchLoader = require("../batchloaders/oneToManyBatchLoader.cjs");
|
|
6
7
|
const require_dataloaders_oneToManyFindDataLoader = require("../dataloaders/oneToManyFindDataLoader.cjs");
|
|
7
|
-
require("../IsLoadedCache.cjs");
|
|
8
8
|
require("./ManyToOneReference.cjs");
|
|
9
9
|
const require_utils = require("../utils.cjs");
|
|
10
10
|
const require_newEntity = require("../newEntity.cjs");
|
|
11
|
-
const require_keys = require("../keys.cjs");
|
|
12
11
|
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
13
12
|
const require_index = require("../index.cjs");
|
|
14
13
|
const require_EntityManager = require("../EntityManager.cjs");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OneToManyCollection.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","#field","getInstanceData","#state","getEmInternalApi","#loadPromise","oneToManyBatchLoader","appendStack","#getSorted","#allSorted","oneToManyFindDataLoader","sameEntity","maybeResolveReferenceToId","getMetadataForField","compareValues","isCascadeDelete","RelationT","RelationU","#o2m","#added","#removed","#pendingValues","#percolate","#loaded","#hasBeenSet"],"sources":["../../src/relations/OneToManyCollection.ts"],"sourcesContent":["import { oneToManyBatchLoader } from \"../batchloaders/oneToManyBatchLoader.ts\";\nimport { oneToManyFindDataLoader } from \"../dataloaders/oneToManyFindDataLoader.ts\";\nimport {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type OneToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n maybeResolveReferenceToId,\n sameEntity,\n} from \"../index.ts\";\nimport { type IsLoadedCachable } from \"../IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { compareValues } from \"../utils.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { type ManyToOneReferenceImpl } from \"./ManyToOneReference.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\n/** An alias for creating `OneToManyCollection`s. */\nexport function hasMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const field = getMetadata(entity).allFields[fieldName] as OneToManyField;\n return new OneToManyCollection(entity, field);\n });\n}\n\nexport class OneToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>, IsLoadedCachable\n{\n readonly #field: OneToManyField;\n #state: O2MState<T, U>;\n #loadPromise: any;\n // Constantly filtering+sorting our `.get` values can be surprisingly expensive if called\n // when processing many entities/writing code that calls it repeatedly, so we cache it\n // both the \"without deleted\" default (`getSorted`) and \"all deleted\" (`allSorted`).\n #getSorted: U[] | undefined;\n #allSorted: U[] | undefined;\n\n constructor(entity: T, field: OneToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n } else {\n const { em } = entity;\n // If any m2o.set(ourId) were made before our entity was loaded, pull in those changes\n const pending = getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.get(this.fieldName);\n if (pending) {\n this.#state = new O2MUnloadedAddedRemovedState<T, U>(this, pending.adds as U[], pending.removes as U[]);\n getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.delete(this.fieldName);\n } else {\n this.#state = new O2MUnloadedPristineState<T, U>(this);\n }\n }\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<readonly U[]> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const maybePreloaded = this.getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= oneToManyBatchLoader(this.entity.em, this).load(this.entity.idTagged!))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err as Error, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n return opts?.withDeleted ? this.getWithDeleted : this.get;\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 = `id=${id},${this.#field.otherColumnName}=${this.entity.id}`;\n return oneToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n }\n\n async includes(other: U): Promise<boolean> {\n return sameEntity(this.entity, this.getOtherRelation(other).current());\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#getSorted = undefined;\n this.#allSorted = undefined;\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 this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n }\n\n /** Copy another em's `source` collection into our state. */\n import(source: OneToManyCollection<T, U>, findEntity: (e: U) => U): void {\n this.#state = source.#state.import(this, findEntity);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // todo: this only be a readonly U[]\n get get(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#getSorted !== undefined) return this.#getSorted;\n this.#getSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: false })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#getSorted;\n }\n\n get getWithDeleted(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#allSorted !== undefined) return this.#allSorted;\n this.#allSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: true })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#allSorted;\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n add(other: U): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other);\n this.percolateAdd(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n remove(other: U, opts: { requireLoaded: boolean } = { requireLoaded: true }) {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, opts);\n this.percolateRemove(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\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 // internal impl\n\n /** @internal */\n percolateAdd(other: U): void {\n this.getOtherRelation(other).set(this.entity);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n this.getOtherRelation(other).set(undefined);\n }\n\n /** @internal */\n registerAsMutated(): void {\n getEmInternalApi(this.entity.em).mutatedCollections.add(this);\n }\n\n setFromOpts(others: U[]): void {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n removeIfLoaded(other: U) {\n this.#state = this.#state.removeIfLoaded(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n this.current({ withDeleted: true }).forEach((e) => this.entity.em.delete(e));\n }\n }\n\n // We already unhooked all children in our addedBeforeLoaded list; now load the full list if necessary.\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n current.forEach((other) => {\n const m2o = this.getOtherRelation(other);\n if (maybeResolveReferenceToId(m2o.current({ withDeleted: true })) === this.entity.idMaybe) {\n m2o.set(undefined);\n }\n });\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n public get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n public get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n current(opts?: { withDeleted?: boolean }): U[] {\n return this.filterDeleted(this.#state.current(), opts);\n }\n\n public get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n public get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n public get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n public toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n /** Called after `em.flush` to reset our dirty tracking. */\n public resetAddedRemoved(): void {\n this.#state.resetAddedRemoved();\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 // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n const list =\n opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n if (this.#field.orderBy) {\n const { field, direction } = this.#field.orderBy;\n list.sort((a, b) => compareValues((a as any)[field], (b as any)[field], direction));\n }\n return list;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReferenceImpl<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n private 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 // Exposed for changes\n added(): U[] {\n return this.#state.added();\n }\n\n removed(): U[] {\n return this.#state.removed();\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for OneToManyCollection state machine.\n *\n * States handle only data tracking — side effects (percolation, mutation registration)\n * are handled by the collection methods that call into these states.\n *\n * State transitions:\n * ```\n * Constructor (new entity) → Loaded (empty [])\n * Constructor (existing entity) → UnloadedPristine\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + load/preload → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + load/preload → Loaded (merges adds/removes)\n *\n * PendingSet + add/remove → PendingSet (self)\n * PendingSet + set → PendingSet (self, replace)\n * PendingSet + load/preload → Loaded (diffs pending vs DB)\n *\n * Loaded + forceReload → Loaded (refreshed, re-merges pending)\n * ```\n */\ninterface O2MState<T extends Entity, U extends Entity> {\n add(other: U): O2MState<T, U>;\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U>;\n removeIfLoaded(other: U): O2MState<T, U>;\n set(values: readonly U[]): O2MState<T, U>;\n doGet(): U[];\n find(id: IdOf<U>): U | undefined;\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U>;\n current(): U[];\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n added(): U[];\n removed(): U[];\n resetAddedRemoved(): void;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass O2MUnloadedPristineState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n\n constructor(o2m: OneToManyCollection<T, U>) {\n this.#o2m = o2m;\n }\n\n add(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [other], []);\n }\n\n remove(_other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [_other]);\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [other]);\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n return new O2MLoadedState<T, U>(this.#o2m, dbEntities, false);\n }\n\n current(): U[] {\n return [];\n }\n\n import(target: OneToManyCollection<T, U>, _findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedPristineState<T, U>(target);\n }\n\n added(): U[] {\n return [];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass O2MUnloadedAddedRemovedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n #added: Set<U>;\n #removed: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#o2m = o2m;\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n return this;\n }\n\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n this.#removed.add(other);\n this.#added.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n // We should do the implicit deletion check?\n // Should we keep #added/#removed?\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#added) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // Push added entities on the end to better match the db order of \"newer things come last\"\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n return new O2MLoadedState<T, U>(this.#o2m, [...loaded], false, [...this.#added], [...this.#removed]);\n }\n\n current(): U[] {\n return [...this.#added];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(\n target,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n // This is called after em.flush, so these changes have been pushed into the db; we don't\n // need to track them anymore b/c any future `o2m.load` will see up.\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass O2MPendingSetState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #o2m: OneToManyCollection<T, U>;\n #pendingValues: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, pendingValues: readonly U[], skipPercolate = false) {\n this.#o2m = o2m;\n this.#pendingValues = new Set(pendingValues);\n // We percolate on normal set() calls to immediately update the other side's m2o references.\n // We skip percolation on import() because those entities already have correct references\n // in the cloned EntityManager.\n if (!skipPercolate) this.#percolate();\n getEmInternalApi(o2m.entity.em).pendingLoads.add(o2m);\n }\n\n add(other: U): O2MState<T, U> {\n this.#pendingValues.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#pendingValues = new Set(values);\n this.#percolate();\n return this;\n }\n\n doGet(): U[] {\n return [...this.#pendingValues];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#pendingValues) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n const o2m = this.#o2m;\n const entity = o2m.entity;\n // Handle cascade delete + immutable: entities removed from the collection that\n // cannot have their FK changed should be deleted instead\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n // Calc our added/removed so that `.changes` in the new loaded state are correct\n const dbSet = new Set(dbEntities);\n const added: U[] = [];\n for (const other of this.#pendingValues) {\n if (!dbSet.has(other)) added.push(other);\n }\n const removed: U[] = [];\n for (const other of dbEntities) {\n if (!this.#pendingValues.has(other)) {\n removed.push(other);\n if (isCascade && otherCannotChange) {\n entity.em.delete(other);\n } else {\n o2m.percolateRemove(other);\n }\n }\n }\n return new O2MLoadedState<T, U>(o2m, [...this.#pendingValues], true, added, removed);\n }\n\n current(): U[] {\n return [...this.#pendingValues];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(target, mapEntities([...this.#pendingValues], findEntity), true);\n }\n\n added(): U[] {\n return [...this.#pendingValues];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n\n #percolate(): void {\n const o2m = this.#o2m;\n // All new values, we immediately tell them we're their new parent\n for (const other of this.#pendingValues) {\n o2m.percolateAdd(other);\n }\n // If we're an existing entity, we can scan for any in-memory entities that were previously\n // pointing to us, but now should not\n if (!o2m.entity.isNewEntity) {\n for (const other of o2m.entity.em.getEntities(o2m.otherMeta.cstr) as Iterable<U>) {\n if (this.#pendingValues.has(other)) continue;\n if (sameEntity((other as any)[o2m.otherFieldName].current(), o2m.entity)) {\n o2m.percolateRemove(other);\n }\n }\n }\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass O2MLoadedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = true;\n #o2m: OneToManyCollection<T, U>;\n #loaded: Set<U>;\n #added: Set<U>;\n #removed: Set<U>;\n #hasBeenSet: boolean;\n\n constructor(o2m: OneToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean, added: U[] = [], removed: U[] = []) {\n this.#o2m = o2m;\n this.#loaded = new Set(loaded);\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n this.#loaded.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#removed.add(other);\n this.#added.delete(other);\n this.#loaded.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n this.#loaded.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#hasBeenSet = true;\n let valuesSet = new Set(values);\n\n const o2m = this.#o2m;\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n if (isCascade && otherCannotChange) {\n const implicitlyDeleted = [...this.#loaded].filter((e) => !valuesSet.has(e));\n implicitlyDeleted.forEach((e) => o2m.entity.em.delete(e));\n // ...we restore the implicitlyDeleted for getWithDeleted\n values = [...values, ...implicitlyDeleted];\n valuesSet = new Set(values);\n }\n\n const loaded = new Set(this.#loaded);\n for (const other of loaded) {\n if (!valuesSet.has(other)) o2m.remove(other);\n }\n for (const other of values) {\n if (!loaded.has(other)) o2m.add(other);\n }\n return this;\n }\n\n doGet(): U[] {\n return [...this.#loaded];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const other of this.#loaded) {\n if (!other.isNewEntity && other.id === id) return other;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // On forceReload, replace loaded but preserve pending adds/removes\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n this.#loaded = loaded;\n return this;\n }\n\n current(): U[] {\n return [...this.#loaded];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MLoadedState<T, U>(\n target,\n mapEntities([...this.#loaded], findEntity),\n this.#hasBeenSet,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\nfunction mapEntities<U extends Entity>(entities: U[], findEntity: (e: U) => U): U[] {\n const result = new Array<U>(entities.length);\n for (let i = 0; i < entities.length; i++) result[i] = findEntity(entities[i]);\n return result;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OneToManyCollection.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","#field","getInstanceData","#state","getEmInternalApi","#loadPromise","oneToManyBatchLoader","appendStack","#getSorted","#allSorted","oneToManyFindDataLoader","sameEntity","maybeResolveReferenceToId","getMetadataForField","compareValues","isCascadeDelete","RelationT","RelationU","#o2m","#added","#removed","#pendingValues","#percolate","#loaded","#hasBeenSet"],"sources":["../../src/relations/OneToManyCollection.ts"],"sourcesContent":["import { oneToManyBatchLoader } from \"../batchloaders/oneToManyBatchLoader.ts\";\nimport { oneToManyFindDataLoader } from \"../dataloaders/oneToManyFindDataLoader.ts\";\nimport {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type OneToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n maybeResolveReferenceToId,\n sameEntity,\n} from \"../index.ts\";\nimport type { IsLoadedCachable } from \"../loading/IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { compareValues } from \"../utils.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { type ManyToOneReferenceImpl } from \"./ManyToOneReference.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\n/** An alias for creating `OneToManyCollection`s. */\nexport function hasMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const field = getMetadata(entity).allFields[fieldName] as OneToManyField;\n return new OneToManyCollection(entity, field);\n });\n}\n\nexport class OneToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>, IsLoadedCachable\n{\n readonly #field: OneToManyField;\n #state: O2MState<T, U>;\n #loadPromise: any;\n // Constantly filtering+sorting our `.get` values can be surprisingly expensive if called\n // when processing many entities/writing code that calls it repeatedly, so we cache it\n // both the \"without deleted\" default (`getSorted`) and \"all deleted\" (`allSorted`).\n #getSorted: U[] | undefined;\n #allSorted: U[] | undefined;\n\n constructor(entity: T, field: OneToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n } else {\n const { em } = entity;\n // If any m2o.set(ourId) were made before our entity was loaded, pull in those changes\n const pending = getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.get(this.fieldName);\n if (pending) {\n this.#state = new O2MUnloadedAddedRemovedState<T, U>(this, pending.adds as U[], pending.removes as U[]);\n getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.delete(this.fieldName);\n } else {\n this.#state = new O2MUnloadedPristineState<T, U>(this);\n }\n }\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<readonly U[]> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const maybePreloaded = this.getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= oneToManyBatchLoader(this.entity.em, this).load(this.entity.idTagged!))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err as Error, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n return opts?.withDeleted ? this.getWithDeleted : this.get;\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 = `id=${id},${this.#field.otherColumnName}=${this.entity.id}`;\n return oneToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n }\n\n async includes(other: U): Promise<boolean> {\n return sameEntity(this.entity, this.getOtherRelation(other).current());\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#getSorted = undefined;\n this.#allSorted = undefined;\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 this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n }\n\n /** Copy another em's `source` collection into our state. */\n import(source: OneToManyCollection<T, U>, findEntity: (e: U) => U): void {\n this.#state = source.#state.import(this, findEntity);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // todo: this only be a readonly U[]\n get get(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#getSorted !== undefined) return this.#getSorted;\n this.#getSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: false })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#getSorted;\n }\n\n get getWithDeleted(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#allSorted !== undefined) return this.#allSorted;\n this.#allSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: true })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#allSorted;\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n add(other: U): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other);\n this.percolateAdd(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n remove(other: U, opts: { requireLoaded: boolean } = { requireLoaded: true }) {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, opts);\n this.percolateRemove(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\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 // internal impl\n\n /** @internal */\n percolateAdd(other: U): void {\n this.getOtherRelation(other).set(this.entity);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n this.getOtherRelation(other).set(undefined);\n }\n\n /** @internal */\n registerAsMutated(): void {\n getEmInternalApi(this.entity.em).mutatedCollections.add(this);\n }\n\n setFromOpts(others: U[]): void {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n removeIfLoaded(other: U) {\n this.#state = this.#state.removeIfLoaded(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n this.current({ withDeleted: true }).forEach((e) => this.entity.em.delete(e));\n }\n }\n\n // We already unhooked all children in our addedBeforeLoaded list; now load the full list if necessary.\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n current.forEach((other) => {\n const m2o = this.getOtherRelation(other);\n if (maybeResolveReferenceToId(m2o.current({ withDeleted: true })) === this.entity.idMaybe) {\n m2o.set(undefined);\n }\n });\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n public get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n public get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n current(opts?: { withDeleted?: boolean }): U[] {\n return this.filterDeleted(this.#state.current(), opts);\n }\n\n public get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n public get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n public get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n public toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n /** Called after `em.flush` to reset our dirty tracking. */\n public resetAddedRemoved(): void {\n this.#state.resetAddedRemoved();\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 // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n const list =\n opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n if (this.#field.orderBy) {\n const { field, direction } = this.#field.orderBy;\n list.sort((a, b) => compareValues((a as any)[field], (b as any)[field], direction));\n }\n return list;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReferenceImpl<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n private 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 // Exposed for changes\n added(): U[] {\n return this.#state.added();\n }\n\n removed(): U[] {\n return this.#state.removed();\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for OneToManyCollection state machine.\n *\n * States handle only data tracking — side effects (percolation, mutation registration)\n * are handled by the collection methods that call into these states.\n *\n * State transitions:\n * ```\n * Constructor (new entity) → Loaded (empty [])\n * Constructor (existing entity) → UnloadedPristine\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + load/preload → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + load/preload → Loaded (merges adds/removes)\n *\n * PendingSet + add/remove → PendingSet (self)\n * PendingSet + set → PendingSet (self, replace)\n * PendingSet + load/preload → Loaded (diffs pending vs DB)\n *\n * Loaded + forceReload → Loaded (refreshed, re-merges pending)\n * ```\n */\ninterface O2MState<T extends Entity, U extends Entity> {\n add(other: U): O2MState<T, U>;\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U>;\n removeIfLoaded(other: U): O2MState<T, U>;\n set(values: readonly U[]): O2MState<T, U>;\n doGet(): U[];\n find(id: IdOf<U>): U | undefined;\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U>;\n current(): U[];\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n added(): U[];\n removed(): U[];\n resetAddedRemoved(): void;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass O2MUnloadedPristineState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n\n constructor(o2m: OneToManyCollection<T, U>) {\n this.#o2m = o2m;\n }\n\n add(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [other], []);\n }\n\n remove(_other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [_other]);\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [other]);\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n return new O2MLoadedState<T, U>(this.#o2m, dbEntities, false);\n }\n\n current(): U[] {\n return [];\n }\n\n import(target: OneToManyCollection<T, U>, _findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedPristineState<T, U>(target);\n }\n\n added(): U[] {\n return [];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass O2MUnloadedAddedRemovedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n #added: Set<U>;\n #removed: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#o2m = o2m;\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n return this;\n }\n\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n this.#removed.add(other);\n this.#added.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n // We should do the implicit deletion check?\n // Should we keep #added/#removed?\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#added) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // Push added entities on the end to better match the db order of \"newer things come last\"\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n return new O2MLoadedState<T, U>(this.#o2m, [...loaded], false, [...this.#added], [...this.#removed]);\n }\n\n current(): U[] {\n return [...this.#added];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(\n target,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n // This is called after em.flush, so these changes have been pushed into the db; we don't\n // need to track them anymore b/c any future `o2m.load` will see up.\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass O2MPendingSetState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #o2m: OneToManyCollection<T, U>;\n #pendingValues: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, pendingValues: readonly U[], skipPercolate = false) {\n this.#o2m = o2m;\n this.#pendingValues = new Set(pendingValues);\n // We percolate on normal set() calls to immediately update the other side's m2o references.\n // We skip percolation on import() because those entities already have correct references\n // in the cloned EntityManager.\n if (!skipPercolate) this.#percolate();\n getEmInternalApi(o2m.entity.em).pendingLoads.add(o2m);\n }\n\n add(other: U): O2MState<T, U> {\n this.#pendingValues.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#pendingValues = new Set(values);\n this.#percolate();\n return this;\n }\n\n doGet(): U[] {\n return [...this.#pendingValues];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#pendingValues) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n const o2m = this.#o2m;\n const entity = o2m.entity;\n // Handle cascade delete + immutable: entities removed from the collection that\n // cannot have their FK changed should be deleted instead\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n // Calc our added/removed so that `.changes` in the new loaded state are correct\n const dbSet = new Set(dbEntities);\n const added: U[] = [];\n for (const other of this.#pendingValues) {\n if (!dbSet.has(other)) added.push(other);\n }\n const removed: U[] = [];\n for (const other of dbEntities) {\n if (!this.#pendingValues.has(other)) {\n removed.push(other);\n if (isCascade && otherCannotChange) {\n entity.em.delete(other);\n } else {\n o2m.percolateRemove(other);\n }\n }\n }\n return new O2MLoadedState<T, U>(o2m, [...this.#pendingValues], true, added, removed);\n }\n\n current(): U[] {\n return [...this.#pendingValues];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(target, mapEntities([...this.#pendingValues], findEntity), true);\n }\n\n added(): U[] {\n return [...this.#pendingValues];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n\n #percolate(): void {\n const o2m = this.#o2m;\n // All new values, we immediately tell them we're their new parent\n for (const other of this.#pendingValues) {\n o2m.percolateAdd(other);\n }\n // If we're an existing entity, we can scan for any in-memory entities that were previously\n // pointing to us, but now should not\n if (!o2m.entity.isNewEntity) {\n for (const other of o2m.entity.em.getEntities(o2m.otherMeta.cstr) as Iterable<U>) {\n if (this.#pendingValues.has(other)) continue;\n if (sameEntity((other as any)[o2m.otherFieldName].current(), o2m.entity)) {\n o2m.percolateRemove(other);\n }\n }\n }\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass O2MLoadedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = true;\n #o2m: OneToManyCollection<T, U>;\n #loaded: Set<U>;\n #added: Set<U>;\n #removed: Set<U>;\n #hasBeenSet: boolean;\n\n constructor(o2m: OneToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean, added: U[] = [], removed: U[] = []) {\n this.#o2m = o2m;\n this.#loaded = new Set(loaded);\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n this.#loaded.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#removed.add(other);\n this.#added.delete(other);\n this.#loaded.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n this.#loaded.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#hasBeenSet = true;\n let valuesSet = new Set(values);\n\n const o2m = this.#o2m;\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n if (isCascade && otherCannotChange) {\n const implicitlyDeleted = [...this.#loaded].filter((e) => !valuesSet.has(e));\n implicitlyDeleted.forEach((e) => o2m.entity.em.delete(e));\n // ...we restore the implicitlyDeleted for getWithDeleted\n values = [...values, ...implicitlyDeleted];\n valuesSet = new Set(values);\n }\n\n const loaded = new Set(this.#loaded);\n for (const other of loaded) {\n if (!valuesSet.has(other)) o2m.remove(other);\n }\n for (const other of values) {\n if (!loaded.has(other)) o2m.add(other);\n }\n return this;\n }\n\n doGet(): U[] {\n return [...this.#loaded];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const other of this.#loaded) {\n if (!other.isNewEntity && other.id === id) return other;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // On forceReload, replace loaded but preserve pending adds/removes\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n this.#loaded = loaded;\n return this;\n }\n\n current(): U[] {\n return [...this.#loaded];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MLoadedState<T, U>(\n target,\n mapEntities([...this.#loaded], findEntity),\n this.#hasBeenSet,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\nfunction mapEntities<U extends Entity>(entities: U[], findEntity: (e: U) => U): U[] {\n const result = new Array<U>(entities.length);\n for (let i = 0; i < entities.length; i++) result[i] = findEntity(entities[i]);\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Collection } from "./Collection.cjs";
|
|
2
2
|
import { AbstractRelationImpl } from "./AbstractRelationImpl.cjs";
|
|
3
3
|
import { RelationT, RelationU } from "./RelationSymbols.cjs";
|
|
4
|
-
import { IsLoadedCachable } from "../IsLoadedCache.cjs";
|
|
4
|
+
import { IsLoadedCachable } from "../loading/IsLoadedCache.cjs";
|
|
5
5
|
import { EntityMetadata, OneToManyField } from "../EntityMetadata.cjs";
|
|
6
6
|
import "../index.cjs";
|
|
7
7
|
import { IdOf } from "../EntityManager.cjs";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Collection } from "./Collection.mjs";
|
|
2
2
|
import { AbstractRelationImpl } from "./AbstractRelationImpl.mjs";
|
|
3
3
|
import { RelationT, RelationU } from "./RelationSymbols.mjs";
|
|
4
|
-
import { IsLoadedCachable } from "../IsLoadedCache.mjs";
|
|
4
|
+
import { IsLoadedCachable } from "../loading/IsLoadedCache.mjs";
|
|
5
5
|
import { EntityMetadata, OneToManyField } from "../EntityMetadata.mjs";
|
|
6
6
|
import "../index.mjs";
|
|
7
7
|
import { IdOf } from "../EntityManager.mjs";
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { AbstractRelationImpl } from "./AbstractRelationImpl.js";
|
|
2
2
|
import { RelationT, RelationU } from "./RelationSymbols.js";
|
|
3
|
+
import { maybeResolveReferenceToId } from "../keys.js";
|
|
3
4
|
import { isCascadeDelete } from "./isCascadeDelete.js";
|
|
4
5
|
import { oneToManyBatchLoader } from "../batchloaders/oneToManyBatchLoader.js";
|
|
5
6
|
import { oneToManyFindDataLoader } from "../dataloaders/oneToManyFindDataLoader.js";
|
|
6
|
-
import "../IsLoadedCache.js";
|
|
7
7
|
import "./ManyToOneReference.js";
|
|
8
8
|
import { compareValues } from "../utils.js";
|
|
9
9
|
import { lazyField } from "../newEntity.js";
|
|
10
|
-
import { maybeResolveReferenceToId } from "../keys.js";
|
|
11
10
|
import { getMetadata, getMetadataForField } from "../EntityMetadata.js";
|
|
12
11
|
import { ensureNotDeleted } from "../index.js";
|
|
13
12
|
import { appendStack, getEmInternalApi, sameEntity } from "../EntityManager.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OneToManyCollection.js","names":["#field","#state","#loadPromise","#getSorted","#allSorted","#o2m","#added","#removed","#pendingValues","#percolate","#loaded","#hasBeenSet"],"sources":["../../src/relations/OneToManyCollection.ts"],"sourcesContent":["import { oneToManyBatchLoader } from \"../batchloaders/oneToManyBatchLoader.ts\";\nimport { oneToManyFindDataLoader } from \"../dataloaders/oneToManyFindDataLoader.ts\";\nimport {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type OneToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n maybeResolveReferenceToId,\n sameEntity,\n} from \"../index.ts\";\nimport { type IsLoadedCachable } from \"../IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { compareValues } from \"../utils.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { type ManyToOneReferenceImpl } from \"./ManyToOneReference.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\n/** An alias for creating `OneToManyCollection`s. */\nexport function hasMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const field = getMetadata(entity).allFields[fieldName] as OneToManyField;\n return new OneToManyCollection(entity, field);\n });\n}\n\nexport class OneToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>, IsLoadedCachable\n{\n readonly #field: OneToManyField;\n #state: O2MState<T, U>;\n #loadPromise: any;\n // Constantly filtering+sorting our `.get` values can be surprisingly expensive if called\n // when processing many entities/writing code that calls it repeatedly, so we cache it\n // both the \"without deleted\" default (`getSorted`) and \"all deleted\" (`allSorted`).\n #getSorted: U[] | undefined;\n #allSorted: U[] | undefined;\n\n constructor(entity: T, field: OneToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n } else {\n const { em } = entity;\n // If any m2o.set(ourId) were made before our entity was loaded, pull in those changes\n const pending = getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.get(this.fieldName);\n if (pending) {\n this.#state = new O2MUnloadedAddedRemovedState<T, U>(this, pending.adds as U[], pending.removes as U[]);\n getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.delete(this.fieldName);\n } else {\n this.#state = new O2MUnloadedPristineState<T, U>(this);\n }\n }\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<readonly U[]> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const maybePreloaded = this.getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= oneToManyBatchLoader(this.entity.em, this).load(this.entity.idTagged!))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err as Error, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n return opts?.withDeleted ? this.getWithDeleted : this.get;\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 = `id=${id},${this.#field.otherColumnName}=${this.entity.id}`;\n return oneToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n }\n\n async includes(other: U): Promise<boolean> {\n return sameEntity(this.entity, this.getOtherRelation(other).current());\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#getSorted = undefined;\n this.#allSorted = undefined;\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 this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n }\n\n /** Copy another em's `source` collection into our state. */\n import(source: OneToManyCollection<T, U>, findEntity: (e: U) => U): void {\n this.#state = source.#state.import(this, findEntity);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // todo: this only be a readonly U[]\n get get(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#getSorted !== undefined) return this.#getSorted;\n this.#getSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: false })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#getSorted;\n }\n\n get getWithDeleted(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#allSorted !== undefined) return this.#allSorted;\n this.#allSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: true })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#allSorted;\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n add(other: U): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other);\n this.percolateAdd(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n remove(other: U, opts: { requireLoaded: boolean } = { requireLoaded: true }) {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, opts);\n this.percolateRemove(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\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 // internal impl\n\n /** @internal */\n percolateAdd(other: U): void {\n this.getOtherRelation(other).set(this.entity);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n this.getOtherRelation(other).set(undefined);\n }\n\n /** @internal */\n registerAsMutated(): void {\n getEmInternalApi(this.entity.em).mutatedCollections.add(this);\n }\n\n setFromOpts(others: U[]): void {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n removeIfLoaded(other: U) {\n this.#state = this.#state.removeIfLoaded(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n this.current({ withDeleted: true }).forEach((e) => this.entity.em.delete(e));\n }\n }\n\n // We already unhooked all children in our addedBeforeLoaded list; now load the full list if necessary.\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n current.forEach((other) => {\n const m2o = this.getOtherRelation(other);\n if (maybeResolveReferenceToId(m2o.current({ withDeleted: true })) === this.entity.idMaybe) {\n m2o.set(undefined);\n }\n });\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n public get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n public get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n current(opts?: { withDeleted?: boolean }): U[] {\n return this.filterDeleted(this.#state.current(), opts);\n }\n\n public get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n public get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n public get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n public toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n /** Called after `em.flush` to reset our dirty tracking. */\n public resetAddedRemoved(): void {\n this.#state.resetAddedRemoved();\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 // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n const list =\n opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n if (this.#field.orderBy) {\n const { field, direction } = this.#field.orderBy;\n list.sort((a, b) => compareValues((a as any)[field], (b as any)[field], direction));\n }\n return list;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReferenceImpl<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n private 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 // Exposed for changes\n added(): U[] {\n return this.#state.added();\n }\n\n removed(): U[] {\n return this.#state.removed();\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for OneToManyCollection state machine.\n *\n * States handle only data tracking — side effects (percolation, mutation registration)\n * are handled by the collection methods that call into these states.\n *\n * State transitions:\n * ```\n * Constructor (new entity) → Loaded (empty [])\n * Constructor (existing entity) → UnloadedPristine\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + load/preload → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + load/preload → Loaded (merges adds/removes)\n *\n * PendingSet + add/remove → PendingSet (self)\n * PendingSet + set → PendingSet (self, replace)\n * PendingSet + load/preload → Loaded (diffs pending vs DB)\n *\n * Loaded + forceReload → Loaded (refreshed, re-merges pending)\n * ```\n */\ninterface O2MState<T extends Entity, U extends Entity> {\n add(other: U): O2MState<T, U>;\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U>;\n removeIfLoaded(other: U): O2MState<T, U>;\n set(values: readonly U[]): O2MState<T, U>;\n doGet(): U[];\n find(id: IdOf<U>): U | undefined;\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U>;\n current(): U[];\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n added(): U[];\n removed(): U[];\n resetAddedRemoved(): void;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass O2MUnloadedPristineState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n\n constructor(o2m: OneToManyCollection<T, U>) {\n this.#o2m = o2m;\n }\n\n add(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [other], []);\n }\n\n remove(_other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [_other]);\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [other]);\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n return new O2MLoadedState<T, U>(this.#o2m, dbEntities, false);\n }\n\n current(): U[] {\n return [];\n }\n\n import(target: OneToManyCollection<T, U>, _findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedPristineState<T, U>(target);\n }\n\n added(): U[] {\n return [];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass O2MUnloadedAddedRemovedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n #added: Set<U>;\n #removed: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#o2m = o2m;\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n return this;\n }\n\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n this.#removed.add(other);\n this.#added.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n // We should do the implicit deletion check?\n // Should we keep #added/#removed?\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#added) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // Push added entities on the end to better match the db order of \"newer things come last\"\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n return new O2MLoadedState<T, U>(this.#o2m, [...loaded], false, [...this.#added], [...this.#removed]);\n }\n\n current(): U[] {\n return [...this.#added];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(\n target,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n // This is called after em.flush, so these changes have been pushed into the db; we don't\n // need to track them anymore b/c any future `o2m.load` will see up.\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass O2MPendingSetState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #o2m: OneToManyCollection<T, U>;\n #pendingValues: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, pendingValues: readonly U[], skipPercolate = false) {\n this.#o2m = o2m;\n this.#pendingValues = new Set(pendingValues);\n // We percolate on normal set() calls to immediately update the other side's m2o references.\n // We skip percolation on import() because those entities already have correct references\n // in the cloned EntityManager.\n if (!skipPercolate) this.#percolate();\n getEmInternalApi(o2m.entity.em).pendingLoads.add(o2m);\n }\n\n add(other: U): O2MState<T, U> {\n this.#pendingValues.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#pendingValues = new Set(values);\n this.#percolate();\n return this;\n }\n\n doGet(): U[] {\n return [...this.#pendingValues];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#pendingValues) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n const o2m = this.#o2m;\n const entity = o2m.entity;\n // Handle cascade delete + immutable: entities removed from the collection that\n // cannot have their FK changed should be deleted instead\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n // Calc our added/removed so that `.changes` in the new loaded state are correct\n const dbSet = new Set(dbEntities);\n const added: U[] = [];\n for (const other of this.#pendingValues) {\n if (!dbSet.has(other)) added.push(other);\n }\n const removed: U[] = [];\n for (const other of dbEntities) {\n if (!this.#pendingValues.has(other)) {\n removed.push(other);\n if (isCascade && otherCannotChange) {\n entity.em.delete(other);\n } else {\n o2m.percolateRemove(other);\n }\n }\n }\n return new O2MLoadedState<T, U>(o2m, [...this.#pendingValues], true, added, removed);\n }\n\n current(): U[] {\n return [...this.#pendingValues];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(target, mapEntities([...this.#pendingValues], findEntity), true);\n }\n\n added(): U[] {\n return [...this.#pendingValues];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n\n #percolate(): void {\n const o2m = this.#o2m;\n // All new values, we immediately tell them we're their new parent\n for (const other of this.#pendingValues) {\n o2m.percolateAdd(other);\n }\n // If we're an existing entity, we can scan for any in-memory entities that were previously\n // pointing to us, but now should not\n if (!o2m.entity.isNewEntity) {\n for (const other of o2m.entity.em.getEntities(o2m.otherMeta.cstr) as Iterable<U>) {\n if (this.#pendingValues.has(other)) continue;\n if (sameEntity((other as any)[o2m.otherFieldName].current(), o2m.entity)) {\n o2m.percolateRemove(other);\n }\n }\n }\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass O2MLoadedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = true;\n #o2m: OneToManyCollection<T, U>;\n #loaded: Set<U>;\n #added: Set<U>;\n #removed: Set<U>;\n #hasBeenSet: boolean;\n\n constructor(o2m: OneToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean, added: U[] = [], removed: U[] = []) {\n this.#o2m = o2m;\n this.#loaded = new Set(loaded);\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n this.#loaded.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#removed.add(other);\n this.#added.delete(other);\n this.#loaded.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n this.#loaded.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#hasBeenSet = true;\n let valuesSet = new Set(values);\n\n const o2m = this.#o2m;\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n if (isCascade && otherCannotChange) {\n const implicitlyDeleted = [...this.#loaded].filter((e) => !valuesSet.has(e));\n implicitlyDeleted.forEach((e) => o2m.entity.em.delete(e));\n // ...we restore the implicitlyDeleted for getWithDeleted\n values = [...values, ...implicitlyDeleted];\n valuesSet = new Set(values);\n }\n\n const loaded = new Set(this.#loaded);\n for (const other of loaded) {\n if (!valuesSet.has(other)) o2m.remove(other);\n }\n for (const other of values) {\n if (!loaded.has(other)) o2m.add(other);\n }\n return this;\n }\n\n doGet(): U[] {\n return [...this.#loaded];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const other of this.#loaded) {\n if (!other.isNewEntity && other.id === id) return other;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // On forceReload, replace loaded but preserve pending adds/removes\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n this.#loaded = loaded;\n return this;\n }\n\n current(): U[] {\n return [...this.#loaded];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MLoadedState<T, U>(\n target,\n mapEntities([...this.#loaded], findEntity),\n this.#hasBeenSet,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\nfunction mapEntities<U extends Entity>(entities: U[], findEntity: (e: U) => U): U[] {\n const result = new Array<U>(entities.length);\n for (let i = 0; i < entities.length; i++) result[i] = findEntity(entities[i]);\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA0BA,SAAgB,UAAgE;CAC9E,OAAO,WAAW,QAAW,cAAc;EACzC,MAAM,QAAQ,YAAY,MAAM,CAAC,CAAC,UAAU;EAC5C,OAAO,IAAI,oBAAoB,QAAQ,KAAK;CAC9C,CAAC;AACH;AAEA,IAAa,sBAAb,cACU,qBAEV;CACE;CACA;CACA;CAIA;CACA;CAEA,YAAY,QAAW,OAAuB;EAC5C,MAAM,MAAM;EACZ,KAAKA,SAAS;EACd,IAAI,gBAAgB,MAAM,CAAC,CAAC,YAC1B,KAAKC,SAAS,IAAI,eAAqB,MAAM,CAAC,GAAG,KAAK;OACjD;GACL,MAAM,EAAE,OAAO;GAEf,MAAM,UAAU,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,IAAI,OAAO,QAAS,CAAC,EAAE,IAAI,KAAK,SAAS;GAC/F,IAAI,SAAS;IACX,KAAKA,SAAS,IAAI,6BAAmC,MAAM,QAAQ,MAAa,QAAQ,OAAc;IACtG,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,IAAI,OAAO,QAAS,CAAC,EAAE,OAAO,KAAK,SAAS;GACpF,OACE,KAAKA,SAAS,IAAI,yBAA+B,IAAI;EAEzD;CACF;CAGA,MAAM,KAAK,OAAyD,CAAC,GAA0B;EAC7F,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,CAAC,KAAKA,OAAO,YAAa,KAAK,eAAe,CAAC,KAAK,OAAO,aAAc;GAC3E,MAAM,iBAAiB,KAAK,aAAa;GACzC,IAAI,gBACF,KAAKA,SAAS,KAAKA,OAAO,UAAU,cAAc;QAElD,OAAO,KAAKC,iBAAiB,qBAAqB,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,QAAS,EAAA,CAC/F,WAAW,KAAK,QAAQ,CAAC,CAAC,CAC1B,MAAM,SAAS,KAAK,KAAU;IAC7B,MAAM,YAAY,qBAAc,IAAI,MAAM,CAAC;GAC7C,CAAC,CAAC,CACD,cAAc;IACb,KAAKA,eAAe,KAAA;GACtB,CAAC;GAEL,KAAKC,aAAa,KAAA;GAClB,KAAKC,aAAa,KAAA;EACpB;EACA,OAAO,MAAM,cAAc,KAAK,iBAAiB,KAAK;CACxD;CAEA,MAAM,KAAK,IAAqC;EAC9C,iBAAiB,KAAK,QAAQ,SAAS;EACvC,MAAM,WAAW,KAAKH,OAAO,KAAK,EAAE;EACpC,IAAI,UAAU,OAAO;EACrB,IAAI,KAAKA,OAAO,UAAU,OAAO,KAAA;EACjC,MAAM,MAAM,MAAM,GAAG,GAAG,KAAKD,OAAO,gBAAgB,GAAG,KAAK,OAAO;EACnE,OAAO,wBAAwB,KAAK,OAAO,IAAI,IAAI,CAAC,CACjD,KAAK,GAAG,CAAC,CACT,MAAM,SAAS,KAAK,KAAK;GACxB,MAAM,YAAY,qBAAK,IAAI,MAAM,CAAC;EACpC,CAAC;CACL;CAEA,MAAM,SAAS,OAA4B;EACzC,OAAO,WAAW,KAAK,QAAQ,KAAK,iBAAiB,KAAK,CAAC,CAAC,QAAQ,CAAC;CACvE;CAEA,IAAI,WAAoB;EACtB,OAAO,KAAKC,OAAO;CACrB;CAEA,gBAAsB;EACpB,KAAKE,aAAa,KAAA;EAClB,KAAKC,aAAa,KAAA;CACpB;CAEA,IAAI,cAAuB;EACzB,OAAO,CAAC,CAAC,KAAK,aAAa;CAC7B;CAEA,UAAgB;EACd,MAAM,YAAY,KAAK,aAAa;EACpC,IAAI,WAAW;GACb,KAAKH,SAAS,KAAKA,OAAO,UAAU,SAAS;GAC7C,KAAKE,aAAa,KAAA;GAClB,KAAKC,aAAa,KAAA;EACpB;CACF;;CAGA,OAAO,QAAmC,YAA+B;EACvE,KAAKH,SAAS,OAAOA,OAAO,OAAO,MAAM,UAAU;EACnD,KAAKE,aAAa,KAAA;EAClB,KAAKC,aAAa,KAAA;CACpB;CAGA,IAAI,MAAW;EACb,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,KAAKD,eAAe,KAAA,GAAW,OAAO,KAAKA;EAC/C,KAAKA,aAAa,OAAO,OAAO,KAAK,cAAc,KAAKF,OAAO,MAAM,GAAG,EAAE,aAAa,MAAM,CAAC,CAAC;EAC/F,iBAAiB,KAAK,OAAO,EAAE,CAAC,CAAC,cAAc,SAAS,IAAI;EAC5D,OAAO,KAAKE;CACd;CAEA,IAAI,iBAAsB;EACxB,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,KAAKC,eAAe,KAAA,GAAW,OAAO,KAAKA;EAC/C,KAAKA,aAAa,OAAO,OAAO,KAAK,cAAc,KAAKH,OAAO,MAAM,GAAG,EAAE,aAAa,KAAK,CAAC,CAAC;EAC9F,iBAAiB,KAAK,OAAO,EAAE,CAAC,CAAC,cAAc,SAAS,IAAI;EAC5D,OAAO,KAAKG;CACd;CAEA,IAAI,QAA4B;EAC9B,iBAAiB,KAAK,MAAM;EAC5B,KAAKH,SAAS,KAAKA,OAAO,IAAI,MAAM;EACpC,KAAK,kBAAkB;EACvB,KAAKE,aAAa,KAAA;EAClB,KAAKC,aAAa,KAAA;CACpB;CAEA,IAAI,OAAgB;EAClB,iBAAiB,KAAK,MAAM;EAC5B,KAAKH,SAAS,KAAKA,OAAO,IAAI,KAAK;EACnC,KAAK,aAAa,KAAK;EACvB,KAAK,kBAAkB;EACvB,KAAKE,aAAa,KAAA;EAClB,KAAKC,aAAa,KAAA;CACpB;CAEA,OAAO,OAAU,OAAmC,EAAE,eAAe,KAAK,GAAG;EAC3E,iBAAiB,KAAK,QAAQ,SAAS;EACvC,KAAKH,SAAS,KAAKA,OAAO,OAAO,OAAO,IAAI;EAC5C,KAAK,gBAAgB,KAAK;EAC1B,KAAK,kBAAkB;EACvB,KAAKE,aAAa,KAAA;EAClB,KAAKC,aAAa,KAAA;CACpB;CAEA,YAAkB;EAChB,iBAAiB,KAAK,MAAM;EAC5B,IAAI,CAAC,KAAKH,OAAO,UACf,MAAM,IAAI,MAAM,sCAAsC;EAExD,KAAK,MAAM,SAAS,CAAC,GAAG,KAAKA,OAAO,MAAM,CAAC,GACzC,KAAK,OAAO,KAAK;CAErB;;CAKA,aAAa,OAAgB;EAC3B,KAAK,iBAAiB,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM;CAC9C;;CAGA,gBAAgB,OAAgB;EAC9B,KAAK,iBAAiB,KAAK,CAAC,CAAC,IAAI,KAAA,CAAS;CAC5C;;CAGA,oBAA0B;EACxB,iBAAiB,KAAK,OAAO,EAAE,CAAC,CAAC,mBAAmB,IAAI,IAAI;CAC9D;CAEA,YAAY,QAAmB;EAC7B,KAAKA,SAAS,IAAI,eAAqB,MAAM,CAAC,GAAG,KAAK;EACtD,OAAO,SAAS,MAAM,KAAK,IAAI,CAAC,CAAC;CACnC;CAEA,eAAe,OAAU;EACvB,KAAKA,SAAS,KAAKA,OAAO,eAAe,KAAK;EAC9C,KAAK,kBAAkB;EACvB,KAAKE,aAAa,KAAA;EAClB,KAAKC,aAAa,KAAA;CACpB;CAEA,qBAA2B;EACzB,IAAI,KAAK,iBACP,KAAK,QAAQ,EAAE,aAAa,KAAK,CAAC,CAAC,CAAC,SAAS,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,CAAC;CAE/E;CAGA,MAAM,yBAAwC;EAE5C,IAAI,KAAK,iBAAiB;EAE1B,CAAA,MADsB,KAAK,KAAK,EAAE,aAAa,KAAK,CAAC,EAAA,CAC7C,SAAS,UAAU;GACzB,MAAM,MAAM,KAAK,iBAAiB,KAAK;GACvC,IAAI,0BAA0B,IAAI,QAAQ,EAAE,aAAa,KAAK,CAAC,CAAC,MAAM,KAAK,OAAO,SAChF,IAAI,IAAI,KAAA,CAAS;EAErB,CAAC;EACD,KAAKH,SAAS,IAAI,eAAqB,MAAM,CAAC,GAAG,KAAK;EACtD,KAAKE,aAAa,KAAA;EAClB,KAAKC,aAAa,KAAA;CACpB;CAGA,IAAW,YAA8B;EACvC,OAAO,KAAKJ,OAAO;CACrB;CAEA,IAAW,iBAAmC;EAC5C,OAAO,KAAKA,OAAO;CACrB;CAEA,QAAQ,MAAuC;EAC7C,OAAO,KAAK,cAAc,KAAKC,OAAO,QAAQ,GAAG,IAAI;CACvD;CAEA,IAAW,OAAuB;EAChC,OAAO,oBAAoB,YAAY,KAAK,MAAM,GAAG,KAAK,SAAS;CACrE;CAEA,IAAW,YAA4B;EACrC,OAAO,KAAKD,OAAO,cAAc;CACnC;CAEA,IAAW,aAAsB;EAC/B,OAAO,KAAKC,OAAO;CACrB;CAEA,WAA0B;EACxB,OAAO,+BAA+B,KAAK,OAAO,eAAe,KAAK,UAAU,eAAe,KAAK,UAAU,KAAK,oBAAoB,KAAK,eAAe;CAC7J;;CAGA,oBAAiC;EAC/B,KAAKA,OAAO,kBAAkB;CAChC;;CAGA,cAAsB,UAAe,MAAuC;EAE1E,MAAM,qBAAqB,KAAKD,OAAO,gBAAgB;EACvD,MAAM,OACJ,MAAM,gBAAgB,OAClB,CAAC,GAAG,QAAQ,IACZ,SAAS,QAAQ,MAAM,CAAC,EAAE,oBAAoB,sBAAsB,CAAE,EAAU,oBAAoB;EAC1G,IAAI,KAAKA,OAAO,SAAS;GACvB,MAAM,EAAE,OAAO,cAAc,KAAKA,OAAO;GACzC,KAAK,MAAM,GAAG,MAAM,cAAe,EAAU,QAAS,EAAU,QAAQ,SAAS,CAAC;EACpF;EACA,OAAO;CACT;;CAGA,iBAAyB,OAA6C;EACpE,OAAQ,MAAY,KAAK;CAC3B;CAEA,IAAY,kBAA2B;EACrC,OAAO,gBAAgB,MAAM,KAAK,SAAS;CAC7C;CAEA,eAAwC;EACtC,IAAI,KAAK,OAAO,aAAa,OAAO,KAAA;EACpC,OAAO,iBAAiB,KAAK,OAAO,EAAE,CAAC,CAAC,qBAAwB,KAAK,OAAO,UAAU,KAAK,SAAS;CACtG;CAGA,QAAa;EACX,OAAO,KAAKC,OAAO,MAAM;CAC3B;CAEA,UAAe;EACb,OAAO,KAAKA,OAAO,QAAQ;CAC7B;CAEA,CAAC,aAAgB;CACjB,CAAC,aAAgB;AACnB;;AA6CA,IAAM,2BAAN,MAAM,yBAAuF;CAC3F,WAAoB;CACpB,aAAsB;CACtB;CAEA,YAAY,KAAgC;EAC1C,KAAKI,OAAO;CACd;CAEA,IAAI,OAA0B;EAC5B,OAAO,IAAI,6BAAmC,KAAKA,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;CACtE;CAEA,OAAO,QAAW,MAAkD;EAClE,IAAI,KAAK,eACP,MAAM,IAAI,MAAM,mCAAmC;EAErD,OAAO,IAAI,6BAAmC,KAAKA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;CACvE;CAEA,eAAe,OAA0B;EACvC,OAAO,IAAI,6BAAmC,KAAKA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;CACtE;CAEA,IAAI,QAAsC;EACxC,OAAO,IAAI,mBAAyB,KAAKA,MAAM,MAAM;CACvD;CAEA,QAAa;EACX,MAAM,IAAI,MAAM,gCAAgC;CAClD;CAEA,KAAK,KAA6B,CAElC;CAEA,UAAU,YAAuC;EAC/C,OAAO,IAAI,eAAqB,KAAKA,MAAM,YAAY,KAAK;CAC9D;CAEA,UAAe;EACb,OAAO,CAAC;CACV;CAEA,OAAO,QAAmC,aAA0C;EAClF,OAAO,IAAI,yBAA+B,MAAM;CAClD;CAEA,QAAa;EACX,OAAO,CAAC;CACV;CAEA,UAAe;EACb,OAAO,CAAC;CACV;CAEA,oBAA0B,CAAC;AAC7B;;AAGA,IAAM,+BAAN,MAAM,6BAA2F;CAC/F,WAAoB;CACpB,aAAsB;CACtB;CACA;CACA;CAEA,YAAY,KAAgC,OAAY,SAAc;EACpE,KAAKA,OAAO;EACZ,KAAKC,SAAS,IAAI,IAAI,KAAK;EAC3B,KAAKC,WAAW,IAAI,IAAI,OAAO;CACjC;CAEA,IAAI,OAA0B;EAC5B,KAAKD,OAAO,IAAI,KAAK;EACrB,KAAKC,SAAS,OAAO,KAAK;EAC1B,OAAO;CACT;CAEA,OAAO,OAAU,MAAkD;EACjE,IAAI,KAAK,eACP,MAAM,IAAI,MAAM,mCAAmC;EAErD,KAAKA,SAAS,IAAI,KAAK;EACvB,KAAKD,OAAO,OAAO,KAAK;EACxB,OAAO;CACT;CAEA,eAAe,OAA0B;EACvC,KAAKA,OAAO,OAAO,KAAK;EACxB,KAAKC,SAAS,IAAI,KAAK;EACvB,OAAO;CACT;CAEA,IAAI,QAAsC;EAGxC,OAAO,IAAI,mBAAyB,KAAKF,MAAM,MAAM;CACvD;CAEA,QAAa;EACX,MAAM,IAAI,MAAM,gCAAgC;CAClD;CAEA,KAAK,IAA4B;EAC/B,KAAK,MAAM,KAAK,KAAKC,QACnB,IAAI,CAAC,EAAE,eAAe,EAAE,OAAO,IAAI,OAAO;CAG9C;CAEA,UAAU,YAAuC;EAE/C,MAAM,SAAS,IAAI,IAAI,UAAU;EACjC,KAAK,MAAM,KAAK,KAAKA,QAAQ,OAAO,IAAI,CAAC;EACzC,KAAK,MAAM,KAAK,KAAKC,UAAU,OAAO,OAAO,CAAC;EAC9C,OAAO,IAAI,eAAqB,KAAKF,MAAM,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,KAAKC,MAAM,GAAG,CAAC,GAAG,KAAKC,QAAQ,CAAC;CACrG;CAEA,UAAe;EACb,OAAO,CAAC,GAAG,KAAKD,MAAM;CACxB;CAEA,OAAO,QAAmC,YAAyC;EACjF,OAAO,IAAI,6BACT,QACA,YAAY,CAAC,GAAG,KAAKA,MAAM,GAAG,UAAU,GACxC,YAAY,CAAC,GAAG,KAAKC,QAAQ,GAAG,UAAU,CAC5C;CACF;CAEA,QAAa;EACX,OAAO,CAAC,GAAG,KAAKD,MAAM;CACxB;CAEA,UAAe;EACb,OAAO,CAAC,GAAG,KAAKC,QAAQ;CAC1B;CAEA,oBAA0B;EAGxB,KAAKD,yBAAS,IAAI,IAAI;EACtB,KAAKC,2BAAW,IAAI,IAAI;CAC1B;AACF;;AAGA,IAAM,qBAAN,MAAM,mBAAiF;CACrF,WAAoB;CACpB,aAAsB;CACtB;CACA;CAEA,YAAY,KAAgC,eAA6B,gBAAgB,OAAO;EAC9F,KAAKF,OAAO;EACZ,KAAKG,iBAAiB,IAAI,IAAI,aAAa;EAI3C,IAAI,CAAC,eAAe,KAAKC,WAAW;EACpC,iBAAiB,IAAI,OAAO,EAAE,CAAC,CAAC,aAAa,IAAI,GAAG;CACtD;CAEA,IAAI,OAA0B;EAC5B,KAAKD,eAAe,IAAI,KAAK;EAC7B,OAAO;CACT;CAEA,OAAO,OAAU,OAAmD;EAClE,KAAKA,eAAe,OAAO,KAAK;EAChC,OAAO;CACT;CAEA,eAAe,OAA0B;EACvC,KAAKA,eAAe,OAAO,KAAK;EAChC,OAAO;CACT;CAEA,IAAI,QAAsC;EACxC,KAAKA,iBAAiB,IAAI,IAAI,MAAM;EACpC,KAAKC,WAAW;EAChB,OAAO;CACT;CAEA,QAAa;EACX,OAAO,CAAC,GAAG,KAAKD,cAAc;CAChC;CAEA,KAAK,IAA4B;EAC/B,KAAK,MAAM,KAAK,KAAKA,gBACnB,IAAI,CAAC,EAAE,eAAe,EAAE,OAAO,IAAI,OAAO;CAG9C;CAEA,UAAU,YAAuC;EAC/C,MAAM,MAAM,KAAKH;EACjB,MAAM,SAAS,IAAI;EAGnB,MAAM,oBAAoB,IAAI,UAAU,UAAU,IAAI,eAAe,CAAC;EACtE,MAAM,YAAY,gBAAgB,KAAK,IAAI,SAAS;EAEpD,MAAM,QAAQ,IAAI,IAAI,UAAU;EAChC,MAAM,QAAa,CAAC;EACpB,KAAK,MAAM,SAAS,KAAKG,gBACvB,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,MAAM,KAAK,KAAK;EAEzC,MAAM,UAAe,CAAC;EACtB,KAAK,MAAM,SAAS,YAClB,IAAI,CAAC,KAAKA,eAAe,IAAI,KAAK,GAAG;GACnC,QAAQ,KAAK,KAAK;GAClB,IAAI,aAAa,mBACf,OAAO,GAAG,OAAO,KAAK;QAEtB,IAAI,gBAAgB,KAAK;EAE7B;EAEF,OAAO,IAAI,eAAqB,KAAK,CAAC,GAAG,KAAKA,cAAc,GAAG,MAAM,OAAO,OAAO;CACrF;CAEA,UAAe;EACb,OAAO,CAAC,GAAG,KAAKA,cAAc;CAChC;CAEA,OAAO,QAAmC,YAAyC;EACjF,OAAO,IAAI,mBAAyB,QAAQ,YAAY,CAAC,GAAG,KAAKA,cAAc,GAAG,UAAU,GAAG,IAAI;CACrG;CAEA,QAAa;EACX,OAAO,CAAC,GAAG,KAAKA,cAAc;CAChC;CAEA,UAAe;EACb,OAAO,CAAC;CACV;CAEA,oBAA0B,CAAC;CAE3B,aAAmB;EACjB,MAAM,MAAM,KAAKH;EAEjB,KAAK,MAAM,SAAS,KAAKG,gBACvB,IAAI,aAAa,KAAK;EAIxB,IAAI,CAAC,IAAI,OAAO,aACd,KAAK,MAAM,SAAS,IAAI,OAAO,GAAG,YAAY,IAAI,UAAU,IAAI,GAAkB;GAChF,IAAI,KAAKA,eAAe,IAAI,KAAK,GAAG;GACpC,IAAI,WAAY,MAAc,IAAI,eAAe,CAAC,QAAQ,GAAG,IAAI,MAAM,GACrE,IAAI,gBAAgB,KAAK;EAE7B;CAEJ;AACF;;AAGA,IAAM,iBAAN,MAAM,eAA6E;CACjF,WAAoB;CACpB;CACA;CACA;CACA;CACA;CAEA,YAAY,KAAgC,QAAa,YAAqB,QAAa,CAAC,GAAG,UAAe,CAAC,GAAG;EAChH,KAAKH,OAAO;EACZ,KAAKK,UAAU,IAAI,IAAI,MAAM;EAC7B,KAAKJ,SAAS,IAAI,IAAI,KAAK;EAC3B,KAAKC,WAAW,IAAI,IAAI,OAAO;EAC/B,KAAKI,cAAc;CACrB;CAEA,IAAI,aAAsB;EACxB,OAAO,KAAKA;CACd;CAEA,IAAI,OAA0B;EAC5B,KAAKL,OAAO,IAAI,KAAK;EACrB,KAAKC,SAAS,OAAO,KAAK;EAC1B,KAAKG,QAAQ,IAAI,KAAK;EACtB,OAAO;CACT;CAEA,OAAO,OAAU,OAAmD;EAClE,KAAKH,SAAS,IAAI,KAAK;EACvB,KAAKD,OAAO,OAAO,KAAK;EACxB,KAAKI,QAAQ,OAAO,KAAK;EACzB,OAAO;CACT;CAEA,eAAe,OAA0B;EACvC,KAAKJ,OAAO,OAAO,KAAK;EACxB,KAAKC,SAAS,IAAI,KAAK;EACvB,KAAKG,QAAQ,OAAO,KAAK;EACzB,OAAO;CACT;CAEA,IAAI,QAAsC;EACxC,KAAKC,cAAc;EACnB,IAAI,YAAY,IAAI,IAAI,MAAM;EAE9B,MAAM,MAAM,KAAKN;EACjB,MAAM,oBAAoB,IAAI,UAAU,UAAU,IAAI,eAAe,CAAC;EAEtE,IADkB,gBAAgB,KAAK,IAAI,SAC/B,KAAK,mBAAmB;GAClC,MAAM,oBAAoB,CAAC,GAAG,KAAKK,OAAO,CAAC,CAAC,QAAQ,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;GAC3E,kBAAkB,SAAS,MAAM,IAAI,OAAO,GAAG,OAAO,CAAC,CAAC;GAExD,SAAS,CAAC,GAAG,QAAQ,GAAG,iBAAiB;GACzC,YAAY,IAAI,IAAI,MAAM;EAC5B;EAEA,MAAM,SAAS,IAAI,IAAI,KAAKA,OAAO;EACnC,KAAK,MAAM,SAAS,QAClB,IAAI,CAAC,UAAU,IAAI,KAAK,GAAG,IAAI,OAAO,KAAK;EAE7C,KAAK,MAAM,SAAS,QAClB,IAAI,CAAC,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK;EAEvC,OAAO;CACT;CAEA,QAAa;EACX,OAAO,CAAC,GAAG,KAAKA,OAAO;CACzB;CAEA,KAAK,IAA4B;EAC/B,KAAK,MAAM,SAAS,KAAKA,SACvB,IAAI,CAAC,MAAM,eAAe,MAAM,OAAO,IAAI,OAAO;CAGtD;CAEA,UAAU,YAAuC;EAE/C,MAAM,SAAS,IAAI,IAAI,UAAU;EACjC,KAAK,MAAM,KAAK,KAAKJ,QAAQ,OAAO,IAAI,CAAC;EACzC,KAAK,MAAM,KAAK,KAAKC,UAAU,OAAO,OAAO,CAAC;EAC9C,KAAKG,UAAU;EACf,OAAO;CACT;CAEA,UAAe;EACb,OAAO,CAAC,GAAG,KAAKA,OAAO;CACzB;CAEA,OAAO,QAAmC,YAAyC;EACjF,OAAO,IAAI,eACT,QACA,YAAY,CAAC,GAAG,KAAKA,OAAO,GAAG,UAAU,GACzC,KAAKC,aACL,YAAY,CAAC,GAAG,KAAKL,MAAM,GAAG,UAAU,GACxC,YAAY,CAAC,GAAG,KAAKC,QAAQ,GAAG,UAAU,CAC5C;CACF;CAEA,QAAa;EACX,OAAO,CAAC,GAAG,KAAKD,MAAM;CACxB;CAEA,UAAe;EACb,OAAO,CAAC,GAAG,KAAKC,QAAQ;CAC1B;CAEA,oBAA0B;EACxB,KAAKD,yBAAS,IAAI,IAAI;EACtB,KAAKC,2BAAW,IAAI,IAAI;CAC1B;AACF;AAEA,SAAS,YAA8B,UAAe,YAA8B;CAClF,MAAM,SAAS,IAAI,MAAS,SAAS,MAAM;CAC3C,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,OAAO,KAAK,WAAW,SAAS,EAAE;CAC5E,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"OneToManyCollection.js","names":["#field","#state","#loadPromise","#getSorted","#allSorted","#o2m","#added","#removed","#pendingValues","#percolate","#loaded","#hasBeenSet"],"sources":["../../src/relations/OneToManyCollection.ts"],"sourcesContent":["import { oneToManyBatchLoader } from \"../batchloaders/oneToManyBatchLoader.ts\";\nimport { oneToManyFindDataLoader } from \"../dataloaders/oneToManyFindDataLoader.ts\";\nimport {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type OneToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n maybeResolveReferenceToId,\n sameEntity,\n} from \"../index.ts\";\nimport type { IsLoadedCachable } from \"../loading/IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { compareValues } from \"../utils.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { type ManyToOneReferenceImpl } from \"./ManyToOneReference.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\n/** An alias for creating `OneToManyCollection`s. */\nexport function hasMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const field = getMetadata(entity).allFields[fieldName] as OneToManyField;\n return new OneToManyCollection(entity, field);\n });\n}\n\nexport class OneToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>, IsLoadedCachable\n{\n readonly #field: OneToManyField;\n #state: O2MState<T, U>;\n #loadPromise: any;\n // Constantly filtering+sorting our `.get` values can be surprisingly expensive if called\n // when processing many entities/writing code that calls it repeatedly, so we cache it\n // both the \"without deleted\" default (`getSorted`) and \"all deleted\" (`allSorted`).\n #getSorted: U[] | undefined;\n #allSorted: U[] | undefined;\n\n constructor(entity: T, field: OneToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n } else {\n const { em } = entity;\n // If any m2o.set(ourId) were made before our entity was loaded, pull in those changes\n const pending = getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.get(this.fieldName);\n if (pending) {\n this.#state = new O2MUnloadedAddedRemovedState<T, U>(this, pending.adds as U[], pending.removes as U[]);\n getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.delete(this.fieldName);\n } else {\n this.#state = new O2MUnloadedPristineState<T, U>(this);\n }\n }\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<readonly U[]> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const maybePreloaded = this.getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= oneToManyBatchLoader(this.entity.em, this).load(this.entity.idTagged!))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err as Error, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n return opts?.withDeleted ? this.getWithDeleted : this.get;\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 = `id=${id},${this.#field.otherColumnName}=${this.entity.id}`;\n return oneToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n }\n\n async includes(other: U): Promise<boolean> {\n return sameEntity(this.entity, this.getOtherRelation(other).current());\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#getSorted = undefined;\n this.#allSorted = undefined;\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 this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n }\n\n /** Copy another em's `source` collection into our state. */\n import(source: OneToManyCollection<T, U>, findEntity: (e: U) => U): void {\n this.#state = source.#state.import(this, findEntity);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // todo: this only be a readonly U[]\n get get(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#getSorted !== undefined) return this.#getSorted;\n this.#getSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: false })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#getSorted;\n }\n\n get getWithDeleted(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#allSorted !== undefined) return this.#allSorted;\n this.#allSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: true })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#allSorted;\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n add(other: U): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other);\n this.percolateAdd(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n remove(other: U, opts: { requireLoaded: boolean } = { requireLoaded: true }) {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, opts);\n this.percolateRemove(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\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 // internal impl\n\n /** @internal */\n percolateAdd(other: U): void {\n this.getOtherRelation(other).set(this.entity);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n this.getOtherRelation(other).set(undefined);\n }\n\n /** @internal */\n registerAsMutated(): void {\n getEmInternalApi(this.entity.em).mutatedCollections.add(this);\n }\n\n setFromOpts(others: U[]): void {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n removeIfLoaded(other: U) {\n this.#state = this.#state.removeIfLoaded(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n this.current({ withDeleted: true }).forEach((e) => this.entity.em.delete(e));\n }\n }\n\n // We already unhooked all children in our addedBeforeLoaded list; now load the full list if necessary.\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n current.forEach((other) => {\n const m2o = this.getOtherRelation(other);\n if (maybeResolveReferenceToId(m2o.current({ withDeleted: true })) === this.entity.idMaybe) {\n m2o.set(undefined);\n }\n });\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n public get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n public get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n current(opts?: { withDeleted?: boolean }): U[] {\n return this.filterDeleted(this.#state.current(), opts);\n }\n\n public get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n public get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n public get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n public toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n /** Called after `em.flush` to reset our dirty tracking. */\n public resetAddedRemoved(): void {\n this.#state.resetAddedRemoved();\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 // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n const list =\n opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n if (this.#field.orderBy) {\n const { field, direction } = this.#field.orderBy;\n list.sort((a, b) => compareValues((a as any)[field], (b as any)[field], direction));\n }\n return list;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReferenceImpl<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n private 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 // Exposed for changes\n added(): U[] {\n return this.#state.added();\n }\n\n removed(): U[] {\n return this.#state.removed();\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for OneToManyCollection state machine.\n *\n * States handle only data tracking — side effects (percolation, mutation registration)\n * are handled by the collection methods that call into these states.\n *\n * State transitions:\n * ```\n * Constructor (new entity) → Loaded (empty [])\n * Constructor (existing entity) → UnloadedPristine\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + load/preload → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + load/preload → Loaded (merges adds/removes)\n *\n * PendingSet + add/remove → PendingSet (self)\n * PendingSet + set → PendingSet (self, replace)\n * PendingSet + load/preload → Loaded (diffs pending vs DB)\n *\n * Loaded + forceReload → Loaded (refreshed, re-merges pending)\n * ```\n */\ninterface O2MState<T extends Entity, U extends Entity> {\n add(other: U): O2MState<T, U>;\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U>;\n removeIfLoaded(other: U): O2MState<T, U>;\n set(values: readonly U[]): O2MState<T, U>;\n doGet(): U[];\n find(id: IdOf<U>): U | undefined;\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U>;\n current(): U[];\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n added(): U[];\n removed(): U[];\n resetAddedRemoved(): void;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass O2MUnloadedPristineState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n\n constructor(o2m: OneToManyCollection<T, U>) {\n this.#o2m = o2m;\n }\n\n add(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [other], []);\n }\n\n remove(_other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [_other]);\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [other]);\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n return new O2MLoadedState<T, U>(this.#o2m, dbEntities, false);\n }\n\n current(): U[] {\n return [];\n }\n\n import(target: OneToManyCollection<T, U>, _findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedPristineState<T, U>(target);\n }\n\n added(): U[] {\n return [];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass O2MUnloadedAddedRemovedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n #added: Set<U>;\n #removed: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#o2m = o2m;\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n return this;\n }\n\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n this.#removed.add(other);\n this.#added.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n // We should do the implicit deletion check?\n // Should we keep #added/#removed?\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#added) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // Push added entities on the end to better match the db order of \"newer things come last\"\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n return new O2MLoadedState<T, U>(this.#o2m, [...loaded], false, [...this.#added], [...this.#removed]);\n }\n\n current(): U[] {\n return [...this.#added];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(\n target,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n // This is called after em.flush, so these changes have been pushed into the db; we don't\n // need to track them anymore b/c any future `o2m.load` will see up.\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass O2MPendingSetState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #o2m: OneToManyCollection<T, U>;\n #pendingValues: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, pendingValues: readonly U[], skipPercolate = false) {\n this.#o2m = o2m;\n this.#pendingValues = new Set(pendingValues);\n // We percolate on normal set() calls to immediately update the other side's m2o references.\n // We skip percolation on import() because those entities already have correct references\n // in the cloned EntityManager.\n if (!skipPercolate) this.#percolate();\n getEmInternalApi(o2m.entity.em).pendingLoads.add(o2m);\n }\n\n add(other: U): O2MState<T, U> {\n this.#pendingValues.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#pendingValues = new Set(values);\n this.#percolate();\n return this;\n }\n\n doGet(): U[] {\n return [...this.#pendingValues];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#pendingValues) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n const o2m = this.#o2m;\n const entity = o2m.entity;\n // Handle cascade delete + immutable: entities removed from the collection that\n // cannot have their FK changed should be deleted instead\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n // Calc our added/removed so that `.changes` in the new loaded state are correct\n const dbSet = new Set(dbEntities);\n const added: U[] = [];\n for (const other of this.#pendingValues) {\n if (!dbSet.has(other)) added.push(other);\n }\n const removed: U[] = [];\n for (const other of dbEntities) {\n if (!this.#pendingValues.has(other)) {\n removed.push(other);\n if (isCascade && otherCannotChange) {\n entity.em.delete(other);\n } else {\n o2m.percolateRemove(other);\n }\n }\n }\n return new O2MLoadedState<T, U>(o2m, [...this.#pendingValues], true, added, removed);\n }\n\n current(): U[] {\n return [...this.#pendingValues];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(target, mapEntities([...this.#pendingValues], findEntity), true);\n }\n\n added(): U[] {\n return [...this.#pendingValues];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n\n #percolate(): void {\n const o2m = this.#o2m;\n // All new values, we immediately tell them we're their new parent\n for (const other of this.#pendingValues) {\n o2m.percolateAdd(other);\n }\n // If we're an existing entity, we can scan for any in-memory entities that were previously\n // pointing to us, but now should not\n if (!o2m.entity.isNewEntity) {\n for (const other of o2m.entity.em.getEntities(o2m.otherMeta.cstr) as Iterable<U>) {\n if (this.#pendingValues.has(other)) continue;\n if (sameEntity((other as any)[o2m.otherFieldName].current(), o2m.entity)) {\n o2m.percolateRemove(other);\n }\n }\n }\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass O2MLoadedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = true;\n #o2m: OneToManyCollection<T, U>;\n #loaded: Set<U>;\n #added: Set<U>;\n #removed: Set<U>;\n #hasBeenSet: boolean;\n\n constructor(o2m: OneToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean, added: U[] = [], removed: U[] = []) {\n this.#o2m = o2m;\n this.#loaded = new Set(loaded);\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n this.#loaded.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#removed.add(other);\n this.#added.delete(other);\n this.#loaded.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n this.#loaded.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#hasBeenSet = true;\n let valuesSet = new Set(values);\n\n const o2m = this.#o2m;\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n if (isCascade && otherCannotChange) {\n const implicitlyDeleted = [...this.#loaded].filter((e) => !valuesSet.has(e));\n implicitlyDeleted.forEach((e) => o2m.entity.em.delete(e));\n // ...we restore the implicitlyDeleted for getWithDeleted\n values = [...values, ...implicitlyDeleted];\n valuesSet = new Set(values);\n }\n\n const loaded = new Set(this.#loaded);\n for (const other of loaded) {\n if (!valuesSet.has(other)) o2m.remove(other);\n }\n for (const other of values) {\n if (!loaded.has(other)) o2m.add(other);\n }\n return this;\n }\n\n doGet(): U[] {\n return [...this.#loaded];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const other of this.#loaded) {\n if (!other.isNewEntity && other.id === id) return other;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // On forceReload, replace loaded but preserve pending adds/removes\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n this.#loaded = loaded;\n return this;\n }\n\n current(): U[] {\n return [...this.#loaded];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MLoadedState<T, U>(\n target,\n mapEntities([...this.#loaded], findEntity),\n this.#hasBeenSet,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\nfunction mapEntities<U extends Entity>(entities: U[], findEntity: (e: U) => U): U[] {\n const result = new Array<U>(entities.length);\n for (let i = 0; i < entities.length; i++) result[i] = findEntity(entities[i]);\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_relations_RelationSymbols = require("./RelationSymbols.cjs");
|
|
3
|
+
require("./LargeCollection.cjs");
|
|
3
4
|
const require_dataloaders_oneToManyFindDataLoader = require("../dataloaders/oneToManyFindDataLoader.cjs");
|
|
4
5
|
const require_utils = require("../utils.cjs");
|
|
5
6
|
const require_newEntity = require("../newEntity.cjs");
|
|
6
|
-
require("./LargeCollection.cjs");
|
|
7
7
|
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
8
8
|
const require_index = require("../index.cjs");
|
|
9
9
|
const require_EntityManager = require("../EntityManager.cjs");
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { RelationT, RelationU } from "./RelationSymbols.js";
|
|
2
|
+
import "./LargeCollection.js";
|
|
2
3
|
import { oneToManyFindDataLoader } from "../dataloaders/oneToManyFindDataLoader.js";
|
|
3
4
|
import { remove } from "../utils.js";
|
|
4
5
|
import { lazyField } from "../newEntity.js";
|
|
5
|
-
import "./LargeCollection.js";
|
|
6
6
|
import { getMetadata, getMetadataForField } from "../EntityMetadata.js";
|
|
7
7
|
import { ensureNotDeleted } from "../index.js";
|
|
8
8
|
import { appendStack, sameEntity } from "../EntityManager.js";
|
|
@@ -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");
|
|
5
|
-
const require_batchloaders_oneToOneBatchLoader = require("../batchloaders/oneToOneBatchLoader.cjs");
|
|
6
|
-
const require_relations_isCascadeDelete = require("./isCascadeDelete.cjs");
|
|
7
4
|
const require_relations_ReferenceSymbols = require("./ReferenceSymbols.cjs");
|
|
8
|
-
const
|
|
5
|
+
const require_fields = require("../fields.cjs");
|
|
6
|
+
const require_keys = require("../keys.cjs");
|
|
9
7
|
require("./Reference.cjs");
|
|
8
|
+
const require_relations_isCascadeDelete = require("./isCascadeDelete.cjs");
|
|
9
|
+
const require_relations_ManyToOneReference = require("./ManyToOneReference.cjs");
|
|
10
|
+
const require_batchloaders_oneToOneBatchLoader = require("../batchloaders/oneToOneBatchLoader.cjs");
|
|
10
11
|
const require_relations_ReactiveReference = require("./ReactiveReference.cjs");
|
|
11
12
|
const require_newEntity = require("../newEntity.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");
|