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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecursiveCollection.cjs","names":["lazyField","AbstractRelationImpl","getMetadata","RelationT","RelationU","#fieldName","#m2oName","#otherFieldName","#loaded","#loadPromise","recursiveParentsBatchLoader","appendStack","RecursiveCycleError","isReference","isLoadedReference","#o2mName","recursiveChildrenBatchLoader","isCollection","isLoadedCollection","isOneToOneReference","isLoadedOneToOneReference","#m2mName","recursiveM2mBatchLoader","fail"],"sources":["../../src/relations/RecursiveCollection.ts"],"sourcesContent":["import { recursiveChildrenBatchLoader } from \"../batchloaders/recursiveChildrenBatchLoader.ts\";\nimport { recursiveM2mBatchLoader } from \"../batchloaders/recursiveM2mBatchLoader.ts\";\nimport { recursiveParentsBatchLoader } from \"../batchloaders/recursiveParentsBatchLoader.ts\";\nimport {\n type Entity,\n type EntityMetadata,\n type ManyToManyField,\n type Reference,\n type Relation,\n appendStack,\n ensureNotDeleted,\n fail,\n getEmInternalApi,\n getMetadata,\n isCollection,\n isLoadedCollection,\n isLoadedOneToOneReference,\n isLoadedReference,\n isOneToOneReference,\n isReference,\n} from \"../index.ts\";\nimport { type IsLoadedCachable } from \"../IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { type ReadOnlyCollection } from \"./ReadOnlyCollection.ts\";\nimport { RecursiveCycleError } from \"./RecursiveCycleError.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nexport { RecursiveCycleError };\n\n/**\n * An alias for creating `RecursiveParentsCollectionImpl`s.\n *\n * I.e. for `Author.mentor` (m2o fk), we can return `Author.mentorsRecursive` recursively looking up.\n */\nexport function hasRecursiveParents<T extends Entity, U extends Entity>(\n m2oName: keyof T & string, // i.e. `author.mentor`\n otherFieldName: keyof T & string, // i.e. `author.menteesRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveParentsCollectionImpl(entity, fieldName as keyof T & string, m2oName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveChildrenCollectionImpl`s.\n *\n * I.e. for `Author.mentees` (o2m), we can return `Author.menteesRecursive` recursively looking down.\n */\nexport function hasRecursiveChildren<T extends Entity, U extends Entity>(\n o2mName: keyof T & string, // i.e. `author.mentees`\n otherFieldName: keyof T & string, // i.e. `author.mentorsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveChildrenCollectionImpl(entity, fieldName as keyof T & string, o2mName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveM2mCollectionImpl`s.\n *\n * I.e. for `User.parents` (m2m), we can return `User.parentsRecursive` recursively looking up through the m2m.\n * Or for `User.children` (m2m), we can return `User.childrenRecursive` recursively looking down.\n */\nexport function hasRecursiveM2m<T extends Entity, U extends Entity>(\n m2mName: keyof T & string, // i.e. `user.parents` or `user.children`\n otherFieldName: keyof T & string, // i.e. `user.childrenRecursive` or `user.parentsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveM2mCollectionImpl(entity, fieldName as keyof T & string, m2mName, otherFieldName);\n });\n}\n\n/**\n * A base class for the common methods between the parent & children recursive collections.\n *\n * We could probably move some of this into AbstractRelationImpl?\n */\nabstract class AbstractRecursiveCollectionImpl<T extends Entity, U extends Entity> extends AbstractRelationImpl<\n T,\n U[]\n> {\n abstract fieldName: string;\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n setFromOpts(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n set(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n cleanupOnEntityDeleted(): Promise<void> {\n return Promise.resolve();\n }\n\n maybeCascadeDelete(): void {}\n\n get meta(): EntityMetadata {\n return getMetadata(this.entity);\n }\n\n abstract doGet(): U[];\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n protected filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n return opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && !(e as any).isSoftDeletedEntity);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\nexport class RecursiveParentsCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2oName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2oName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2oName = m2oName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n // If we have `[grandchild, newlyCreatedParent, existingGrandparent, ...more...]`, skip up to the\n // `existingGrandparent`, because if we `.load(entity)` (i.e. where we are the `grandchild`) then\n // recursiveParentsBatchLoader will try CTE query up from `grandchild[parent]`, but since that will\n // be `newlyCreatedParent`, it doesn't have an id yet.\n const entityToLoad = opts.forceReload ? this.entity : this.findUnloadedReference()?.entity;\n if (entityToLoad && !entityToLoad.isNewEntity) {\n await (this.#loadPromise ??= recursiveParentsBatchLoader(this.entity.em, this)\n .load(entityToLoad)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n // See if there are any WIP changes, i.e. new parents, that the ^ SQL query didn't know to load.\n // We don't have to `while` loop this, because if parent itself has WIP changes above it, then\n // its own `RecursiveParentsCollectionImpl.load` will load it, before returning to this method.\n const unloadedParent = this.findUnloadedReference();\n if (unloadedParent) {\n await recursiveParentsBatchLoader(this.entity.em, this)\n .load(unloadedParent.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n }\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedReference() === undefined;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2oFieldName(): string {\n return this.#m2oName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveParentsCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n const unloaded = this.findUnloadedReference();\n if (unloaded) {\n throw new Error(this.toString() + `.get was called but ${unloaded} was not loaded`);\n }\n const parents: U[] = [];\n const visited = new Set<U>();\n for (\n let current = getLoadedReference(this.entity[this.#m2oName]);\n current !== undefined;\n current = getLoadedReference(current[this.#m2oName])\n ) {\n parents.push(current);\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return parents;\n }\n\n private findUnloadedReference(): Reference<any, any, any> | undefined {\n const visited = new Set<any>();\n for (let current = this.entity; current !== undefined; current = getLoadedReference(current[this.#m2oName])) {\n const relation = current[this.#m2oName];\n if (isReference(relation) && !isLoadedReference(relation)) return relation;\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return undefined;\n }\n}\n\nexport class RecursiveChildrenCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #o2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, o2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#o2mName = o2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveChildrenBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entities own `fooRecursive` collection so that it's marked as loaded.\n // We don't have to `while` loop this, because if they children themselves have any WIP\n // changes, then their own `RecursiveChildrenCollectionImpl.load` will load them.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get o2mFieldName(): string {\n return this.#o2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveChildrenCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const children: U[] = [];\n const visited = new Set<any>();\n // Use a node+path combo to know which path caused the cycle\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n for (const child of getLoadedCollection(relation)) {\n children.push(child);\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n return children;\n }\n\n /** Finds any children/downstream o2m collections or o2o references. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n const unloaded: Relation<any, any>[] = [];\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else if (isOneToOneReference(relation) && !isLoadedOneToOneReference(relation)) {\n unloaded.push(relation);\n } else {\n for (const child of getLoadedCollection(relation)) {\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n }\n return unloaded;\n }\n}\n\nexport class RecursiveM2mCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2mName = m2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveM2mBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entity's own `fooRecursive` collection so that it's marked as loaded.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2mFieldName(): string {\n return this.#m2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get m2mField(): ManyToManyField {\n return this.meta.allFields[this.#m2mName] as ManyToManyField;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveM2mCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const results: U[] = [];\n // Track by entity to handle diamonds (same entity reachable via multiple paths)\n const visited = new Set<any>();\n visited.add(this.entity);\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n for (const other of getLoadedCollection(current[this.#m2mName])) {\n if (visited.has(other)) {\n // If we're reaching an entity we've already visited, and it's this.entity, that's a cycle\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n // Otherwise it's a diamond (reachable via multiple paths) — skip\n continue;\n }\n visited.add(other);\n results.push(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n return results;\n }\n\n /** Finds any m2m collections that are not yet loaded in the recursive tree. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n visited.add(this.entity);\n const unloaded: Relation<any, any>[] = [];\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n const relation = current[this.#m2mName];\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else {\n for (const other of getLoadedCollection(relation)) {\n if (visited.has(other)) {\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n continue;\n }\n visited.add(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n }\n return unloaded;\n }\n}\n\nfunction getLoadedReference(relation: any): any {\n return isLoadedReference(relation) ? relation.get : fail(`${relation} was not loaded`);\n}\n\nfunction getLoadedCollection(relation: any): any {\n return isLoadedCollection(relation)\n ? relation.get\n : isLoadedOneToOneReference(relation)\n ? relation.get\n ? [relation.get]\n : []\n : fail(`${relation} was not loaded`);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RecursiveCollection.cjs","names":["lazyField","AbstractRelationImpl","getMetadata","RelationT","RelationU","#fieldName","#m2oName","#otherFieldName","#loaded","#loadPromise","recursiveParentsBatchLoader","appendStack","RecursiveCycleError","isReference","isLoadedReference","#o2mName","recursiveChildrenBatchLoader","isCollection","isLoadedCollection","isOneToOneReference","isLoadedOneToOneReference","#m2mName","recursiveM2mBatchLoader","fail"],"sources":["../../src/relations/RecursiveCollection.ts"],"sourcesContent":["import { recursiveChildrenBatchLoader } from \"../batchloaders/recursiveChildrenBatchLoader.ts\";\nimport { recursiveM2mBatchLoader } from \"../batchloaders/recursiveM2mBatchLoader.ts\";\nimport { recursiveParentsBatchLoader } from \"../batchloaders/recursiveParentsBatchLoader.ts\";\nimport {\n type Entity,\n type EntityMetadata,\n type ManyToManyField,\n type Reference,\n type Relation,\n appendStack,\n ensureNotDeleted,\n fail,\n getEmInternalApi,\n getMetadata,\n isCollection,\n isLoadedCollection,\n isLoadedOneToOneReference,\n isLoadedReference,\n isOneToOneReference,\n isReference,\n} from \"../index.ts\";\nimport type { IsLoadedCachable } from \"../loading/IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { type ReadOnlyCollection } from \"./ReadOnlyCollection.ts\";\nimport { RecursiveCycleError } from \"./RecursiveCycleError.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nexport { RecursiveCycleError };\n\n/**\n * An alias for creating `RecursiveParentsCollectionImpl`s.\n *\n * I.e. for `Author.mentor` (m2o fk), we can return `Author.mentorsRecursive` recursively looking up.\n */\nexport function hasRecursiveParents<T extends Entity, U extends Entity>(\n m2oName: keyof T & string, // i.e. `author.mentor`\n otherFieldName: keyof T & string, // i.e. `author.menteesRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveParentsCollectionImpl(entity, fieldName as keyof T & string, m2oName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveChildrenCollectionImpl`s.\n *\n * I.e. for `Author.mentees` (o2m), we can return `Author.menteesRecursive` recursively looking down.\n */\nexport function hasRecursiveChildren<T extends Entity, U extends Entity>(\n o2mName: keyof T & string, // i.e. `author.mentees`\n otherFieldName: keyof T & string, // i.e. `author.mentorsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveChildrenCollectionImpl(entity, fieldName as keyof T & string, o2mName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveM2mCollectionImpl`s.\n *\n * I.e. for `User.parents` (m2m), we can return `User.parentsRecursive` recursively looking up through the m2m.\n * Or for `User.children` (m2m), we can return `User.childrenRecursive` recursively looking down.\n */\nexport function hasRecursiveM2m<T extends Entity, U extends Entity>(\n m2mName: keyof T & string, // i.e. `user.parents` or `user.children`\n otherFieldName: keyof T & string, // i.e. `user.childrenRecursive` or `user.parentsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveM2mCollectionImpl(entity, fieldName as keyof T & string, m2mName, otherFieldName);\n });\n}\n\n/**\n * A base class for the common methods between the parent & children recursive collections.\n *\n * We could probably move some of this into AbstractRelationImpl?\n */\nabstract class AbstractRecursiveCollectionImpl<T extends Entity, U extends Entity> extends AbstractRelationImpl<\n T,\n U[]\n> {\n abstract fieldName: string;\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n setFromOpts(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n set(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n cleanupOnEntityDeleted(): Promise<void> {\n return Promise.resolve();\n }\n\n maybeCascadeDelete(): void {}\n\n get meta(): EntityMetadata {\n return getMetadata(this.entity);\n }\n\n abstract doGet(): U[];\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n protected filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n return opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && !(e as any).isSoftDeletedEntity);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\nexport class RecursiveParentsCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2oName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2oName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2oName = m2oName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n // If we have `[grandchild, newlyCreatedParent, existingGrandparent, ...more...]`, skip up to the\n // `existingGrandparent`, because if we `.load(entity)` (i.e. where we are the `grandchild`) then\n // recursiveParentsBatchLoader will try CTE query up from `grandchild[parent]`, but since that will\n // be `newlyCreatedParent`, it doesn't have an id yet.\n const entityToLoad = opts.forceReload ? this.entity : this.findUnloadedReference()?.entity;\n if (entityToLoad && !entityToLoad.isNewEntity) {\n await (this.#loadPromise ??= recursiveParentsBatchLoader(this.entity.em, this)\n .load(entityToLoad)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n // See if there are any WIP changes, i.e. new parents, that the ^ SQL query didn't know to load.\n // We don't have to `while` loop this, because if parent itself has WIP changes above it, then\n // its own `RecursiveParentsCollectionImpl.load` will load it, before returning to this method.\n const unloadedParent = this.findUnloadedReference();\n if (unloadedParent) {\n await recursiveParentsBatchLoader(this.entity.em, this)\n .load(unloadedParent.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n }\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedReference() === undefined;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2oFieldName(): string {\n return this.#m2oName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveParentsCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n const unloaded = this.findUnloadedReference();\n if (unloaded) {\n throw new Error(this.toString() + `.get was called but ${unloaded} was not loaded`);\n }\n const parents: U[] = [];\n const visited = new Set<U>();\n for (\n let current = getLoadedReference(this.entity[this.#m2oName]);\n current !== undefined;\n current = getLoadedReference(current[this.#m2oName])\n ) {\n parents.push(current);\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return parents;\n }\n\n private findUnloadedReference(): Reference<any, any, any> | undefined {\n const visited = new Set<any>();\n for (let current = this.entity; current !== undefined; current = getLoadedReference(current[this.#m2oName])) {\n const relation = current[this.#m2oName];\n if (isReference(relation) && !isLoadedReference(relation)) return relation;\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return undefined;\n }\n}\n\nexport class RecursiveChildrenCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #o2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, o2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#o2mName = o2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveChildrenBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entities own `fooRecursive` collection so that it's marked as loaded.\n // We don't have to `while` loop this, because if they children themselves have any WIP\n // changes, then their own `RecursiveChildrenCollectionImpl.load` will load them.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get o2mFieldName(): string {\n return this.#o2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveChildrenCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const children: U[] = [];\n const visited = new Set<any>();\n // Use a node+path combo to know which path caused the cycle\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n for (const child of getLoadedCollection(relation)) {\n children.push(child);\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n return children;\n }\n\n /** Finds any children/downstream o2m collections or o2o references. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n const unloaded: Relation<any, any>[] = [];\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else if (isOneToOneReference(relation) && !isLoadedOneToOneReference(relation)) {\n unloaded.push(relation);\n } else {\n for (const child of getLoadedCollection(relation)) {\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n }\n return unloaded;\n }\n}\n\nexport class RecursiveM2mCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2mName = m2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveM2mBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entity's own `fooRecursive` collection so that it's marked as loaded.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2mFieldName(): string {\n return this.#m2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get m2mField(): ManyToManyField {\n return this.meta.allFields[this.#m2mName] as ManyToManyField;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveM2mCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const results: U[] = [];\n // Track by entity to handle diamonds (same entity reachable via multiple paths)\n const visited = new Set<any>();\n visited.add(this.entity);\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n for (const other of getLoadedCollection(current[this.#m2mName])) {\n if (visited.has(other)) {\n // If we're reaching an entity we've already visited, and it's this.entity, that's a cycle\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n // Otherwise it's a diamond (reachable via multiple paths) — skip\n continue;\n }\n visited.add(other);\n results.push(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n return results;\n }\n\n /** Finds any m2m collections that are not yet loaded in the recursive tree. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n visited.add(this.entity);\n const unloaded: Relation<any, any>[] = [];\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n const relation = current[this.#m2mName];\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else {\n for (const other of getLoadedCollection(relation)) {\n if (visited.has(other)) {\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n continue;\n }\n visited.add(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n }\n return unloaded;\n }\n}\n\nfunction getLoadedReference(relation: any): any {\n return isLoadedReference(relation) ? relation.get : fail(`${relation} was not loaded`);\n}\n\nfunction getLoadedCollection(relation: any): any {\n return isLoadedCollection(relation)\n ? relation.get\n : isLoadedOneToOneReference(relation)\n ? relation.get\n ? [relation.get]\n : []\n : fail(`${relation} was not loaded`);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAmCA,SAAgB,oBACd,SACA,gBAC0B;CAC1B,OAAOA,kBAAAA,WAAW,QAAW,cAAc;EACzC,OAAO,IAAI,+BAA+B,QAAQ,WAA+B,SAAS,cAAc;CAC1G,CAAC;AACH;;;;;;AAOA,SAAgB,qBACd,SACA,gBAC0B;CAC1B,OAAOA,kBAAAA,WAAW,QAAW,cAAc;EACzC,OAAO,IAAI,gCAAgC,QAAQ,WAA+B,SAAS,cAAc;CAC3G,CAAC;AACH;;;;;;;AAQA,SAAgB,gBACd,SACA,gBAC0B;CAC1B,OAAOA,kBAAAA,WAAW,QAAW,cAAc;EACzC,OAAO,IAAI,2BAA2B,QAAQ,WAA+B,SAAS,cAAc;CACtG,CAAC;AACH;;;;;;AAOA,IAAe,kCAAf,cAA2FC,uCAAAA,qBAGzF;CAGA,IAAI,MAAW;EACb,OAAO,KAAK,cAAc,KAAK,MAAM,GAAG,EAAE,aAAa,MAAM,CAAC;CAChE;CAEA,IAAI,iBAAsB;EACxB,OAAO,KAAK,cAAc,KAAK,MAAM,GAAG,EAAE,aAAa,KAAK,CAAC;CAC/D;CAEA,cAAoB;EAClB,MAAM,IAAI,MAAM,yBAAyB;CAC3C;CAEA,MAAY;EACV,MAAM,IAAI,MAAM,yBAAyB;CAC3C;CAEA,IAAI,cAAuB;EACzB,OAAO;CACT;CAEA,UAAgB;EACd,MAAM,IAAI,MAAM,yBAAyB;CAC3C;CAEA,yBAAwC;EACtC,OAAO,QAAQ,QAAQ;CACzB;CAEA,qBAA2B,CAAC;CAE5B,IAAI,OAAuB;EACzB,OAAOC,uBAAAA,YAAY,KAAK,MAAM;CAChC;;CAKA,cAAwB,UAAe,MAAuC;EAC5E,OAAO,MAAM,gBAAgB,OACzB,CAAC,GAAG,QAAQ,IACZ,SAAS,QAAQ,MAAM,CAAC,EAAE,mBAAmB,CAAE,EAAU,mBAAmB;CAClF;CAEA,CAACC,kCAAAA,aAAgB;CACjB,CAACC,kCAAAA,aAAgB;AACnB;AAEA,IAAa,iCAAb,cACU,gCAEV;CACE;CACA;CACA;CACA,UAA+B,KAAA;CAC/B;CAEA,YAAY,QAAW,WAA6B,SAA2B,gBAAkC;EAC/G,MAAM,MAAM;EACZ,KAAKC,aAAa;EAClB,KAAKC,WAAW;EAChB,KAAKC,kBAAkB;CACzB;CAGA,MAAM,KAAK,OAAyD,CAAC,GAA0B;EAC7F,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,CAAC,KAAK,YAAY,KAAK,aAAa;GACtC,IAAI,KAAK,aACP,KAAKC,UAAU,KAAA;GAMjB,MAAM,eAAe,KAAK,cAAc,KAAK,SAAS,KAAK,sBAAsB,CAAC,EAAE;GACpF,IAAI,gBAAgB,CAAC,aAAa,aAAa;IAC7C,OAAO,KAAKC,iBAAiBC,iDAAAA,4BAA4B,KAAK,OAAO,IAAI,IAAI,CAAC,CAC3E,KAAK,YAAY,CAAC,CAClB,MAAM,SAAS,KAAK,KAAK;KACxB,MAAMC,sBAAAA,YAAY,qBAAK,IAAI,MAAM,CAAC;IACpC,CAAC,CAAC,CACD,cAAc;KACb,KAAKF,eAAe,KAAA;IACtB,CAAC;IAIH,MAAM,iBAAiB,KAAK,sBAAsB;IAClD,IAAI,gBACF,MAAMC,iDAAAA,4BAA4B,KAAK,OAAO,IAAI,IAAI,CAAC,CACpD,KAAK,eAAe,MAAM,CAAC,CAC3B,MAAM,SAAS,KAAK,KAAK;KACxB,MAAMC,sBAAAA,YAAY,qBAAK,IAAI,MAAM,CAAC;IACpC,CAAC;GAEP;GACA,KAAKH,UAAU;EACjB;EACA,OAAO,KAAK,cAAc,KAAK,MAAM,GAAG,IAAI;CAC9C;CAEA,IAAI,WAAoB;EACtB,IAAI,KAAKA,YAAY,KAAA,GAAW,OAAO,KAAKA;EAC5C,KAAKA,UAAU,KAAK,sBAAsB,MAAM,KAAA;EAChD,sBAAA,iBAAiB,KAAK,OAAO,EAAE,CAAC,CAAC,cAAc,SAAS,IAAI;EAC5D,OAAO,KAAKA;CACd;CAEA,gBAAsB;EACpB,KAAKA,UAAU,KAAA;CACjB;CAEA,IAAI,YAAoB;EACtB,OAAO,KAAKH;CACd;CAEA,IAAI,eAAuB;EACzB,OAAO,KAAKC;CACd;CAEA,IAAI,iBAAyB;EAC3B,OAAO,KAAKC;CACd;CAEA,IAAI,aAAsB;EACxB,OAAO;CACT;CAEA,WAAmB;EACjB,OAAO,0CAA0C,KAAK,OAAO,eAAe,KAAK,UAAU;CAC7F;CAEA,QAAa;EACX,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,MAAM,WAAW,KAAK,sBAAsB;EAC5C,IAAI,UACF,MAAM,IAAI,MAAM,KAAK,SAAS,IAAI,uBAAuB,SAAS,gBAAgB;EAEpF,MAAM,UAAe,CAAC;EACtB,MAAM,0BAAU,IAAI,IAAO;EAC3B,KACE,IAAI,UAAU,mBAAmB,KAAK,OAAO,KAAKD,SAAS,GAC3D,YAAY,KAAA,GACZ,UAAU,mBAAmB,QAAQ,KAAKA,SAAS,GACnD;GACA,QAAQ,KAAK,OAAO;GACpB,IAAI,QAAQ,IAAI,OAAO,GAAG,MAAM,IAAIM,sCAAAA,oBAAoB,MAAM,CAAC,GAAG,SAAS,OAAO,CAAC;GACnF,QAAQ,IAAI,OAAO;EACrB;EACA,OAAO;CACT;CAEA,wBAAsE;EACpE,MAAM,0BAAU,IAAI,IAAS;EAC7B,KAAK,IAAI,UAAU,KAAK,QAAQ,YAAY,KAAA,GAAW,UAAU,mBAAmB,QAAQ,KAAKN,SAAS,GAAG;GAC3G,MAAM,WAAW,QAAQ,KAAKA;GAC9B,IAAIO,4BAAAA,YAAY,QAAQ,KAAK,CAACC,4BAAAA,kBAAkB,QAAQ,GAAG,OAAO;GAClE,IAAI,QAAQ,IAAI,OAAO,GAAG,MAAM,IAAIF,sCAAAA,oBAAoB,MAAM,CAAC,GAAG,SAAS,OAAO,CAAC;GACnF,QAAQ,IAAI,OAAO;EACrB;CAEF;AACF;AAEA,IAAa,kCAAb,cACU,gCAEV;CACE;CACA;CACA;CACA,UAA+B,KAAA;CAC/B;CAEA,YAAY,QAAW,WAA6B,SAA2B,gBAAkC;EAC/G,MAAM,MAAM;EACZ,KAAKP,aAAa;EAClB,KAAKU,WAAW;EAChB,KAAKR,kBAAkB;CACzB;CAGA,MAAM,KAAK,OAAyD,CAAC,GAA0B;EAC7F,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,CAAC,KAAK,YAAY,KAAK,aAAa;GACtC,IAAI,KAAK,aACP,KAAKC,UAAU,KAAA;GAEjB,IAAI,CAAC,KAAK,OAAO,aACf,OAAO,KAAKC,iBAAiBO,kDAAAA,6BAA6B,KAAK,OAAO,IAAI,IAAI,CAAC,CAC5E,KAAK,KAAK,MAAM,CAAC,CACjB,MAAM,SAAS,KAAK,KAAK;IACxB,MAAML,sBAAAA,YAAY,qBAAK,IAAI,MAAM,CAAC;GACpC,CAAC,CAAC,CACD,cAAc;IACb,KAAKF,eAAe,KAAA;GACtB,CAAC;GAEL,MAAM,WAAW,KAAK,wBAAwB;GAC9C,IAAI,SAAS,SAAS,GAIpB,MAAM,QAAQ,IAAI,SAAS,KAAK,MAAO,EAAE,OAAe,KAAK,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;GAErF,KAAKD,UAAU;EACjB;EACA,OAAO,KAAK,cAAc,KAAK,MAAM,GAAG,IAAI;CAC9C;CAEA,IAAI,WAAoB;EACtB,IAAI,KAAKA,YAAY,KAAA,GAAW,OAAO,KAAKA;EAC5C,KAAKA,UAAU,KAAK,wBAAwB,CAAC,CAAC,WAAW;EACzD,sBAAA,iBAAiB,KAAK,OAAO,EAAE,CAAC,CAAC,cAAc,SAAS,IAAI;EAC5D,OAAO,KAAKA;CACd;CAEA,gBAAsB;EACpB,KAAKA,UAAU,KAAA;CACjB;CAEA,IAAI,YAAoB;EACtB,OAAO,KAAKH;CACd;CAEA,IAAI,eAAuB;EACzB,OAAO,KAAKU;CACd;CAEA,IAAI,iBAAyB;EAC3B,OAAO,KAAKR;CACd;CAEA,IAAI,aAAsB;EACxB,OAAO;CACT;CAEA,WAAmB;EACjB,OAAO,2CAA2C,KAAK,OAAO,eAAe,KAAK,UAAU;CAC9F;CAEA,QAAa;EACX,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,KAAK,SAAS,IAAI,qCAAqC;EAEzE,MAAM,WAAgB,CAAC;EACvB,MAAM,0BAAU,IAAI,IAAS;EAE7B,MAAM,OAAuC,CAAC;GAAE,UAAU,KAAK,OAAO,KAAKQ;GAAW,MAAM,CAAC,KAAK,MAAa;EAAE,CAAC;EAClH,OAAO,KAAK,SAAS,GAAG;GACtB,MAAM,EAAE,UAAU,SAAS,KAAK,IAAI;GACpC,IAAI,QAAQ,IAAI,QAAQ,GAAG,MAAM,IAAIH,sCAAAA,oBAAoB,MAAM,IAAI;GACnE,QAAQ,IAAI,QAAQ;GACpB,KAAK,MAAM,SAAS,oBAAoB,QAAQ,GAAG;IACjD,SAAS,KAAK,KAAK;IACnB,KAAK,KAAK;KAAE,UAAU,MAAM,KAAKG;KAAW,MAAM,CAAC,GAAG,MAAM,KAAK;IAAE,CAAC;GACtE;EACF;EACA,OAAO;CACT;;CAGA,0BAAwD;EACtD,MAAM,0BAAU,IAAI,IAAS;EAC7B,MAAM,WAAiC,CAAC;EACxC,MAAM,OAAuC,CAAC;GAAE,UAAU,KAAK,OAAO,KAAKA;GAAW,MAAM,CAAC,KAAK,MAAa;EAAE,CAAC;EAClH,OAAO,KAAK,SAAS,GAAG;GACtB,MAAM,EAAE,UAAU,SAAS,KAAK,IAAI;GACpC,IAAI,QAAQ,IAAI,QAAQ,GAAG,MAAM,IAAIH,sCAAAA,oBAAoB,MAAM,IAAI;GACnE,QAAQ,IAAI,QAAQ;GACpB,IAAIK,6BAAAA,aAAa,QAAQ,KAAK,CAACC,6BAAAA,mBAAmB,QAAQ,GACxD,SAAS,KAAK,QAAQ;QACjB,IAAIC,oCAAAA,oBAAoB,QAAQ,KAAK,CAACC,oCAAAA,0BAA0B,QAAQ,GAC7E,SAAS,KAAK,QAAQ;QAEtB,KAAK,MAAM,SAAS,oBAAoB,QAAQ,GAC9C,KAAK,KAAK;IAAE,UAAU,MAAM,KAAKL;IAAW,MAAM,CAAC,GAAG,MAAM,KAAK;GAAE,CAAC;EAG1E;EACA,OAAO;CACT;AACF;AAEA,IAAa,6BAAb,cACU,gCAEV;CACE;CACA;CACA;CACA,UAA+B,KAAA;CAC/B;CAEA,YAAY,QAAW,WAA6B,SAA2B,gBAAkC;EAC/G,MAAM,MAAM;EACZ,KAAKV,aAAa;EAClB,KAAKgB,WAAW;EAChB,KAAKd,kBAAkB;CACzB;CAGA,MAAM,KAAK,OAAyD,CAAC,GAA0B;EAC7F,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,CAAC,KAAK,YAAY,KAAK,aAAa;GACtC,IAAI,KAAK,aACP,KAAKC,UAAU,KAAA;GAEjB,IAAI,CAAC,KAAK,OAAO,aACf,OAAO,KAAKC,iBAAiBa,6CAAAA,wBAAwB,KAAK,OAAO,IAAI,IAAI,CAAC,CACvE,KAAK,KAAK,MAAM,CAAC,CACjB,MAAM,SAAS,KAAK,KAAU;IAC7B,MAAMX,sBAAAA,YAAY,qBAAK,IAAI,MAAM,CAAC;GACpC,CAAC,CAAC,CACD,cAAc;IACb,KAAKF,eAAe,KAAA;GACtB,CAAC;GAEL,MAAM,WAAW,KAAK,wBAAwB;GAC9C,IAAI,SAAS,SAAS,GAEpB,MAAM,QAAQ,IAAI,SAAS,KAAK,MAAO,EAAE,OAAe,KAAK,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;GAErF,KAAKD,UAAU;EACjB;EACA,OAAO,KAAK,cAAc,KAAK,MAAM,GAAG,IAAI;CAC9C;CAEA,IAAI,WAAoB;EACtB,IAAI,KAAKA,YAAY,KAAA,GAAW,OAAO,KAAKA;EAC5C,KAAKA,UAAU,KAAK,wBAAwB,CAAC,CAAC,WAAW;EACzD,sBAAA,iBAAiB,KAAK,OAAO,EAAE,CAAC,CAAC,cAAc,SAAS,IAAI;EAC5D,OAAO,KAAKA;CACd;CAEA,gBAAsB;EACpB,KAAKA,UAAU,KAAA;CACjB;CAEA,IAAI,YAAoB;EACtB,OAAO,KAAKH;CACd;CAEA,IAAI,eAAuB;EACzB,OAAO,KAAKgB;CACd;CAEA,IAAI,iBAAyB;EAC3B,OAAO,KAAKd;CACd;CAEA,IAAI,WAA4B;EAC9B,OAAO,KAAK,KAAK,UAAU,KAAKc;CAClC;CAEA,IAAI,aAAsB;EACxB,OAAO;CACT;CAEA,WAAmB;EACjB,OAAO,sCAAsC,KAAK,OAAO,eAAe,KAAK,UAAU;CACzF;CAEA,QAAa;EACX,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,KAAK,SAAS,IAAI,qCAAqC;EAEzE,MAAM,UAAe,CAAC;EAEtB,MAAM,0BAAU,IAAI,IAAS;EAC7B,QAAQ,IAAI,KAAK,MAAM;EACvB,MAAM,OAAqC,CAAC;GAAE,QAAQ,KAAK;GAAQ,MAAM,CAAC,KAAK,MAAa;EAAE,CAAC;EAC/F,OAAO,KAAK,SAAS,GAAG;GACtB,MAAM,EAAE,QAAQ,SAAS,SAAS,KAAK,IAAI;GAC3C,KAAK,MAAM,SAAS,oBAAoB,QAAQ,KAAKA,SAAS,GAAG;IAC/D,IAAI,QAAQ,IAAI,KAAK,GAAG;KAEtB,IAAI,UAAU,KAAK,QAAQ,MAAM,IAAIT,sCAAAA,oBAAoB,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC;KAE/E;IACF;IACA,QAAQ,IAAI,KAAK;IACjB,QAAQ,KAAK,KAAK;IAClB,KAAK,KAAK;KAAE,QAAQ;KAAO,MAAM,CAAC,GAAG,MAAM,KAAK;IAAE,CAAC;GACrD;EACF;EACA,OAAO;CACT;;CAGA,0BAAwD;EACtD,MAAM,0BAAU,IAAI,IAAS;EAC7B,QAAQ,IAAI,KAAK,MAAM;EACvB,MAAM,WAAiC,CAAC;EACxC,MAAM,OAAqC,CAAC;GAAE,QAAQ,KAAK;GAAQ,MAAM,CAAC,KAAK,MAAa;EAAE,CAAC;EAC/F,OAAO,KAAK,SAAS,GAAG;GACtB,MAAM,EAAE,QAAQ,SAAS,SAAS,KAAK,IAAI;GAC3C,MAAM,WAAW,QAAQ,KAAKS;GAC9B,IAAIJ,6BAAAA,aAAa,QAAQ,KAAK,CAACC,6BAAAA,mBAAmB,QAAQ,GACxD,SAAS,KAAK,QAAQ;QAEtB,KAAK,MAAM,SAAS,oBAAoB,QAAQ,GAAG;IACjD,IAAI,QAAQ,IAAI,KAAK,GAAG;KACtB,IAAI,UAAU,KAAK,QAAQ,MAAM,IAAIN,sCAAAA,oBAAoB,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC;KAC/E;IACF;IACA,QAAQ,IAAI,KAAK;IACjB,KAAK,KAAK;KAAE,QAAQ;KAAO,MAAM,CAAC,GAAG,MAAM,KAAK;IAAE,CAAC;GACrD;EAEJ;EACA,OAAO;CACT;AACF;AAEA,SAAS,mBAAmB,UAAoB;CAC9C,OAAOE,4BAAAA,kBAAkB,QAAQ,IAAI,SAAS,MAAMS,cAAAA,KAAK,GAAG,SAAS,gBAAgB;AACvF;AAEA,SAAS,oBAAoB,UAAoB;CAC/C,OAAOL,6BAAAA,mBAAmB,QAAQ,IAC9B,SAAS,MACTE,oCAAAA,0BAA0B,QAAQ,IAChC,SAAS,MACP,CAAC,SAAS,GAAG,IACb,CAAC,IACHG,cAAAA,KAAK,GAAG,SAAS,gBAAgB;AACzC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AbstractRelationImpl } from "./AbstractRelationImpl.cjs";
|
|
2
2
|
import { RelationT, RelationU } from "./RelationSymbols.cjs";
|
|
3
|
-
import { IsLoadedCachable } from "../IsLoadedCache.cjs";
|
|
3
|
+
import { IsLoadedCachable } from "../loading/IsLoadedCache.cjs";
|
|
4
4
|
import { ReadOnlyCollection } from "./ReadOnlyCollection.cjs";
|
|
5
5
|
import { RecursiveCycleError } from "./RecursiveCycleError.cjs";
|
|
6
6
|
import { EntityMetadata, ManyToManyField } from "../EntityMetadata.cjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AbstractRelationImpl } from "./AbstractRelationImpl.mjs";
|
|
2
2
|
import { RelationT, RelationU } from "./RelationSymbols.mjs";
|
|
3
|
-
import { IsLoadedCachable } from "../IsLoadedCache.mjs";
|
|
3
|
+
import { IsLoadedCachable } from "../loading/IsLoadedCache.mjs";
|
|
4
4
|
import { ReadOnlyCollection } from "./ReadOnlyCollection.mjs";
|
|
5
5
|
import { RecursiveCycleError } from "./RecursiveCycleError.mjs";
|
|
6
6
|
import { EntityMetadata, ManyToManyField } from "../EntityMetadata.mjs";
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { isCollection, isLoadedCollection } from "./Collection.js";
|
|
2
2
|
import { AbstractRelationImpl } from "./AbstractRelationImpl.js";
|
|
3
3
|
import { RelationT, RelationU } from "./RelationSymbols.js";
|
|
4
|
-
import { RecursiveCycleError } from "./RecursiveCycleError.js";
|
|
5
|
-
import "../IsLoadedCache.js";
|
|
6
|
-
import { isLoadedReference, isReference } from "./Reference.js";
|
|
7
|
-
import { isLoadedOneToOneReference, isOneToOneReference } from "./OneToOneReference.js";
|
|
8
4
|
import { recursiveChildrenBatchLoader } from "../batchloaders/recursiveChildrenBatchLoader.js";
|
|
9
5
|
import { recursiveM2mBatchLoader } from "../batchloaders/recursiveM2mBatchLoader.js";
|
|
10
6
|
import { recursiveParentsBatchLoader } from "../batchloaders/recursiveParentsBatchLoader.js";
|
|
11
7
|
import "./ReadOnlyCollection.js";
|
|
8
|
+
import { RecursiveCycleError } from "./RecursiveCycleError.js";
|
|
9
|
+
import { isLoadedReference, isReference } from "./Reference.js";
|
|
10
|
+
import { isLoadedOneToOneReference, isOneToOneReference } from "./OneToOneReference.js";
|
|
12
11
|
import { fail } from "../utils.js";
|
|
13
12
|
import { lazyField } from "../newEntity.js";
|
|
14
13
|
import { getMetadata } from "../EntityMetadata.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecursiveCollection.js","names":["#fieldName","#m2oName","#otherFieldName","#loaded","#loadPromise","#o2mName","#m2mName"],"sources":["../../src/relations/RecursiveCollection.ts"],"sourcesContent":["import { recursiveChildrenBatchLoader } from \"../batchloaders/recursiveChildrenBatchLoader.ts\";\nimport { recursiveM2mBatchLoader } from \"../batchloaders/recursiveM2mBatchLoader.ts\";\nimport { recursiveParentsBatchLoader } from \"../batchloaders/recursiveParentsBatchLoader.ts\";\nimport {\n type Entity,\n type EntityMetadata,\n type ManyToManyField,\n type Reference,\n type Relation,\n appendStack,\n ensureNotDeleted,\n fail,\n getEmInternalApi,\n getMetadata,\n isCollection,\n isLoadedCollection,\n isLoadedOneToOneReference,\n isLoadedReference,\n isOneToOneReference,\n isReference,\n} from \"../index.ts\";\nimport { type IsLoadedCachable } from \"../IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { type ReadOnlyCollection } from \"./ReadOnlyCollection.ts\";\nimport { RecursiveCycleError } from \"./RecursiveCycleError.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nexport { RecursiveCycleError };\n\n/**\n * An alias for creating `RecursiveParentsCollectionImpl`s.\n *\n * I.e. for `Author.mentor` (m2o fk), we can return `Author.mentorsRecursive` recursively looking up.\n */\nexport function hasRecursiveParents<T extends Entity, U extends Entity>(\n m2oName: keyof T & string, // i.e. `author.mentor`\n otherFieldName: keyof T & string, // i.e. `author.menteesRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveParentsCollectionImpl(entity, fieldName as keyof T & string, m2oName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveChildrenCollectionImpl`s.\n *\n * I.e. for `Author.mentees` (o2m), we can return `Author.menteesRecursive` recursively looking down.\n */\nexport function hasRecursiveChildren<T extends Entity, U extends Entity>(\n o2mName: keyof T & string, // i.e. `author.mentees`\n otherFieldName: keyof T & string, // i.e. `author.mentorsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveChildrenCollectionImpl(entity, fieldName as keyof T & string, o2mName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveM2mCollectionImpl`s.\n *\n * I.e. for `User.parents` (m2m), we can return `User.parentsRecursive` recursively looking up through the m2m.\n * Or for `User.children` (m2m), we can return `User.childrenRecursive` recursively looking down.\n */\nexport function hasRecursiveM2m<T extends Entity, U extends Entity>(\n m2mName: keyof T & string, // i.e. `user.parents` or `user.children`\n otherFieldName: keyof T & string, // i.e. `user.childrenRecursive` or `user.parentsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveM2mCollectionImpl(entity, fieldName as keyof T & string, m2mName, otherFieldName);\n });\n}\n\n/**\n * A base class for the common methods between the parent & children recursive collections.\n *\n * We could probably move some of this into AbstractRelationImpl?\n */\nabstract class AbstractRecursiveCollectionImpl<T extends Entity, U extends Entity> extends AbstractRelationImpl<\n T,\n U[]\n> {\n abstract fieldName: string;\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n setFromOpts(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n set(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n cleanupOnEntityDeleted(): Promise<void> {\n return Promise.resolve();\n }\n\n maybeCascadeDelete(): void {}\n\n get meta(): EntityMetadata {\n return getMetadata(this.entity);\n }\n\n abstract doGet(): U[];\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n protected filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n return opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && !(e as any).isSoftDeletedEntity);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\nexport class RecursiveParentsCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2oName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2oName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2oName = m2oName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n // If we have `[grandchild, newlyCreatedParent, existingGrandparent, ...more...]`, skip up to the\n // `existingGrandparent`, because if we `.load(entity)` (i.e. where we are the `grandchild`) then\n // recursiveParentsBatchLoader will try CTE query up from `grandchild[parent]`, but since that will\n // be `newlyCreatedParent`, it doesn't have an id yet.\n const entityToLoad = opts.forceReload ? this.entity : this.findUnloadedReference()?.entity;\n if (entityToLoad && !entityToLoad.isNewEntity) {\n await (this.#loadPromise ??= recursiveParentsBatchLoader(this.entity.em, this)\n .load(entityToLoad)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n // See if there are any WIP changes, i.e. new parents, that the ^ SQL query didn't know to load.\n // We don't have to `while` loop this, because if parent itself has WIP changes above it, then\n // its own `RecursiveParentsCollectionImpl.load` will load it, before returning to this method.\n const unloadedParent = this.findUnloadedReference();\n if (unloadedParent) {\n await recursiveParentsBatchLoader(this.entity.em, this)\n .load(unloadedParent.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n }\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedReference() === undefined;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2oFieldName(): string {\n return this.#m2oName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveParentsCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n const unloaded = this.findUnloadedReference();\n if (unloaded) {\n throw new Error(this.toString() + `.get was called but ${unloaded} was not loaded`);\n }\n const parents: U[] = [];\n const visited = new Set<U>();\n for (\n let current = getLoadedReference(this.entity[this.#m2oName]);\n current !== undefined;\n current = getLoadedReference(current[this.#m2oName])\n ) {\n parents.push(current);\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return parents;\n }\n\n private findUnloadedReference(): Reference<any, any, any> | undefined {\n const visited = new Set<any>();\n for (let current = this.entity; current !== undefined; current = getLoadedReference(current[this.#m2oName])) {\n const relation = current[this.#m2oName];\n if (isReference(relation) && !isLoadedReference(relation)) return relation;\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return undefined;\n }\n}\n\nexport class RecursiveChildrenCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #o2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, o2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#o2mName = o2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveChildrenBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entities own `fooRecursive` collection so that it's marked as loaded.\n // We don't have to `while` loop this, because if they children themselves have any WIP\n // changes, then their own `RecursiveChildrenCollectionImpl.load` will load them.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get o2mFieldName(): string {\n return this.#o2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveChildrenCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const children: U[] = [];\n const visited = new Set<any>();\n // Use a node+path combo to know which path caused the cycle\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n for (const child of getLoadedCollection(relation)) {\n children.push(child);\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n return children;\n }\n\n /** Finds any children/downstream o2m collections or o2o references. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n const unloaded: Relation<any, any>[] = [];\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else if (isOneToOneReference(relation) && !isLoadedOneToOneReference(relation)) {\n unloaded.push(relation);\n } else {\n for (const child of getLoadedCollection(relation)) {\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n }\n return unloaded;\n }\n}\n\nexport class RecursiveM2mCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2mName = m2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveM2mBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entity's own `fooRecursive` collection so that it's marked as loaded.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2mFieldName(): string {\n return this.#m2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get m2mField(): ManyToManyField {\n return this.meta.allFields[this.#m2mName] as ManyToManyField;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveM2mCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const results: U[] = [];\n // Track by entity to handle diamonds (same entity reachable via multiple paths)\n const visited = new Set<any>();\n visited.add(this.entity);\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n for (const other of getLoadedCollection(current[this.#m2mName])) {\n if (visited.has(other)) {\n // If we're reaching an entity we've already visited, and it's this.entity, that's a cycle\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n // Otherwise it's a diamond (reachable via multiple paths) — skip\n continue;\n }\n visited.add(other);\n results.push(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n return results;\n }\n\n /** Finds any m2m collections that are not yet loaded in the recursive tree. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n visited.add(this.entity);\n const unloaded: Relation<any, any>[] = [];\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n const relation = current[this.#m2mName];\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else {\n for (const other of getLoadedCollection(relation)) {\n if (visited.has(other)) {\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n continue;\n }\n visited.add(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n }\n return unloaded;\n }\n}\n\nfunction getLoadedReference(relation: any): any {\n return isLoadedReference(relation) ? relation.get : fail(`${relation} was not loaded`);\n}\n\nfunction getLoadedCollection(relation: any): any {\n return isLoadedCollection(relation)\n ? relation.get\n : isLoadedOneToOneReference(relation)\n ? relation.get\n ? [relation.get]\n : []\n : fail(`${relation} was not loaded`);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RecursiveCollection.js","names":["#fieldName","#m2oName","#otherFieldName","#loaded","#loadPromise","#o2mName","#m2mName"],"sources":["../../src/relations/RecursiveCollection.ts"],"sourcesContent":["import { recursiveChildrenBatchLoader } from \"../batchloaders/recursiveChildrenBatchLoader.ts\";\nimport { recursiveM2mBatchLoader } from \"../batchloaders/recursiveM2mBatchLoader.ts\";\nimport { recursiveParentsBatchLoader } from \"../batchloaders/recursiveParentsBatchLoader.ts\";\nimport {\n type Entity,\n type EntityMetadata,\n type ManyToManyField,\n type Reference,\n type Relation,\n appendStack,\n ensureNotDeleted,\n fail,\n getEmInternalApi,\n getMetadata,\n isCollection,\n isLoadedCollection,\n isLoadedOneToOneReference,\n isLoadedReference,\n isOneToOneReference,\n isReference,\n} from \"../index.ts\";\nimport type { IsLoadedCachable } from \"../loading/IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { type ReadOnlyCollection } from \"./ReadOnlyCollection.ts\";\nimport { RecursiveCycleError } from \"./RecursiveCycleError.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nexport { RecursiveCycleError };\n\n/**\n * An alias for creating `RecursiveParentsCollectionImpl`s.\n *\n * I.e. for `Author.mentor` (m2o fk), we can return `Author.mentorsRecursive` recursively looking up.\n */\nexport function hasRecursiveParents<T extends Entity, U extends Entity>(\n m2oName: keyof T & string, // i.e. `author.mentor`\n otherFieldName: keyof T & string, // i.e. `author.menteesRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveParentsCollectionImpl(entity, fieldName as keyof T & string, m2oName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveChildrenCollectionImpl`s.\n *\n * I.e. for `Author.mentees` (o2m), we can return `Author.menteesRecursive` recursively looking down.\n */\nexport function hasRecursiveChildren<T extends Entity, U extends Entity>(\n o2mName: keyof T & string, // i.e. `author.mentees`\n otherFieldName: keyof T & string, // i.e. `author.mentorsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveChildrenCollectionImpl(entity, fieldName as keyof T & string, o2mName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveM2mCollectionImpl`s.\n *\n * I.e. for `User.parents` (m2m), we can return `User.parentsRecursive` recursively looking up through the m2m.\n * Or for `User.children` (m2m), we can return `User.childrenRecursive` recursively looking down.\n */\nexport function hasRecursiveM2m<T extends Entity, U extends Entity>(\n m2mName: keyof T & string, // i.e. `user.parents` or `user.children`\n otherFieldName: keyof T & string, // i.e. `user.childrenRecursive` or `user.parentsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveM2mCollectionImpl(entity, fieldName as keyof T & string, m2mName, otherFieldName);\n });\n}\n\n/**\n * A base class for the common methods between the parent & children recursive collections.\n *\n * We could probably move some of this into AbstractRelationImpl?\n */\nabstract class AbstractRecursiveCollectionImpl<T extends Entity, U extends Entity> extends AbstractRelationImpl<\n T,\n U[]\n> {\n abstract fieldName: string;\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n setFromOpts(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n set(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n cleanupOnEntityDeleted(): Promise<void> {\n return Promise.resolve();\n }\n\n maybeCascadeDelete(): void {}\n\n get meta(): EntityMetadata {\n return getMetadata(this.entity);\n }\n\n abstract doGet(): U[];\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n protected filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n return opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && !(e as any).isSoftDeletedEntity);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\nexport class RecursiveParentsCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2oName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2oName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2oName = m2oName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n // If we have `[grandchild, newlyCreatedParent, existingGrandparent, ...more...]`, skip up to the\n // `existingGrandparent`, because if we `.load(entity)` (i.e. where we are the `grandchild`) then\n // recursiveParentsBatchLoader will try CTE query up from `grandchild[parent]`, but since that will\n // be `newlyCreatedParent`, it doesn't have an id yet.\n const entityToLoad = opts.forceReload ? this.entity : this.findUnloadedReference()?.entity;\n if (entityToLoad && !entityToLoad.isNewEntity) {\n await (this.#loadPromise ??= recursiveParentsBatchLoader(this.entity.em, this)\n .load(entityToLoad)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n // See if there are any WIP changes, i.e. new parents, that the ^ SQL query didn't know to load.\n // We don't have to `while` loop this, because if parent itself has WIP changes above it, then\n // its own `RecursiveParentsCollectionImpl.load` will load it, before returning to this method.\n const unloadedParent = this.findUnloadedReference();\n if (unloadedParent) {\n await recursiveParentsBatchLoader(this.entity.em, this)\n .load(unloadedParent.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n }\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedReference() === undefined;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2oFieldName(): string {\n return this.#m2oName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveParentsCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n const unloaded = this.findUnloadedReference();\n if (unloaded) {\n throw new Error(this.toString() + `.get was called but ${unloaded} was not loaded`);\n }\n const parents: U[] = [];\n const visited = new Set<U>();\n for (\n let current = getLoadedReference(this.entity[this.#m2oName]);\n current !== undefined;\n current = getLoadedReference(current[this.#m2oName])\n ) {\n parents.push(current);\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return parents;\n }\n\n private findUnloadedReference(): Reference<any, any, any> | undefined {\n const visited = new Set<any>();\n for (let current = this.entity; current !== undefined; current = getLoadedReference(current[this.#m2oName])) {\n const relation = current[this.#m2oName];\n if (isReference(relation) && !isLoadedReference(relation)) return relation;\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return undefined;\n }\n}\n\nexport class RecursiveChildrenCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #o2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, o2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#o2mName = o2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveChildrenBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entities own `fooRecursive` collection so that it's marked as loaded.\n // We don't have to `while` loop this, because if they children themselves have any WIP\n // changes, then their own `RecursiveChildrenCollectionImpl.load` will load them.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get o2mFieldName(): string {\n return this.#o2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveChildrenCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const children: U[] = [];\n const visited = new Set<any>();\n // Use a node+path combo to know which path caused the cycle\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n for (const child of getLoadedCollection(relation)) {\n children.push(child);\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n return children;\n }\n\n /** Finds any children/downstream o2m collections or o2o references. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n const unloaded: Relation<any, any>[] = [];\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else if (isOneToOneReference(relation) && !isLoadedOneToOneReference(relation)) {\n unloaded.push(relation);\n } else {\n for (const child of getLoadedCollection(relation)) {\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n }\n return unloaded;\n }\n}\n\nexport class RecursiveM2mCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2mName = m2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveM2mBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entity's own `fooRecursive` collection so that it's marked as loaded.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2mFieldName(): string {\n return this.#m2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get m2mField(): ManyToManyField {\n return this.meta.allFields[this.#m2mName] as ManyToManyField;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveM2mCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const results: U[] = [];\n // Track by entity to handle diamonds (same entity reachable via multiple paths)\n const visited = new Set<any>();\n visited.add(this.entity);\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n for (const other of getLoadedCollection(current[this.#m2mName])) {\n if (visited.has(other)) {\n // If we're reaching an entity we've already visited, and it's this.entity, that's a cycle\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n // Otherwise it's a diamond (reachable via multiple paths) — skip\n continue;\n }\n visited.add(other);\n results.push(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n return results;\n }\n\n /** Finds any m2m collections that are not yet loaded in the recursive tree. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n visited.add(this.entity);\n const unloaded: Relation<any, any>[] = [];\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n const relation = current[this.#m2mName];\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else {\n for (const other of getLoadedCollection(relation)) {\n if (visited.has(other)) {\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n continue;\n }\n visited.add(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n }\n return unloaded;\n }\n}\n\nfunction getLoadedReference(relation: any): any {\n return isLoadedReference(relation) ? relation.get : fail(`${relation} was not loaded`);\n}\n\nfunction getLoadedCollection(relation: any): any {\n return isLoadedCollection(relation)\n ? relation.get\n : isLoadedOneToOneReference(relation)\n ? relation.get\n ? [relation.get]\n : []\n : fail(`${relation} was not loaded`);\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_ReferenceSymbols = require("./ReferenceSymbols.cjs");
|
|
3
|
+
const require_relations_CustomReference = require("./CustomReference.cjs");
|
|
3
4
|
const require_relations_ManyToOneReference = require("./ManyToOneReference.cjs");
|
|
4
5
|
const require_relations_ReactiveReference = require("./ReactiveReference.cjs");
|
|
5
6
|
const require_relations_OneToOneReference = require("./OneToOneReference.cjs");
|
|
6
|
-
const require_relations_CustomReference = require("./CustomReference.cjs");
|
|
7
7
|
const require_relations_PolymorphicReference = require("./PolymorphicReference.cjs");
|
|
8
8
|
require("./index.cjs");
|
|
9
9
|
require("../EntityManager.cjs");
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ReferenceN } from "./ReferenceSymbols.js";
|
|
2
|
+
import { CustomReference } from "./CustomReference.js";
|
|
2
3
|
import { ManyToOneReferenceImpl } from "./ManyToOneReference.js";
|
|
3
4
|
import { ReactiveReferenceImpl } from "./ReactiveReference.js";
|
|
4
5
|
import { OneToOneReferenceImpl } from "./OneToOneReference.js";
|
|
5
|
-
import { CustomReference } from "./CustomReference.js";
|
|
6
6
|
import { PolymorphicReferenceImpl } from "./PolymorphicReference.js";
|
|
7
7
|
import "./index.js";
|
|
8
8
|
import "../EntityManager.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const
|
|
2
|
+
const require_loading_loadHints = require("../loading/loadHints.cjs");
|
|
3
3
|
const require_newEntity = require("../newEntity.cjs");
|
|
4
4
|
require("../Entity.cjs");
|
|
5
5
|
//#region src/relations/hasAsyncMethod.ts
|
|
@@ -35,7 +35,7 @@ var AsyncMethodImpl = class {
|
|
|
35
35
|
return this.fn(this.#entity, ...args);
|
|
36
36
|
}
|
|
37
37
|
get isLoaded() {
|
|
38
|
-
return this.loaded ||
|
|
38
|
+
return this.loaded || require_loading_loadHints.isLoaded(this.#entity, this.#hint);
|
|
39
39
|
}
|
|
40
40
|
[AsyncMethodM];
|
|
41
41
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasAsyncMethod.cjs","names":["lazyField","#entity","#hint","isLoaded"],"sources":["../../src/relations/hasAsyncMethod.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type LoadHint, type Loaded, isLoaded } from \"../loadHints.ts\";\nimport { lazyField } from \"../newEntity.ts\";\n\nconst AsyncMethodM = Symbol();\nexport const AsyncMethodPopulateSecret = Symbol();\n\nexport interface AsyncMethod<T extends Entity, A extends unknown[], V> {\n // To differentiate from AsyncProperties\n [AsyncMethodM]: undefined;\n isLoaded: boolean;\n load(...args: A): Promise<V>;\n}\n\nexport interface LoadedMethod<T extends Entity, A extends unknown[], V> {\n call(...args: A): V;\n}\n\nexport function hasAsyncMethod<T extends Entity, const H extends LoadHint<T>, A extends unknown[], V>(\n loadHint: H,\n fn: (entity: Loaded<T, H>, ...args: A) => V,\n): AsyncMethod<T, A, V> {\n return lazyField((entity: T) => {\n return new AsyncMethodImpl(entity, loadHint, fn);\n });\n}\n\nexport class AsyncMethodImpl<T extends Entity, H extends LoadHint<T>, A extends unknown[], V> implements AsyncMethod<\n T,\n A,\n V\n> {\n private loaded = false;\n private loadPromise: Promise<any> | undefined;\n\n readonly #entity: T;\n readonly #hint: H;\n constructor(\n entity: T,\n hint: H,\n private fn: (entity: Loaded<T, H>, ...args: A) => V,\n ) {\n this.#entity = entity;\n this.#hint = hint;\n }\n\n /** Args might be either the user-provided args, or the populate `opts` if we're being preloaded. */\n async load(...args: A): Promise<V> {\n // Are we being called by `em.populate`? If so, we don't have the real args, so avoid invoking fn\n const isPopulate = args && typeof args[0] === \"object\" && AsyncMethodPopulateSecret in (args as any)[0];\n if (!this.loaded) {\n this.loadPromise ??= this.#entity.em.populate(this.#entity, this.#hint!).then((loaded) => (this.loaded = true));\n await this.loadPromise;\n }\n return isPopulate ? (undefined as any) : this.call(...args);\n }\n\n call(...args: A): V {\n if (!this.isLoaded) {\n throw new Error(\"hasAsyncMethod.call was called but not loaded\");\n }\n return this.fn(this.#entity as Loaded<T, H>, ...args);\n }\n\n get isLoaded() {\n return this.loaded || isLoaded(this.#entity, this.#hint);\n }\n\n [AsyncMethodM]: undefined;\n}\n"],"mappings":";;;;;AAIA,MAAM,eAAe,OAAO;AAC5B,MAAa,4BAA4B,OAAO;AAahD,SAAgB,eACd,UACA,IACsB;CACtB,OAAOA,kBAAAA,WAAW,WAAc;EAC9B,OAAO,IAAI,gBAAgB,QAAQ,UAAU,EAAE;CACjD,CAAC;AACH;AAEA,IAAa,kBAAb,MAIE;CASU;CARV,SAAiB;CACjB;CAEA;CACA;CACA,YACE,QACA,MACA,IACA;EADQ,KAAA,KAAA;EAER,KAAKC,UAAU;EACf,KAAKC,QAAQ;CACf;;CAGA,MAAM,KAAK,GAAG,MAAqB;EAEjC,MAAM,aAAa,QAAQ,OAAO,KAAK,OAAO,YAAY,6BAA8B,KAAa;EACrG,IAAI,CAAC,KAAK,QAAQ;GAChB,KAAK,gBAAgB,KAAKD,QAAQ,GAAG,SAAS,KAAKA,SAAS,KAAKC,KAAM,CAAC,CAAC,MAAM,WAAY,KAAK,SAAS,IAAK;GAC9G,MAAM,KAAK;EACb;EACA,OAAO,aAAc,KAAA,IAAoB,KAAK,KAAK,GAAG,IAAI;CAC5D;CAEA,KAAK,GAAG,MAAY;EAClB,IAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,+CAA+C;EAEjE,OAAO,KAAK,GAAG,KAAKD,SAAyB,GAAG,IAAI;CACtD;CAEA,IAAI,WAAW;EACb,OAAO,KAAK,UAAUE,
|
|
1
|
+
{"version":3,"file":"hasAsyncMethod.cjs","names":["lazyField","#entity","#hint","isLoaded"],"sources":["../../src/relations/hasAsyncMethod.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type LoadHint, type Loaded, isLoaded } from \"../loading/loadHints.ts\";\nimport { lazyField } from \"../newEntity.ts\";\n\nconst AsyncMethodM = Symbol();\nexport const AsyncMethodPopulateSecret = Symbol();\n\nexport interface AsyncMethod<T extends Entity, A extends unknown[], V> {\n // To differentiate from AsyncProperties\n [AsyncMethodM]: undefined;\n isLoaded: boolean;\n load(...args: A): Promise<V>;\n}\n\nexport interface LoadedMethod<T extends Entity, A extends unknown[], V> {\n call(...args: A): V;\n}\n\nexport function hasAsyncMethod<T extends Entity, const H extends LoadHint<T>, A extends unknown[], V>(\n loadHint: H,\n fn: (entity: Loaded<T, H>, ...args: A) => V,\n): AsyncMethod<T, A, V> {\n return lazyField((entity: T) => {\n return new AsyncMethodImpl(entity, loadHint, fn);\n });\n}\n\nexport class AsyncMethodImpl<T extends Entity, H extends LoadHint<T>, A extends unknown[], V> implements AsyncMethod<\n T,\n A,\n V\n> {\n private loaded = false;\n private loadPromise: Promise<any> | undefined;\n\n readonly #entity: T;\n readonly #hint: H;\n constructor(\n entity: T,\n hint: H,\n private fn: (entity: Loaded<T, H>, ...args: A) => V,\n ) {\n this.#entity = entity;\n this.#hint = hint;\n }\n\n /** Args might be either the user-provided args, or the populate `opts` if we're being preloaded. */\n async load(...args: A): Promise<V> {\n // Are we being called by `em.populate`? If so, we don't have the real args, so avoid invoking fn\n const isPopulate = args && typeof args[0] === \"object\" && AsyncMethodPopulateSecret in (args as any)[0];\n if (!this.loaded) {\n this.loadPromise ??= this.#entity.em.populate(this.#entity, this.#hint!).then((loaded) => (this.loaded = true));\n await this.loadPromise;\n }\n return isPopulate ? (undefined as any) : this.call(...args);\n }\n\n call(...args: A): V {\n if (!this.isLoaded) {\n throw new Error(\"hasAsyncMethod.call was called but not loaded\");\n }\n return this.fn(this.#entity as Loaded<T, H>, ...args);\n }\n\n get isLoaded() {\n return this.loaded || isLoaded(this.#entity, this.#hint);\n }\n\n [AsyncMethodM]: undefined;\n}\n"],"mappings":";;;;;AAIA,MAAM,eAAe,OAAO;AAC5B,MAAa,4BAA4B,OAAO;AAahD,SAAgB,eACd,UACA,IACsB;CACtB,OAAOA,kBAAAA,WAAW,WAAc;EAC9B,OAAO,IAAI,gBAAgB,QAAQ,UAAU,EAAE;CACjD,CAAC;AACH;AAEA,IAAa,kBAAb,MAIE;CASU;CARV,SAAiB;CACjB;CAEA;CACA;CACA,YACE,QACA,MACA,IACA;EADQ,KAAA,KAAA;EAER,KAAKC,UAAU;EACf,KAAKC,QAAQ;CACf;;CAGA,MAAM,KAAK,GAAG,MAAqB;EAEjC,MAAM,aAAa,QAAQ,OAAO,KAAK,OAAO,YAAY,6BAA8B,KAAa;EACrG,IAAI,CAAC,KAAK,QAAQ;GAChB,KAAK,gBAAgB,KAAKD,QAAQ,GAAG,SAAS,KAAKA,SAAS,KAAKC,KAAM,CAAC,CAAC,MAAM,WAAY,KAAK,SAAS,IAAK;GAC9G,MAAM,KAAK;EACb;EACA,OAAO,aAAc,KAAA,IAAoB,KAAK,KAAK,GAAG,IAAI;CAC5D;CAEA,KAAK,GAAG,MAAY;EAClB,IAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,+CAA+C;EAEjE,OAAO,KAAK,GAAG,KAAKD,SAAyB,GAAG,IAAI;CACtD;CAEA,IAAI,WAAW;EACb,OAAO,KAAK,UAAUE,0BAAAA,SAAS,KAAKF,SAAS,KAAKC,KAAK;CACzD;CAEA,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasAsyncMethod.js","names":["#entity","#hint"],"sources":["../../src/relations/hasAsyncMethod.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type LoadHint, type Loaded, isLoaded } from \"../loadHints.ts\";\nimport { lazyField } from \"../newEntity.ts\";\n\nconst AsyncMethodM = Symbol();\nexport const AsyncMethodPopulateSecret = Symbol();\n\nexport interface AsyncMethod<T extends Entity, A extends unknown[], V> {\n // To differentiate from AsyncProperties\n [AsyncMethodM]: undefined;\n isLoaded: boolean;\n load(...args: A): Promise<V>;\n}\n\nexport interface LoadedMethod<T extends Entity, A extends unknown[], V> {\n call(...args: A): V;\n}\n\nexport function hasAsyncMethod<T extends Entity, const H extends LoadHint<T>, A extends unknown[], V>(\n loadHint: H,\n fn: (entity: Loaded<T, H>, ...args: A) => V,\n): AsyncMethod<T, A, V> {\n return lazyField((entity: T) => {\n return new AsyncMethodImpl(entity, loadHint, fn);\n });\n}\n\nexport class AsyncMethodImpl<T extends Entity, H extends LoadHint<T>, A extends unknown[], V> implements AsyncMethod<\n T,\n A,\n V\n> {\n private loaded = false;\n private loadPromise: Promise<any> | undefined;\n\n readonly #entity: T;\n readonly #hint: H;\n constructor(\n entity: T,\n hint: H,\n private fn: (entity: Loaded<T, H>, ...args: A) => V,\n ) {\n this.#entity = entity;\n this.#hint = hint;\n }\n\n /** Args might be either the user-provided args, or the populate `opts` if we're being preloaded. */\n async load(...args: A): Promise<V> {\n // Are we being called by `em.populate`? If so, we don't have the real args, so avoid invoking fn\n const isPopulate = args && typeof args[0] === \"object\" && AsyncMethodPopulateSecret in (args as any)[0];\n if (!this.loaded) {\n this.loadPromise ??= this.#entity.em.populate(this.#entity, this.#hint!).then((loaded) => (this.loaded = true));\n await this.loadPromise;\n }\n return isPopulate ? (undefined as any) : this.call(...args);\n }\n\n call(...args: A): V {\n if (!this.isLoaded) {\n throw new Error(\"hasAsyncMethod.call was called but not loaded\");\n }\n return this.fn(this.#entity as Loaded<T, H>, ...args);\n }\n\n get isLoaded() {\n return this.loaded || isLoaded(this.#entity, this.#hint);\n }\n\n [AsyncMethodM]: undefined;\n}\n"],"mappings":";;;;AAIA,MAAM,eAAe,OAAO;AAC5B,MAAa,4BAA4B,OAAO;AAahD,SAAgB,eACd,UACA,IACsB;CACtB,OAAO,WAAW,WAAc;EAC9B,OAAO,IAAI,gBAAgB,QAAQ,UAAU,EAAE;CACjD,CAAC;AACH;AAEA,IAAa,kBAAb,MAIE;CASU;CARV,SAAiB;CACjB;CAEA;CACA;CACA,YACE,QACA,MACA,IACA;EADQ,KAAA,KAAA;EAER,KAAKA,UAAU;EACf,KAAKC,QAAQ;CACf;;CAGA,MAAM,KAAK,GAAG,MAAqB;EAEjC,MAAM,aAAa,QAAQ,OAAO,KAAK,OAAO,YAAY,6BAA8B,KAAa;EACrG,IAAI,CAAC,KAAK,QAAQ;GAChB,KAAK,gBAAgB,KAAKD,QAAQ,GAAG,SAAS,KAAKA,SAAS,KAAKC,KAAM,CAAC,CAAC,MAAM,WAAY,KAAK,SAAS,IAAK;GAC9G,MAAM,KAAK;EACb;EACA,OAAO,aAAc,KAAA,IAAoB,KAAK,KAAK,GAAG,IAAI;CAC5D;CAEA,KAAK,GAAG,MAAY;EAClB,IAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,+CAA+C;EAEjE,OAAO,KAAK,GAAG,KAAKD,SAAyB,GAAG,IAAI;CACtD;CAEA,IAAI,WAAW;EACb,OAAO,KAAK,UAAU,SAAS,KAAKA,SAAS,KAAKC,KAAK;CACzD;CAEA,CAAC;AACH"}
|
|
1
|
+
{"version":3,"file":"hasAsyncMethod.js","names":["#entity","#hint"],"sources":["../../src/relations/hasAsyncMethod.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type LoadHint, type Loaded, isLoaded } from \"../loading/loadHints.ts\";\nimport { lazyField } from \"../newEntity.ts\";\n\nconst AsyncMethodM = Symbol();\nexport const AsyncMethodPopulateSecret = Symbol();\n\nexport interface AsyncMethod<T extends Entity, A extends unknown[], V> {\n // To differentiate from AsyncProperties\n [AsyncMethodM]: undefined;\n isLoaded: boolean;\n load(...args: A): Promise<V>;\n}\n\nexport interface LoadedMethod<T extends Entity, A extends unknown[], V> {\n call(...args: A): V;\n}\n\nexport function hasAsyncMethod<T extends Entity, const H extends LoadHint<T>, A extends unknown[], V>(\n loadHint: H,\n fn: (entity: Loaded<T, H>, ...args: A) => V,\n): AsyncMethod<T, A, V> {\n return lazyField((entity: T) => {\n return new AsyncMethodImpl(entity, loadHint, fn);\n });\n}\n\nexport class AsyncMethodImpl<T extends Entity, H extends LoadHint<T>, A extends unknown[], V> implements AsyncMethod<\n T,\n A,\n V\n> {\n private loaded = false;\n private loadPromise: Promise<any> | undefined;\n\n readonly #entity: T;\n readonly #hint: H;\n constructor(\n entity: T,\n hint: H,\n private fn: (entity: Loaded<T, H>, ...args: A) => V,\n ) {\n this.#entity = entity;\n this.#hint = hint;\n }\n\n /** Args might be either the user-provided args, or the populate `opts` if we're being preloaded. */\n async load(...args: A): Promise<V> {\n // Are we being called by `em.populate`? If so, we don't have the real args, so avoid invoking fn\n const isPopulate = args && typeof args[0] === \"object\" && AsyncMethodPopulateSecret in (args as any)[0];\n if (!this.loaded) {\n this.loadPromise ??= this.#entity.em.populate(this.#entity, this.#hint!).then((loaded) => (this.loaded = true));\n await this.loadPromise;\n }\n return isPopulate ? (undefined as any) : this.call(...args);\n }\n\n call(...args: A): V {\n if (!this.isLoaded) {\n throw new Error(\"hasAsyncMethod.call was called but not loaded\");\n }\n return this.fn(this.#entity as Loaded<T, H>, ...args);\n }\n\n get isLoaded() {\n return this.loaded || isLoaded(this.#entity, this.#hint);\n }\n\n [AsyncMethodM]: undefined;\n}\n"],"mappings":";;;;AAIA,MAAM,eAAe,OAAO;AAC5B,MAAa,4BAA4B,OAAO;AAahD,SAAgB,eACd,UACA,IACsB;CACtB,OAAO,WAAW,WAAc;EAC9B,OAAO,IAAI,gBAAgB,QAAQ,UAAU,EAAE;CACjD,CAAC;AACH;AAEA,IAAa,kBAAb,MAIE;CASU;CARV,SAAiB;CACjB;CAEA;CACA;CACA,YACE,QACA,MACA,IACA;EADQ,KAAA,KAAA;EAER,KAAKA,UAAU;EACf,KAAKC,QAAQ;CACf;;CAGA,MAAM,KAAK,GAAG,MAAqB;EAEjC,MAAM,aAAa,QAAQ,OAAO,KAAK,OAAO,YAAY,6BAA8B,KAAa;EACrG,IAAI,CAAC,KAAK,QAAQ;GAChB,KAAK,gBAAgB,KAAKD,QAAQ,GAAG,SAAS,KAAKA,SAAS,KAAKC,KAAM,CAAC,CAAC,MAAM,WAAY,KAAK,SAAS,IAAK;GAC9G,MAAM,KAAK;EACb;EACA,OAAO,aAAc,KAAA,IAAoB,KAAK,KAAK,GAAG,IAAI;CAC5D;CAEA,KAAK,GAAG,MAAY;EAClB,IAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,+CAA+C;EAEjE,OAAO,KAAK,GAAG,KAAKD,SAAyB,GAAG,IAAI;CACtD;CAEA,IAAI,WAAW;EACb,OAAO,KAAK,UAAU,SAAS,KAAKA,SAAS,KAAKC,KAAK;CACzD;CAEA,CAAC;AACH"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_loadHints = require("../loadHints.cjs");
|
|
3
|
-
const require_newEntity = require("../newEntity.cjs");
|
|
4
2
|
const require_relations_CustomCollection = require("./CustomCollection.cjs");
|
|
3
|
+
const require_loading_loadHints = require("../loading/loadHints.cjs");
|
|
4
|
+
const require_newEntity = require("../newEntity.cjs");
|
|
5
5
|
require("../index.cjs");
|
|
6
6
|
require("../Entity.cjs");
|
|
7
7
|
//#region src/relations/hasManyDerived.ts
|
|
@@ -23,7 +23,7 @@ function hasManyDerived(loadHint, opts) {
|
|
|
23
23
|
...opts
|
|
24
24
|
});
|
|
25
25
|
},
|
|
26
|
-
isLoaded: () =>
|
|
26
|
+
isLoaded: () => require_loading_loadHints.isLoaded(entity, loadHint),
|
|
27
27
|
loadHint,
|
|
28
28
|
...rest
|
|
29
29
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasManyDerived.cjs","names":["lazyField","CustomCollection","isLoaded"],"sources":["../../src/relations/hasManyDerived.ts"],"sourcesContent":["import { type Collection, isLoaded } from \"..//index.ts\";\nimport { type Entity } from \"../Entity.ts\";\nimport {
|
|
1
|
+
{"version":3,"file":"hasManyDerived.cjs","names":["lazyField","CustomCollection","isLoaded"],"sources":["../../src/relations/hasManyDerived.ts"],"sourcesContent":["import { type Collection, isLoaded } from \"..//index.ts\";\nimport { type Entity } from \"../Entity.ts\";\nimport type { LoadHint, Loaded } from \"../loading/loadHints.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { CustomCollection } from \"./CustomCollection.ts\";\n\ntype HasManyDerivedOpts<T extends Entity, U extends Entity, H extends LoadHint<T>> = {\n load?: (entity: T, opts: { forceReload?: boolean }) => Promise<any>;\n get: (entity: Loaded<T, H>) => readonly U[];\n set?: (entity: Loaded<T, H>, values: U[]) => void;\n add?: (entity: Loaded<T, H>, value: U) => void;\n remove?: (entity: Loaded<T, H>, value: U) => void;\n};\n\n/**\n * Creates a CustomCollection that can conditionally walk across references in the object graph.\n *\n * I.e. An Author \"has many reviews\" through the `author -> books -> reviews` relation.\n *\n * Because this is based on `CustomCollection`, it will work in populates, i.e. `em.populate(author, \"reviews\")`.\n */\nexport function hasManyDerived<T extends Entity, U extends Entity, H extends LoadHint<T>>(\n loadHint: H,\n opts: HasManyDerivedOpts<T, U, H>,\n): Collection<T, U> {\n const { load, ...rest } = opts;\n return lazyField((entity: T) => {\n return new CustomCollection<T, U>(entity, {\n load(entity, opts) {\n if (load) {\n return load(entity, opts);\n } else {\n return entity.em.populate(entity, { hint: loadHint, ...opts });\n }\n },\n isLoaded: () => isLoaded(entity, loadHint),\n loadHint,\n ...(rest as any),\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;AAqBA,SAAgB,eACd,UACA,MACkB;CAClB,MAAM,EAAE,MAAM,GAAG,SAAS;CAC1B,OAAOA,kBAAAA,WAAW,WAAc;EAC9B,OAAO,IAAIC,mCAAAA,iBAAuB,QAAQ;GACxC,KAAK,QAAQ,MAAM;IACjB,IAAI,MACF,OAAO,KAAK,QAAQ,IAAI;SAExB,OAAO,OAAO,GAAG,SAAS,QAAQ;KAAE,MAAM;KAAU,GAAG;IAAK,CAAC;GAEjE;GACA,gBAAgBC,0BAAAA,SAAS,QAAQ,QAAQ;GACzC;GACA,GAAI;EACN,CAAC;CACH,CAAC;AACH"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Collection } from "./Collection.cjs";
|
|
2
|
-
import { LoadHint, Loaded } from "../loadHints.cjs";
|
|
2
|
+
import { LoadHint, Loaded } from "../loading/loadHints.cjs";
|
|
3
3
|
import "../index.cjs";
|
|
4
4
|
import { Entity } from "../Entity.cjs";
|
|
5
5
|
//#region src/relations/hasManyDerived.d.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Collection } from "./Collection.mjs";
|
|
2
|
-
import { LoadHint, Loaded } from "../loadHints.mjs";
|
|
2
|
+
import { LoadHint, Loaded } from "../loading/loadHints.mjs";
|
|
3
3
|
import "../index.mjs";
|
|
4
4
|
import { Entity } from "../Entity.mjs";
|
|
5
5
|
//#region src/relations/hasManyDerived.d.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { isLoaded } from "../loadHints.js";
|
|
2
|
-
import { lazyField } from "../newEntity.js";
|
|
3
1
|
import { CustomCollection } from "./CustomCollection.js";
|
|
2
|
+
import { isLoaded } from "../loading/loadHints.js";
|
|
3
|
+
import { lazyField } from "../newEntity.js";
|
|
4
4
|
import "../index.js";
|
|
5
5
|
import "../Entity.js";
|
|
6
6
|
//#region src/relations/hasManyDerived.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasManyDerived.js","names":[],"sources":["../../src/relations/hasManyDerived.ts"],"sourcesContent":["import { type Collection, isLoaded } from \"..//index.ts\";\nimport { type Entity } from \"../Entity.ts\";\nimport {
|
|
1
|
+
{"version":3,"file":"hasManyDerived.js","names":[],"sources":["../../src/relations/hasManyDerived.ts"],"sourcesContent":["import { type Collection, isLoaded } from \"..//index.ts\";\nimport { type Entity } from \"../Entity.ts\";\nimport type { LoadHint, Loaded } from \"../loading/loadHints.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { CustomCollection } from \"./CustomCollection.ts\";\n\ntype HasManyDerivedOpts<T extends Entity, U extends Entity, H extends LoadHint<T>> = {\n load?: (entity: T, opts: { forceReload?: boolean }) => Promise<any>;\n get: (entity: Loaded<T, H>) => readonly U[];\n set?: (entity: Loaded<T, H>, values: U[]) => void;\n add?: (entity: Loaded<T, H>, value: U) => void;\n remove?: (entity: Loaded<T, H>, value: U) => void;\n};\n\n/**\n * Creates a CustomCollection that can conditionally walk across references in the object graph.\n *\n * I.e. An Author \"has many reviews\" through the `author -> books -> reviews` relation.\n *\n * Because this is based on `CustomCollection`, it will work in populates, i.e. `em.populate(author, \"reviews\")`.\n */\nexport function hasManyDerived<T extends Entity, U extends Entity, H extends LoadHint<T>>(\n loadHint: H,\n opts: HasManyDerivedOpts<T, U, H>,\n): Collection<T, U> {\n const { load, ...rest } = opts;\n return lazyField((entity: T) => {\n return new CustomCollection<T, U>(entity, {\n load(entity, opts) {\n if (load) {\n return load(entity, opts);\n } else {\n return entity.em.populate(entity, { hint: loadHint, ...opts });\n }\n },\n isLoaded: () => isLoaded(entity, loadHint),\n loadHint,\n ...(rest as any),\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;AAqBA,SAAgB,eACd,UACA,MACkB;CAClB,MAAM,EAAE,MAAM,GAAG,SAAS;CAC1B,OAAO,WAAW,WAAc;EAC9B,OAAO,IAAI,iBAAuB,QAAQ;GACxC,KAAK,QAAQ,MAAM;IACjB,IAAI,MACF,OAAO,KAAK,QAAQ,IAAI;SAExB,OAAO,OAAO,GAAG,SAAS,QAAQ;KAAE,MAAM;KAAU,GAAG;IAAK,CAAC;GAEjE;GACA,gBAAgB,SAAS,QAAQ,QAAQ;GACzC;GACA,GAAI;EACN,CAAC;CACH,CAAC;AACH"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_newEntity = require("../newEntity.cjs");
|
|
3
2
|
const require_relations_CustomCollection = require("./CustomCollection.cjs");
|
|
3
|
+
const require_newEntity = require("../newEntity.cjs");
|
|
4
4
|
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
5
|
-
const
|
|
5
|
+
const require_loading_loadLens = require("../loading/loadLens.cjs");
|
|
6
6
|
require("../index.cjs");
|
|
7
7
|
//#region src/relations/hasManyThrough.ts
|
|
8
8
|
/**
|
|
@@ -16,10 +16,10 @@ function hasManyThrough(lens) {
|
|
|
16
16
|
return require_newEntity.lazyField((entity) => {
|
|
17
17
|
const meta = require_EntityMetadata.getMetadata(entity);
|
|
18
18
|
return new require_relations_CustomCollection.CustomCollection(entity, {
|
|
19
|
-
load: (entity, opts) =>
|
|
20
|
-
get: () =>
|
|
21
|
-
isLoaded: () =>
|
|
22
|
-
loadHint: () =>
|
|
19
|
+
load: (entity, opts) => require_loading_loadLens.loadLens(entity, lens, opts),
|
|
20
|
+
get: () => require_loading_loadLens.getLens(meta, entity, lens),
|
|
21
|
+
isLoaded: () => require_loading_loadLens.isLensLoaded(entity, lens),
|
|
22
|
+
loadHint: () => require_loading_loadLens.lensToLoadHint(lens)
|
|
23
23
|
});
|
|
24
24
|
});
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasManyThrough.cjs","names":["lazyField","getMetadata","CustomCollection","loadLens","getLens","isLensLoaded","lensToLoadHint"],"sources":["../../src/relations/hasManyThrough.ts"],"sourcesContent":["import {\n type Collection,\n CustomCollection,\n type Entity,\n type Lens,\n getLens,\n getMetadata,\n isLensLoaded,\n lensToLoadHint,\n loadLens,\n} from \"../index.ts\";\nimport { lazyField } from \"../newEntity.ts\";\n\n/**\n * Creates a CustomCollection that will walk across references in the object graph.\n *\n * I.e. An Author \"has many reviews\" through the `author -> books -> reviews` relation.\n *\n * Because this is based on `CustomCollection`, it will work in populates, i.e. `em.populate(author, \"reviews\")`.\n */\nexport function hasManyThrough<T extends Entity, U extends Entity>(\n lens: (lens: Lens<T>) => Lens<U, U[]>,\n): Collection<T, U> {\n return lazyField((entity: T) => {\n const meta = getMetadata(entity);\n return new CustomCollection<T, U>(entity, {\n load: (entity, opts) => loadLens(entity, lens, opts),\n get: () => getLens(meta, entity, lens),\n isLoaded: () => isLensLoaded(entity, lens),\n loadHint: () => lensToLoadHint(lens),\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;AAoBA,SAAgB,eACd,MACkB;CAClB,OAAOA,kBAAAA,WAAW,WAAc;EAC9B,MAAM,OAAOC,uBAAAA,YAAY,MAAM;EAC/B,OAAO,IAAIC,mCAAAA,iBAAuB,QAAQ;GACxC,OAAO,QAAQ,SAASC,
|
|
1
|
+
{"version":3,"file":"hasManyThrough.cjs","names":["lazyField","getMetadata","CustomCollection","loadLens","getLens","isLensLoaded","lensToLoadHint"],"sources":["../../src/relations/hasManyThrough.ts"],"sourcesContent":["import {\n type Collection,\n CustomCollection,\n type Entity,\n type Lens,\n getLens,\n getMetadata,\n isLensLoaded,\n lensToLoadHint,\n loadLens,\n} from \"../index.ts\";\nimport { lazyField } from \"../newEntity.ts\";\n\n/**\n * Creates a CustomCollection that will walk across references in the object graph.\n *\n * I.e. An Author \"has many reviews\" through the `author -> books -> reviews` relation.\n *\n * Because this is based on `CustomCollection`, it will work in populates, i.e. `em.populate(author, \"reviews\")`.\n */\nexport function hasManyThrough<T extends Entity, U extends Entity>(\n lens: (lens: Lens<T>) => Lens<U, U[]>,\n): Collection<T, U> {\n return lazyField((entity: T) => {\n const meta = getMetadata(entity);\n return new CustomCollection<T, U>(entity, {\n load: (entity, opts) => loadLens(entity, lens, opts),\n get: () => getLens(meta, entity, lens),\n isLoaded: () => isLensLoaded(entity, lens),\n loadHint: () => lensToLoadHint(lens),\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;AAoBA,SAAgB,eACd,MACkB;CAClB,OAAOA,kBAAAA,WAAW,WAAc;EAC9B,MAAM,OAAOC,uBAAAA,YAAY,MAAM;EAC/B,OAAO,IAAIC,mCAAAA,iBAAuB,QAAQ;GACxC,OAAO,QAAQ,SAASC,yBAAAA,SAAS,QAAQ,MAAM,IAAI;GACnD,WAAWC,yBAAAA,QAAQ,MAAM,QAAQ,IAAI;GACrC,gBAAgBC,yBAAAA,aAAa,QAAQ,IAAI;GACzC,gBAAgBC,yBAAAA,eAAe,IAAI;EACrC,CAAC;CACH,CAAC;AACH"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { lazyField } from "../newEntity.js";
|
|
2
1
|
import { CustomCollection } from "./CustomCollection.js";
|
|
2
|
+
import { lazyField } from "../newEntity.js";
|
|
3
3
|
import { getMetadata } from "../EntityMetadata.js";
|
|
4
|
-
import { getLens, isLensLoaded, lensToLoadHint, loadLens } from "../loadLens.js";
|
|
4
|
+
import { getLens, isLensLoaded, lensToLoadHint, loadLens } from "../loading/loadLens.js";
|
|
5
5
|
import "../index.js";
|
|
6
6
|
//#region src/relations/hasManyThrough.ts
|
|
7
7
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_relations_CustomReference = require("./CustomReference.cjs");
|
|
3
|
+
const require_loading_loadHints = require("../loading/loadHints.cjs");
|
|
2
4
|
require("./Reference.cjs");
|
|
3
|
-
const require_loadHints = require("../loadHints.cjs");
|
|
4
5
|
const require_newEntity = require("../newEntity.cjs");
|
|
5
|
-
const require_relations_CustomReference = require("./CustomReference.cjs");
|
|
6
6
|
require("../index.cjs");
|
|
7
7
|
require("../Entity.cjs");
|
|
8
8
|
//#region src/relations/hasOneDerived.ts
|
|
@@ -21,7 +21,7 @@ function hasOneDerived(loadHint, get) {
|
|
|
21
21
|
...opts
|
|
22
22
|
}),
|
|
23
23
|
get: () => get(entity),
|
|
24
|
-
isLoaded: () =>
|
|
24
|
+
isLoaded: () => require_loading_loadHints.isLoaded(entity, loadHint),
|
|
25
25
|
loadHint
|
|
26
26
|
});
|
|
27
27
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasOneDerived.cjs","names":["lazyField","CustomReference","isLoaded"],"sources":["../../src/relations/hasOneDerived.ts"],"sourcesContent":["import { isLoaded } from \"..//index.ts\";\nimport { type Entity } from \"../Entity.ts\";\nimport {
|
|
1
|
+
{"version":3,"file":"hasOneDerived.cjs","names":["lazyField","CustomReference","isLoaded"],"sources":["../../src/relations/hasOneDerived.ts"],"sourcesContent":["import { isLoaded } from \"..//index.ts\";\nimport { type Entity } from \"../Entity.ts\";\nimport type { LoadHint, Loaded } from \"../loading/loadHints.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { CustomReference } from \"./CustomReference.ts\";\nimport { type Reference } from \"./Reference.ts\";\n\n/**\n * Creates a CustomReference that can conditionally walk across references in the object graph.\n *\n * I.e. A BookReview \"has one author\" through the `review -> book -> author` relation.\n *\n * Because this is based on `CustomReference`, it will work in populates, i.e. `em.populate(review, \"author\")`.\n */\nexport function hasOneDerived<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n V extends U | N,\n const H extends LoadHint<T>,\n>(loadHint: H, get: (entity: Loaded<T, H>) => V): Reference<T, U, N> {\n return lazyField((entity: T) => {\n return new CustomReference<T, U, N>(entity, {\n load: (entity, opts) => entity.em.populate(entity, { hint: loadHint, ...opts }),\n get: () => get(entity as Loaded<T, H>),\n isLoaded: () => isLoaded(entity, loadHint as LoadHint<T>),\n loadHint,\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;AAcA,SAAgB,cAMd,UAAa,KAAsD;CACnE,OAAOA,kBAAAA,WAAW,WAAc;EAC9B,OAAO,IAAIC,kCAAAA,gBAAyB,QAAQ;GAC1C,OAAO,QAAQ,SAAS,OAAO,GAAG,SAAS,QAAQ;IAAE,MAAM;IAAU,GAAG;GAAK,CAAC;GAC9E,WAAW,IAAI,MAAsB;GACrC,gBAAgBC,0BAAAA,SAAS,QAAQ,QAAuB;GACxD;EACF,CAAC;CACH,CAAC;AACH"}
|