joist-core 2.4.0-next.4 → 2.4.0-next.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/BaseEntity.d.cts +3 -4
- package/build/BaseEntity.d.cts.map +1 -1
- package/build/BaseEntity.d.mts +3 -4
- package/build/BaseEntity.d.mts.map +1 -1
- package/build/Entity.d.cts +3 -4
- package/build/Entity.d.cts.map +1 -1
- package/build/Entity.d.mts +3 -4
- package/build/Entity.d.mts.map +1 -1
- package/build/EntityFields.d.cts +3 -4
- package/build/EntityFields.d.cts.map +1 -1
- package/build/EntityFields.d.mts +3 -4
- package/build/EntityFields.d.mts.map +1 -1
- package/build/EntityManager.cjs +64 -20
- package/build/EntityManager.cjs.map +1 -1
- package/build/EntityManager.d.cts +86 -53
- package/build/EntityManager.d.cts.map +1 -1
- package/build/EntityManager.d.mts +86 -53
- package/build/EntityManager.d.mts.map +1 -1
- package/build/EntityManager.js +64 -22
- package/build/EntityManager.js.map +1 -1
- package/build/EntityMetadata.cjs +0 -1
- package/build/EntityMetadata.cjs.map +1 -1
- package/build/EntityMetadata.d.cts +39 -36
- package/build/EntityMetadata.d.cts.map +1 -1
- package/build/EntityMetadata.d.mts +39 -36
- package/build/EntityMetadata.d.mts.map +1 -1
- package/build/EntityMetadata.js +0 -1
- package/build/EntityMetadata.js.map +1 -1
- package/build/EnumMetadata.d.cts +1 -2
- package/build/EnumMetadata.d.cts.map +1 -1
- package/build/EnumMetadata.d.mts +1 -2
- package/build/EnumMetadata.d.mts.map +1 -1
- package/build/IndexManager.cjs +23 -5
- package/build/IndexManager.cjs.map +1 -1
- package/build/IndexManager.d.cts +2 -3
- package/build/IndexManager.d.cts.map +1 -1
- package/build/IndexManager.d.mts +2 -3
- package/build/IndexManager.d.mts.map +1 -1
- package/build/IndexManager.js +23 -5
- package/build/IndexManager.js.map +1 -1
- package/build/InstanceData.cjs.map +1 -1
- package/build/InstanceData.d.cts +1 -2
- package/build/InstanceData.d.cts.map +1 -1
- package/build/InstanceData.d.mts +1 -2
- package/build/InstanceData.d.mts.map +1 -1
- package/build/InstanceData.js.map +1 -1
- package/build/PluginManager.cjs.map +1 -1
- package/build/PluginManager.d.cts +4 -4
- package/build/PluginManager.d.cts.map +1 -1
- package/build/PluginManager.d.mts +4 -4
- package/build/PluginManager.d.mts.map +1 -1
- package/build/PluginManager.js.map +1 -1
- package/build/RowData.d.cts +3 -4
- package/build/RowData.d.cts.map +1 -1
- package/build/RowData.d.mts +3 -4
- package/build/RowData.d.mts.map +1 -1
- package/build/batchloaders/BatchLoader.cjs.map +1 -1
- package/build/batchloaders/BatchLoader.d.cts +1 -2
- package/build/batchloaders/BatchLoader.d.cts.map +1 -1
- package/build/batchloaders/BatchLoader.d.mts +1 -2
- package/build/batchloaders/BatchLoader.d.mts.map +1 -1
- package/build/batchloaders/BatchLoader.js.map +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.cts +2 -3
- package/build/batchloaders/enumCollectionBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.mts +2 -3
- package/build/batchloaders/enumCollectionBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.cts +2 -3
- package/build/batchloaders/loadBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.mts +2 -3
- package/build/batchloaders/loadBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.d.cts +2 -3
- package/build/batchloaders/manyToManyBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.d.mts +2 -3
- package/build/batchloaders/manyToManyBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.d.cts +2 -3
- package/build/batchloaders/oneToManyBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.d.mts +2 -3
- package/build/batchloaders/oneToManyBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.d.cts +2 -3
- package/build/batchloaders/oneToOneBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.d.mts +2 -3
- package/build/batchloaders/oneToOneBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/populateBatchLoader.cjs +2 -2
- package/build/batchloaders/populateBatchLoader.d.cts +2 -3
- package/build/batchloaders/populateBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/populateBatchLoader.d.mts +2 -3
- package/build/batchloaders/populateBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/populateBatchLoader.js +2 -2
- package/build/batchloaders/recursiveChildrenBatchLoader.cjs +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.d.cts +2 -3
- package/build/batchloaders/recursiveChildrenBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.d.mts +2 -3
- package/build/batchloaders/recursiveChildrenBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.js +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.cjs +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.d.cts +2 -3
- package/build/batchloaders/recursiveM2mBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.d.mts +2 -3
- package/build/batchloaders/recursiveM2mBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.js +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.cjs +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.d.cts +2 -3
- package/build/batchloaders/recursiveParentsBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.d.mts +2 -3
- package/build/batchloaders/recursiveParentsBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.js +1 -1
- package/build/changes.cjs.map +1 -1
- package/build/changes.d.cts +9 -10
- package/build/changes.d.cts.map +1 -1
- package/build/changes.d.mts +9 -10
- package/build/changes.d.mts.map +1 -1
- package/build/changes.js.map +1 -1
- package/build/config.cjs +75 -1
- package/build/config.cjs.map +1 -1
- package/build/config.d.cts +99 -17
- package/build/config.d.cts.map +1 -1
- package/build/config.d.mts +99 -17
- package/build/config.d.mts.map +1 -1
- package/build/config.js +75 -1
- package/build/config.js.map +1 -1
- package/build/configure.cjs +6 -2
- package/build/configure.cjs.map +1 -1
- package/build/configure.d.cts +8 -9
- package/build/configure.d.cts.map +1 -1
- package/build/configure.d.mts +8 -9
- package/build/configure.d.mts.map +1 -1
- package/build/configure.js +6 -2
- package/build/configure.js.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.d.cts +1 -2
- package/build/dataloaders/fastWhereFilterHash.d.cts.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.d.mts +1 -2
- package/build/dataloaders/fastWhereFilterHash.d.mts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.cts +2 -3
- package/build/dataloaders/findByUniqueDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.mts +2 -3
- package/build/dataloaders/findByUniqueDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findCountDataLoader.d.cts +4 -5
- package/build/dataloaders/findCountDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findCountDataLoader.d.mts +4 -5
- package/build/dataloaders/findCountDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findDataLoader.cjs +1 -1
- package/build/dataloaders/findDataLoader.d.cts +11 -12
- package/build/dataloaders/findDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findDataLoader.d.mts +11 -12
- package/build/dataloaders/findDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findDataLoader.js +1 -1
- package/build/dataloaders/findIdsDataLoader.d.cts +2 -3
- package/build/dataloaders/findIdsDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findIdsDataLoader.d.mts +2 -3
- package/build/dataloaders/findIdsDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.cjs +6 -2
- package/build/dataloaders/findOrCreateDataLoader.cjs.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.d.cts +3 -3
- package/build/dataloaders/findOrCreateDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.d.mts +3 -3
- package/build/dataloaders/findOrCreateDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.js +7 -3
- package/build/dataloaders/findOrCreateDataLoader.js.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.cjs +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.cts +1 -2
- package/build/dataloaders/findPaginatedDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.mts +1 -2
- package/build/dataloaders/findPaginatedDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.js +1 -1
- package/build/dataloaders/lensDataLoader.d.cts +2 -3
- package/build/dataloaders/lensDataLoader.d.cts.map +1 -1
- package/build/dataloaders/lensDataLoader.d.mts +2 -3
- package/build/dataloaders/lensDataLoader.d.mts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.cts +2 -3
- package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.mts +2 -3
- package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.cts +2 -3
- package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.mts +2 -3
- package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
- package/build/defaults.cjs +2 -2
- package/build/defaults.cjs.map +1 -1
- package/build/defaults.d.cts +7 -7
- package/build/defaults.d.cts.map +1 -1
- package/build/defaults.d.mts +7 -7
- package/build/defaults.d.mts.map +1 -1
- package/build/defaults.js +2 -2
- package/build/defaults.js.map +1 -1
- package/build/drivers/Driver.d.cts +2 -3
- package/build/drivers/Driver.d.cts.map +1 -1
- package/build/drivers/Driver.d.mts +2 -3
- package/build/drivers/Driver.d.mts.map +1 -1
- package/build/drivers/EntityWriter.d.cts +7 -7
- package/build/drivers/EntityWriter.d.cts.map +1 -1
- package/build/drivers/EntityWriter.d.mts +7 -7
- package/build/drivers/EntityWriter.d.mts.map +1 -1
- package/build/drivers/IdAssigner.cjs.map +1 -1
- package/build/drivers/IdAssigner.d.cts +5 -5
- package/build/drivers/IdAssigner.d.cts.map +1 -1
- package/build/drivers/IdAssigner.d.mts +5 -5
- package/build/drivers/IdAssigner.d.mts.map +1 -1
- package/build/drivers/IdAssigner.js.map +1 -1
- package/build/drivers/driverApi.d.cts +2 -3
- package/build/drivers/driverApi.d.cts.map +1 -1
- package/build/drivers/driverApi.d.mts +2 -3
- package/build/drivers/driverApi.d.mts.map +1 -1
- package/build/fields.cjs +1 -0
- package/build/fields.cjs.map +1 -1
- package/build/fields.d.cts +6 -7
- package/build/fields.d.cts.map +1 -1
- package/build/fields.d.mts +6 -7
- package/build/fields.d.mts.map +1 -1
- package/build/fields.js +1 -0
- package/build/fields.js.map +1 -1
- package/build/flush/FlushLock.cjs.map +1 -1
- package/build/flush/FlushLock.d.cts +1 -2
- package/build/flush/FlushLock.d.cts.map +1 -1
- package/build/flush/FlushLock.d.mts +1 -2
- package/build/flush/FlushLock.d.mts.map +1 -1
- package/build/flush/FlushLock.js.map +1 -1
- package/build/flush/JoinRows.cjs.map +1 -1
- package/build/flush/JoinRows.d.cts +5 -6
- package/build/flush/JoinRows.d.cts.map +1 -1
- package/build/flush/JoinRows.d.mts +5 -6
- package/build/flush/JoinRows.d.mts.map +1 -1
- package/build/flush/JoinRows.js.map +1 -1
- package/build/flush/PendingChanges.d.cts +5 -6
- package/build/flush/PendingChanges.d.cts.map +1 -1
- package/build/flush/PendingChanges.d.mts +5 -6
- package/build/flush/PendingChanges.d.mts.map +1 -1
- package/build/flush/Todo.d.cts +5 -6
- package/build/flush/Todo.d.cts.map +1 -1
- package/build/flush/Todo.d.mts +5 -6
- package/build/flush/Todo.d.mts.map +1 -1
- package/build/getProperties.d.cts +3 -4
- package/build/getProperties.d.cts.map +1 -1
- package/build/getProperties.d.mts +3 -4
- package/build/getProperties.d.mts.map +1 -1
- package/build/index.cjs +14 -8
- package/build/index.cjs.map +1 -1
- package/build/index.d.cts +20 -19
- package/build/index.d.cts.map +1 -1
- package/build/index.d.mts +20 -19
- package/build/index.d.mts.map +1 -1
- package/build/index.js +14 -11
- package/build/index.js.map +1 -1
- package/build/json.cjs +3 -3
- package/build/json.d.cts +11 -11
- package/build/json.d.cts.map +1 -1
- package/build/json.d.mts +11 -11
- package/build/json.d.mts.map +1 -1
- package/build/json.js +3 -3
- package/build/keys.d.cts +27 -27
- package/build/keys.d.cts.map +1 -1
- package/build/keys.d.mts +27 -27
- package/build/keys.d.mts.map +1 -1
- package/build/loading/HintTree.d.cts +3 -4
- package/build/loading/HintTree.d.cts.map +1 -1
- package/build/loading/HintTree.d.mts +3 -4
- package/build/loading/HintTree.d.mts.map +1 -1
- package/build/loading/IsLoadedCache.cjs.map +1 -1
- package/build/loading/IsLoadedCache.d.cts +2 -3
- package/build/loading/IsLoadedCache.d.cts.map +1 -1
- package/build/loading/IsLoadedCache.d.mts +2 -3
- package/build/loading/IsLoadedCache.d.mts.map +1 -1
- package/build/loading/IsLoadedCache.js.map +1 -1
- package/build/loading/loadHints.cjs +1 -1
- package/build/loading/loadHints.d.cts +17 -17
- package/build/loading/loadHints.d.cts.map +1 -1
- package/build/loading/loadHints.d.mts +17 -17
- package/build/loading/loadHints.d.mts.map +1 -1
- package/build/loading/loadHints.js +1 -1
- package/build/loading/loadLens.d.cts +13 -13
- package/build/loading/loadLens.d.cts.map +1 -1
- package/build/loading/loadLens.d.mts +13 -13
- package/build/loading/loadLens.d.mts.map +1 -1
- package/build/loading/withLoaded.cjs +2 -2
- package/build/loading/withLoaded.d.cts +5 -6
- package/build/loading/withLoaded.d.cts.map +1 -1
- package/build/loading/withLoaded.d.mts +5 -6
- package/build/loading/withLoaded.d.mts.map +1 -1
- package/build/loading/withLoaded.js +2 -2
- package/build/logging/FactoryLogger.d.cts +3 -4
- package/build/logging/FactoryLogger.d.cts.map +1 -1
- package/build/logging/FactoryLogger.d.mts +3 -4
- package/build/logging/FactoryLogger.d.mts.map +1 -1
- package/build/logging/FieldLogger.cjs.map +1 -1
- package/build/logging/FieldLogger.d.cts +4 -5
- package/build/logging/FieldLogger.d.cts.map +1 -1
- package/build/logging/FieldLogger.d.mts +4 -5
- package/build/logging/FieldLogger.d.mts.map +1 -1
- package/build/logging/FieldLogger.js.map +1 -1
- package/build/logging/ReactionLogger.d.cts +7 -7
- package/build/logging/ReactionLogger.d.cts.map +1 -1
- package/build/logging/ReactionLogger.d.mts +7 -7
- package/build/logging/ReactionLogger.d.mts.map +1 -1
- package/build/newEntity.cjs.map +1 -1
- package/build/newEntity.d.cts +4 -5
- package/build/newEntity.d.cts.map +1 -1
- package/build/newEntity.d.mts +4 -5
- package/build/newEntity.d.mts.map +1 -1
- package/build/newEntity.js.map +1 -1
- package/build/newTestInstance.cjs +1 -0
- package/build/newTestInstance.cjs.map +1 -1
- package/build/newTestInstance.d.cts +21 -21
- package/build/newTestInstance.d.cts.map +1 -1
- package/build/newTestInstance.d.mts +21 -21
- package/build/newTestInstance.d.mts.map +1 -1
- package/build/newTestInstance.js +1 -0
- package/build/newTestInstance.js.map +1 -1
- package/build/normalizeHints.d.cts +7 -8
- package/build/normalizeHints.d.cts.map +1 -1
- package/build/normalizeHints.d.mts +7 -8
- package/build/normalizeHints.d.mts.map +1 -1
- package/build/nowUTC.d.cts +4 -5
- package/build/nowUTC.d.cts.map +1 -1
- package/build/nowUTC.d.mts +4 -5
- package/build/nowUTC.d.mts.map +1 -1
- package/build/plugins/ImmutableEntitiesPlugin.d.cts +1 -2
- package/build/plugins/ImmutableEntitiesPlugin.d.cts.map +1 -1
- package/build/plugins/ImmutableEntitiesPlugin.d.mts +1 -2
- package/build/plugins/ImmutableEntitiesPlugin.d.mts.map +1 -1
- package/build/plugins/PreloadPlugin.d.cts +3 -4
- package/build/plugins/PreloadPlugin.d.cts.map +1 -1
- package/build/plugins/PreloadPlugin.d.mts +3 -4
- package/build/plugins/PreloadPlugin.d.mts.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.cts +1 -2
- package/build/preloading/JsonAggregatePreloader.d.cts.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.mts +1 -2
- package/build/preloading/JsonAggregatePreloader.d.mts.map +1 -1
- package/build/preloading/canPreload.d.cts +1 -2
- package/build/preloading/canPreload.d.cts.map +1 -1
- package/build/preloading/canPreload.d.mts +1 -2
- package/build/preloading/canPreload.d.mts.map +1 -1
- package/build/preloading/partitionHint.cjs +1 -1
- package/build/preloading/partitionHint.d.cts +1 -2
- package/build/preloading/partitionHint.d.cts.map +1 -1
- package/build/preloading/partitionHint.d.mts +1 -2
- package/build/preloading/partitionHint.d.mts.map +1 -1
- package/build/preloading/partitionHint.js +1 -1
- package/build/queries/ConditionBuilder.d.cts +2 -2
- package/build/queries/ConditionBuilder.d.cts.map +1 -1
- package/build/queries/ConditionBuilder.d.mts +2 -2
- package/build/queries/ConditionBuilder.d.mts.map +1 -1
- package/build/queries/conditions.d.cts +11 -12
- package/build/queries/conditions.d.cts.map +1 -1
- package/build/queries/conditions.d.mts +11 -12
- package/build/queries/conditions.d.mts.map +1 -1
- package/build/queries/entityQueryUtils.d.cts +4 -5
- package/build/queries/entityQueryUtils.d.cts.map +1 -1
- package/build/queries/entityQueryUtils.d.mts +4 -5
- package/build/queries/entityQueryUtils.d.mts.map +1 -1
- package/build/queries/find/Aliases.d.cts +16 -16
- package/build/queries/find/Aliases.d.cts.map +1 -1
- package/build/queries/find/Aliases.d.mts +16 -16
- package/build/queries/find/Aliases.d.mts.map +1 -1
- package/build/queries/find/DeferredAlias.d.cts +5 -6
- package/build/queries/find/DeferredAlias.d.cts.map +1 -1
- package/build/queries/find/DeferredAlias.d.mts +5 -6
- package/build/queries/find/DeferredAlias.d.mts.map +1 -1
- package/build/queries/find/EntityFilter.d.cts +12 -13
- package/build/queries/find/EntityFilter.d.cts.map +1 -1
- package/build/queries/find/EntityFilter.d.mts +12 -13
- package/build/queries/find/EntityFilter.d.mts.map +1 -1
- package/build/queries/find/EntityGraphQLFilter.d.cts +8 -9
- package/build/queries/find/EntityGraphQLFilter.d.cts.map +1 -1
- package/build/queries/find/EntityGraphQLFilter.d.mts +8 -9
- package/build/queries/find/EntityGraphQLFilter.d.mts.map +1 -1
- package/build/queries/find/QueryParser.collectionJoins.d.cts +1 -2
- package/build/queries/find/QueryParser.collectionJoins.d.cts.map +1 -1
- package/build/queries/find/QueryParser.collectionJoins.d.mts +1 -2
- package/build/queries/find/QueryParser.collectionJoins.d.mts.map +1 -1
- package/build/queries/find/QueryParser.d.cts +18 -18
- package/build/queries/find/QueryParser.d.cts.map +1 -1
- package/build/queries/find/QueryParser.d.mts +18 -18
- package/build/queries/find/QueryParser.d.mts.map +1 -1
- package/build/queries/find/QueryParser.pruning.d.cts +2 -3
- package/build/queries/find/QueryParser.pruning.d.cts.map +1 -1
- package/build/queries/find/QueryParser.pruning.d.mts +2 -3
- package/build/queries/find/QueryParser.pruning.d.mts.map +1 -1
- package/build/queries/find/QueryVisitor.d.cts +4 -4
- package/build/queries/find/QueryVisitor.d.cts.map +1 -1
- package/build/queries/find/QueryVisitor.d.mts +4 -4
- package/build/queries/find/QueryVisitor.d.mts.map +1 -1
- package/build/queries/find/buildFindQuery.d.cts +3 -3
- package/build/queries/find/buildFindQuery.d.cts.map +1 -1
- package/build/queries/find/buildFindQuery.d.mts +3 -3
- package/build/queries/find/buildFindQuery.d.mts.map +1 -1
- package/build/queries/find/scopes.cjs.map +1 -1
- package/build/queries/find/scopes.d.cts +12 -13
- package/build/queries/find/scopes.d.cts.map +1 -1
- package/build/queries/find/scopes.d.mts +12 -13
- package/build/queries/find/scopes.d.mts.map +1 -1
- package/build/queries/find/scopes.js.map +1 -1
- package/build/queries/parsedConditions.d.cts +7 -8
- package/build/queries/parsedConditions.d.cts.map +1 -1
- package/build/queries/parsedConditions.d.mts +7 -8
- package/build/queries/parsedConditions.d.mts.map +1 -1
- package/build/queries/renderConditions.d.cts +3 -4
- package/build/queries/renderConditions.d.cts.map +1 -1
- package/build/queries/renderConditions.d.mts +3 -4
- package/build/queries/renderConditions.d.mts.map +1 -1
- package/build/queries/skipCondition.d.cts +1 -2
- package/build/queries/skipCondition.d.cts.map +1 -1
- package/build/queries/skipCondition.d.mts +1 -2
- package/build/queries/skipCondition.d.mts.map +1 -1
- package/build/queries/sql/AliasAssigner.cjs.map +1 -1
- package/build/queries/sql/AliasAssigner.d.cts +1 -2
- package/build/queries/sql/AliasAssigner.d.cts.map +1 -1
- package/build/queries/sql/AliasAssigner.d.mts +1 -2
- package/build/queries/sql/AliasAssigner.d.mts.map +1 -1
- package/build/queries/sql/AliasAssigner.js.map +1 -1
- package/build/queries/sql/Expr.cjs +38 -0
- package/build/queries/sql/Expr.cjs.map +1 -1
- package/build/queries/sql/Expr.d.cts +45 -27
- package/build/queries/sql/Expr.d.cts.map +1 -1
- package/build/queries/sql/Expr.d.mts +45 -27
- package/build/queries/sql/Expr.d.mts.map +1 -1
- package/build/queries/sql/Expr.js +38 -1
- package/build/queries/sql/Expr.js.map +1 -1
- package/build/queries/sql/JoinTree.d.cts +5 -5
- package/build/queries/sql/JoinTree.d.cts.map +1 -1
- package/build/queries/sql/JoinTree.d.mts +5 -5
- package/build/queries/sql/JoinTree.d.mts.map +1 -1
- package/build/queries/sql/Tables.cjs +9 -0
- package/build/queries/sql/Tables.cjs.map +1 -1
- package/build/queries/sql/Tables.d.cts +46 -39
- package/build/queries/sql/Tables.d.cts.map +1 -1
- package/build/queries/sql/Tables.d.mts +46 -39
- package/build/queries/sql/Tables.d.mts.map +1 -1
- package/build/queries/sql/Tables.js +10 -1
- package/build/queries/sql/Tables.js.map +1 -1
- package/build/queries/sql/custom.d.cts +14 -14
- package/build/queries/sql/custom.d.cts.map +1 -1
- package/build/queries/sql/custom.d.mts +14 -14
- package/build/queries/sql/custom.d.mts.map +1 -1
- package/build/queries/sql/execute.cjs +4 -9
- package/build/queries/sql/execute.cjs.map +1 -1
- package/build/queries/sql/execute.d.cts +45 -28
- package/build/queries/sql/execute.d.cts.map +1 -1
- package/build/queries/sql/execute.d.mts +45 -28
- package/build/queries/sql/execute.d.mts.map +1 -1
- package/build/queries/sql/execute.js +5 -10
- package/build/queries/sql/execute.js.map +1 -1
- package/build/queries/sql/expressions/arrayAgg.d.cts +5 -6
- package/build/queries/sql/expressions/arrayAgg.d.cts.map +1 -1
- package/build/queries/sql/expressions/arrayAgg.d.mts +5 -6
- package/build/queries/sql/expressions/arrayAgg.d.mts.map +1 -1
- package/build/queries/sql/expressions/case.d.cts +10 -10
- package/build/queries/sql/expressions/case.d.cts.map +1 -1
- package/build/queries/sql/expressions/case.d.mts +10 -10
- package/build/queries/sql/expressions/case.d.mts.map +1 -1
- package/build/queries/sql/expressions/coalesce.d.cts +5 -6
- package/build/queries/sql/expressions/coalesce.d.cts.map +1 -1
- package/build/queries/sql/expressions/coalesce.d.mts +5 -6
- package/build/queries/sql/expressions/coalesce.d.mts.map +1 -1
- package/build/queries/sql/expressions/codecs.d.cts +1 -2
- package/build/queries/sql/expressions/codecs.d.cts.map +1 -1
- package/build/queries/sql/expressions/codecs.d.mts +1 -2
- package/build/queries/sql/expressions/codecs.d.mts.map +1 -1
- package/build/queries/sql/expressions/expression.d.cts +6 -6
- package/build/queries/sql/expressions/expression.d.cts.map +1 -1
- package/build/queries/sql/expressions/expression.d.mts +6 -6
- package/build/queries/sql/expressions/expression.d.mts.map +1 -1
- package/build/queries/sql/expressions/greatest.d.cts +5 -6
- package/build/queries/sql/expressions/greatest.d.cts.map +1 -1
- package/build/queries/sql/expressions/greatest.d.mts +5 -6
- package/build/queries/sql/expressions/greatest.d.mts.map +1 -1
- package/build/queries/sql/expressions/least.d.cts +5 -6
- package/build/queries/sql/expressions/least.d.cts.map +1 -1
- package/build/queries/sql/expressions/least.d.mts +5 -6
- package/build/queries/sql/expressions/least.d.mts.map +1 -1
- package/build/queries/sql/expressions/nullIf.d.cts +5 -6
- package/build/queries/sql/expressions/nullIf.d.cts.map +1 -1
- package/build/queries/sql/expressions/nullIf.d.mts +5 -6
- package/build/queries/sql/expressions/nullIf.d.mts.map +1 -1
- package/build/queries/sql/expressions/parseExpression.d.cts +5 -6
- package/build/queries/sql/expressions/parseExpression.d.cts.map +1 -1
- package/build/queries/sql/expressions/parseExpression.d.mts +5 -6
- package/build/queries/sql/expressions/parseExpression.d.mts.map +1 -1
- package/build/queries/sql/expressions/types.d.cts +11 -11
- package/build/queries/sql/expressions/types.d.cts.map +1 -1
- package/build/queries/sql/expressions/types.d.mts +11 -11
- package/build/queries/sql/expressions/types.d.mts.map +1 -1
- package/build/queries/sql/keywords.d.cts +4 -5
- package/build/queries/sql/keywords.d.cts.map +1 -1
- package/build/queries/sql/keywords.d.mts +4 -5
- package/build/queries/sql/keywords.d.mts.map +1 -1
- package/build/queries/sql/query.cjs +59 -23
- package/build/queries/sql/query.cjs.map +1 -1
- package/build/queries/sql/query.d.cts +108 -77
- package/build/queries/sql/query.d.cts.map +1 -1
- package/build/queries/sql/query.d.mts +108 -77
- package/build/queries/sql/query.d.mts.map +1 -1
- package/build/queries/sql/query.js +58 -23
- package/build/queries/sql/query.js.map +1 -1
- package/build/queries/unnest.d.cts +2 -3
- package/build/queries/unnest.d.cts.map +1 -1
- package/build/queries/unnest.d.mts +2 -3
- package/build/queries/unnest.d.mts.map +1 -1
- package/build/queries/valueFilters.d.cts +5 -6
- package/build/queries/valueFilters.d.cts.map +1 -1
- package/build/queries/valueFilters.d.mts +5 -6
- package/build/queries/valueFilters.d.mts.map +1 -1
- package/build/reactivity/ReactionsManager.cjs +168 -2
- package/build/reactivity/ReactionsManager.cjs.map +1 -1
- package/build/reactivity/ReactionsManager.d.cts +56 -4
- package/build/reactivity/ReactionsManager.d.cts.map +1 -1
- package/build/reactivity/ReactionsManager.d.mts +56 -4
- package/build/reactivity/ReactionsManager.d.mts.map +1 -1
- package/build/reactivity/ReactionsManager.js +169 -3
- package/build/reactivity/ReactionsManager.js.map +1 -1
- package/build/reactivity/reactiveHints.cjs +3 -3
- package/build/reactivity/reactiveHints.cjs.map +1 -1
- package/build/reactivity/reactiveHints.d.cts +18 -18
- package/build/reactivity/reactiveHints.d.cts.map +1 -1
- package/build/reactivity/reactiveHints.d.mts +18 -18
- package/build/reactivity/reactiveHints.d.mts.map +1 -1
- package/build/reactivity/reactiveHints.js +3 -3
- package/build/reactivity/reactiveHints.js.map +1 -1
- package/build/relations/AbstractPropertyImpl.cjs.map +1 -1
- package/build/relations/AbstractPropertyImpl.d.cts +1 -2
- package/build/relations/AbstractPropertyImpl.d.cts.map +1 -1
- package/build/relations/AbstractPropertyImpl.d.mts +1 -2
- package/build/relations/AbstractPropertyImpl.d.mts.map +1 -1
- package/build/relations/AbstractPropertyImpl.js.map +1 -1
- package/build/relations/AbstractRelationImpl.d.cts +1 -2
- package/build/relations/AbstractRelationImpl.d.cts.map +1 -1
- package/build/relations/AbstractRelationImpl.d.mts +1 -2
- package/build/relations/AbstractRelationImpl.d.mts.map +1 -1
- package/build/relations/AsyncProperty.cjs.map +1 -1
- package/build/relations/AsyncProperty.d.cts +5 -6
- package/build/relations/AsyncProperty.d.cts.map +1 -1
- package/build/relations/AsyncProperty.d.mts +5 -6
- package/build/relations/AsyncProperty.d.mts.map +1 -1
- package/build/relations/AsyncProperty.js.map +1 -1
- package/build/relations/AsyncReactiveField.cjs +3 -3
- package/build/relations/AsyncReactiveField.cjs.map +1 -1
- package/build/relations/AsyncReactiveField.d.cts +4 -5
- package/build/relations/AsyncReactiveField.d.cts.map +1 -1
- package/build/relations/AsyncReactiveField.d.mts +4 -5
- package/build/relations/AsyncReactiveField.d.mts.map +1 -1
- package/build/relations/AsyncReactiveField.js +3 -3
- package/build/relations/AsyncReactiveField.js.map +1 -1
- package/build/relations/Collection.d.cts +4 -5
- package/build/relations/Collection.d.cts.map +1 -1
- package/build/relations/Collection.d.mts +4 -5
- package/build/relations/Collection.d.mts.map +1 -1
- package/build/relations/CustomCollection.cjs.map +1 -1
- package/build/relations/CustomCollection.d.cts +3 -4
- package/build/relations/CustomCollection.d.cts.map +1 -1
- package/build/relations/CustomCollection.d.mts +3 -4
- package/build/relations/CustomCollection.d.mts.map +1 -1
- package/build/relations/CustomCollection.js.map +1 -1
- package/build/relations/CustomReference.cjs.map +1 -1
- package/build/relations/CustomReference.d.cts +3 -4
- package/build/relations/CustomReference.d.cts.map +1 -1
- package/build/relations/CustomReference.d.mts +3 -4
- package/build/relations/CustomReference.d.mts.map +1 -1
- package/build/relations/CustomReference.js.map +1 -1
- package/build/relations/EnumCollection.cjs.map +1 -1
- package/build/relations/EnumCollection.d.cts +5 -5
- package/build/relations/EnumCollection.d.cts.map +1 -1
- package/build/relations/EnumCollection.d.mts +5 -5
- package/build/relations/EnumCollection.d.mts.map +1 -1
- package/build/relations/EnumCollection.js.map +1 -1
- package/build/relations/LargeCollection.d.cts +1 -2
- package/build/relations/LargeCollection.d.cts.map +1 -1
- package/build/relations/LargeCollection.d.mts +1 -2
- package/build/relations/LargeCollection.d.mts.map +1 -1
- package/build/relations/LazyField.cjs +14 -0
- package/build/relations/LazyField.cjs.map +1 -1
- package/build/relations/LazyField.d.cts +13 -8
- package/build/relations/LazyField.d.cts.map +1 -1
- package/build/relations/LazyField.d.mts +13 -8
- package/build/relations/LazyField.d.mts.map +1 -1
- package/build/relations/LazyField.js +14 -0
- package/build/relations/LazyField.js.map +1 -1
- package/build/relations/ManyToManyCollection.cjs.map +1 -1
- package/build/relations/ManyToManyCollection.d.cts +2 -3
- package/build/relations/ManyToManyCollection.d.cts.map +1 -1
- package/build/relations/ManyToManyCollection.d.mts +2 -3
- package/build/relations/ManyToManyCollection.d.mts.map +1 -1
- package/build/relations/ManyToManyCollection.js.map +1 -1
- package/build/relations/ManyToManyLargeCollection.d.cts +2 -3
- package/build/relations/ManyToManyLargeCollection.d.cts.map +1 -1
- package/build/relations/ManyToManyLargeCollection.d.mts +2 -3
- package/build/relations/ManyToManyLargeCollection.d.mts.map +1 -1
- package/build/relations/ManyToOneReference.cjs.map +1 -1
- package/build/relations/ManyToOneReference.d.cts +6 -7
- package/build/relations/ManyToOneReference.d.cts.map +1 -1
- package/build/relations/ManyToOneReference.d.mts +6 -7
- package/build/relations/ManyToOneReference.d.mts.map +1 -1
- package/build/relations/ManyToOneReference.js.map +1 -1
- package/build/relations/OneToManyCollection.cjs.map +1 -1
- package/build/relations/OneToManyCollection.d.cts +2 -3
- package/build/relations/OneToManyCollection.d.cts.map +1 -1
- package/build/relations/OneToManyCollection.d.mts +2 -3
- package/build/relations/OneToManyCollection.d.mts.map +1 -1
- package/build/relations/OneToManyCollection.js.map +1 -1
- package/build/relations/OneToManyLargeCollection.cjs.map +1 -1
- package/build/relations/OneToManyLargeCollection.d.cts +2 -3
- package/build/relations/OneToManyLargeCollection.d.cts.map +1 -1
- package/build/relations/OneToManyLargeCollection.d.mts +2 -3
- package/build/relations/OneToManyLargeCollection.d.mts.map +1 -1
- package/build/relations/OneToManyLargeCollection.js.map +1 -1
- package/build/relations/OneToOneReference.cjs.map +1 -1
- package/build/relations/OneToOneReference.d.cts +7 -7
- package/build/relations/OneToOneReference.d.cts.map +1 -1
- package/build/relations/OneToOneReference.d.mts +7 -7
- package/build/relations/OneToOneReference.d.mts.map +1 -1
- package/build/relations/OneToOneReference.js.map +1 -1
- package/build/relations/PolymorphicReference.cjs.map +1 -1
- package/build/relations/PolymorphicReference.d.cts +4 -5
- package/build/relations/PolymorphicReference.d.cts.map +1 -1
- package/build/relations/PolymorphicReference.d.mts +4 -5
- package/build/relations/PolymorphicReference.d.mts.map +1 -1
- package/build/relations/PolymorphicReference.js.map +1 -1
- package/build/relations/PropertySymbols.d.cts +1 -2
- package/build/relations/PropertySymbols.d.cts.map +1 -1
- package/build/relations/PropertySymbols.d.mts +1 -2
- package/build/relations/PropertySymbols.d.mts.map +1 -1
- package/build/relations/ReactiveField.cjs +2 -2
- package/build/relations/ReactiveField.cjs.map +1 -1
- package/build/relations/ReactiveField.d.cts +4 -5
- package/build/relations/ReactiveField.d.cts.map +1 -1
- package/build/relations/ReactiveField.d.mts +4 -5
- package/build/relations/ReactiveField.d.mts.map +1 -1
- package/build/relations/ReactiveField.js +2 -2
- package/build/relations/ReactiveField.js.map +1 -1
- package/build/relations/ReactiveGetter.cjs.map +1 -1
- package/build/relations/ReactiveGetter.d.cts +4 -5
- package/build/relations/ReactiveGetter.d.cts.map +1 -1
- package/build/relations/ReactiveGetter.d.mts +4 -5
- package/build/relations/ReactiveGetter.d.mts.map +1 -1
- package/build/relations/ReactiveGetter.js.map +1 -1
- package/build/relations/ReactiveManyToMany.cjs +1 -1
- package/build/relations/ReactiveManyToMany.cjs.map +1 -1
- package/build/relations/ReactiveManyToMany.d.cts +4 -5
- package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
- package/build/relations/ReactiveManyToMany.d.mts +4 -5
- package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
- package/build/relations/ReactiveManyToMany.js +1 -1
- package/build/relations/ReactiveManyToMany.js.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.cjs.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.d.cts +4 -5
- package/build/relations/ReactiveManyToManyOtherSide.d.cts.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.d.mts +4 -5
- package/build/relations/ReactiveManyToManyOtherSide.d.mts.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.js.map +1 -1
- package/build/relations/ReactiveReference.cjs +1 -1
- package/build/relations/ReactiveReference.cjs.map +1 -1
- package/build/relations/ReactiveReference.d.cts +5 -6
- package/build/relations/ReactiveReference.d.cts.map +1 -1
- package/build/relations/ReactiveReference.d.mts +5 -6
- package/build/relations/ReactiveReference.d.mts.map +1 -1
- package/build/relations/ReactiveReference.js +1 -1
- package/build/relations/ReactiveReference.js.map +1 -1
- package/build/relations/ReadOnlyCollection.d.cts +4 -5
- package/build/relations/ReadOnlyCollection.d.cts.map +1 -1
- package/build/relations/ReadOnlyCollection.d.mts +4 -5
- package/build/relations/ReadOnlyCollection.d.mts.map +1 -1
- package/build/relations/RecursiveCollection.cjs +3 -3
- package/build/relations/RecursiveCollection.cjs.map +1 -1
- package/build/relations/RecursiveCollection.d.cts +10 -10
- package/build/relations/RecursiveCollection.d.cts.map +1 -1
- package/build/relations/RecursiveCollection.d.mts +10 -10
- package/build/relations/RecursiveCollection.d.mts.map +1 -1
- package/build/relations/RecursiveCollection.js +3 -3
- package/build/relations/RecursiveCollection.js.map +1 -1
- package/build/relations/RecursiveCycleError.d.cts +2 -2
- package/build/relations/RecursiveCycleError.d.cts.map +1 -1
- package/build/relations/RecursiveCycleError.d.mts +2 -2
- package/build/relations/RecursiveCycleError.d.mts.map +1 -1
- package/build/relations/Reference.d.cts +5 -5
- package/build/relations/Reference.d.cts.map +1 -1
- package/build/relations/Reference.d.mts +5 -5
- package/build/relations/Reference.d.mts.map +1 -1
- package/build/relations/ReferenceSymbols.d.cts +1 -2
- package/build/relations/ReferenceSymbols.d.cts.map +1 -1
- package/build/relations/ReferenceSymbols.d.mts +1 -2
- package/build/relations/ReferenceSymbols.d.mts.map +1 -1
- package/build/relations/Relation.d.cts +3 -3
- package/build/relations/Relation.d.cts.map +1 -1
- package/build/relations/Relation.d.mts +3 -3
- package/build/relations/Relation.d.mts.map +1 -1
- package/build/relations/RelationSymbols.d.cts +2 -3
- package/build/relations/RelationSymbols.d.cts.map +1 -1
- package/build/relations/RelationSymbols.d.mts +2 -3
- package/build/relations/RelationSymbols.d.mts.map +1 -1
- package/build/relations/hasAsyncMethod.cjs.map +1 -1
- package/build/relations/hasAsyncMethod.d.cts +6 -6
- package/build/relations/hasAsyncMethod.d.cts.map +1 -1
- package/build/relations/hasAsyncMethod.d.mts +6 -6
- package/build/relations/hasAsyncMethod.d.mts.map +1 -1
- package/build/relations/hasAsyncMethod.js.map +1 -1
- package/build/relations/hasManyDerived.d.cts +2 -2
- package/build/relations/hasManyDerived.d.cts.map +1 -1
- package/build/relations/hasManyDerived.d.mts +2 -2
- package/build/relations/hasManyDerived.d.mts.map +1 -1
- package/build/relations/hasManyThrough.d.cts +1 -2
- package/build/relations/hasManyThrough.d.cts.map +1 -1
- package/build/relations/hasManyThrough.d.mts +1 -2
- package/build/relations/hasManyThrough.d.mts.map +1 -1
- package/build/relations/hasOneDerived.d.cts +1 -2
- package/build/relations/hasOneDerived.d.cts.map +1 -1
- package/build/relations/hasOneDerived.d.mts +1 -2
- package/build/relations/hasOneDerived.d.mts.map +1 -1
- package/build/relations/hasOneThrough.d.cts +1 -2
- package/build/relations/hasOneThrough.d.cts.map +1 -1
- package/build/relations/hasOneThrough.d.mts +1 -2
- package/build/relations/hasOneThrough.d.mts.map +1 -1
- package/build/relations/hasProperty.cjs +2 -2
- package/build/relations/hasProperty.cjs.map +1 -1
- package/build/relations/hasProperty.d.cts +8 -8
- package/build/relations/hasProperty.d.cts.map +1 -1
- package/build/relations/hasProperty.d.mts +8 -8
- package/build/relations/hasProperty.d.mts.map +1 -1
- package/build/relations/hasProperty.js +2 -2
- package/build/relations/hasProperty.js.map +1 -1
- package/build/relations/index.cjs +5 -5
- package/build/relations/index.js +5 -5
- package/build/relations/isCascadeDelete.d.cts +1 -2
- package/build/relations/isCascadeDelete.d.cts.map +1 -1
- package/build/relations/isCascadeDelete.d.mts +1 -2
- package/build/relations/isCascadeDelete.d.mts.map +1 -1
- package/build/resurrection.cjs +11 -1
- package/build/resurrection.cjs.map +1 -1
- package/build/resurrection.d.cts +5 -3
- package/build/resurrection.d.cts.map +1 -1
- package/build/resurrection.d.mts +5 -3
- package/build/resurrection.d.mts.map +1 -1
- package/build/resurrection.js +11 -2
- package/build/resurrection.js.map +1 -1
- package/build/rules.d.cts +20 -20
- package/build/rules.d.cts.map +1 -1
- package/build/rules.d.mts +20 -20
- package/build/rules.d.mts.map +1 -1
- package/build/runtimeConfig.d.cts +4 -5
- package/build/runtimeConfig.d.cts.map +1 -1
- package/build/runtimeConfig.d.mts +4 -5
- package/build/runtimeConfig.d.mts.map +1 -1
- package/build/serde/TypeInfo.d.cts +3 -4
- package/build/serde/TypeInfo.d.cts.map +1 -1
- package/build/serde/TypeInfo.d.mts +3 -4
- package/build/serde/TypeInfo.d.mts.map +1 -1
- package/build/serde/columns.d.cts +2 -3
- package/build/serde/columns.d.cts.map +1 -1
- package/build/serde/columns.d.mts +2 -3
- package/build/serde/columns.d.mts.map +1 -1
- package/build/serde/fieldSerde.d.cts +9 -9
- package/build/serde/fieldSerde.d.cts.map +1 -1
- package/build/serde/fieldSerde.d.mts +9 -9
- package/build/serde/fieldSerde.d.mts.map +1 -1
- package/build/serde/serde.cjs +35 -0
- package/build/serde/serde.cjs.map +1 -1
- package/build/serde/serde.d.cts +37 -19
- package/build/serde/serde.d.cts.map +1 -1
- package/build/serde/serde.d.mts +37 -19
- package/build/serde/serde.d.mts.map +1 -1
- package/build/serde/serde.js +35 -1
- package/build/serde/serde.js.map +1 -1
- package/build/serde/temporal.d.cts +5 -5
- package/build/serde/temporal.d.cts.map +1 -1
- package/build/serde/temporal.d.mts +5 -5
- package/build/serde/temporal.d.mts.map +1 -1
- package/build/serde/temporalMappers.d.cts +4 -5
- package/build/serde/temporalMappers.d.cts.map +1 -1
- package/build/serde/temporalMappers.d.mts +4 -5
- package/build/serde/temporalMappers.d.mts.map +1 -1
- package/build/transitions.cjs +89 -0
- package/build/transitions.cjs.map +1 -0
- package/build/transitions.d.cts +109 -0
- package/build/transitions.d.cts.map +1 -0
- package/build/transitions.d.mts +109 -0
- package/build/transitions.d.mts.map +1 -0
- package/build/transitions.js +84 -0
- package/build/transitions.js.map +1 -0
- package/build/trusted.d.cts +2 -3
- package/build/trusted.d.cts.map +1 -1
- package/build/trusted.d.mts +2 -3
- package/build/trusted.d.mts.map +1 -1
- package/build/typeMap.d.cts +17 -17
- package/build/typeMap.d.cts.map +1 -1
- package/build/typeMap.d.mts +17 -17
- package/build/typeMap.d.mts.map +1 -1
- package/build/upsert.d.cts +4 -4
- package/build/upsert.d.cts.map +1 -1
- package/build/upsert.d.mts +4 -4
- package/build/upsert.d.mts.map +1 -1
- package/build/utils.d.cts +27 -28
- package/build/utils.d.cts.map +1 -1
- package/build/utils.d.mts +27 -28
- package/build/utils.d.mts.map +1 -1
- package/package.json +6 -6
|
@@ -14,7 +14,7 @@ declare const enumCollectionTag: unique symbol;
|
|
|
14
14
|
* To the user it looks like an array of enum codes (e.g. `Color[]`), but unlike an enum-array
|
|
15
15
|
* column it is lazy and so needs a load hint, like any other relation.
|
|
16
16
|
*/
|
|
17
|
-
interface EnumCollection<T extends Entity, E> {
|
|
17
|
+
export interface EnumCollection<T extends Entity, E> {
|
|
18
18
|
[enumCollectionTag]: true;
|
|
19
19
|
[RelationT]: T;
|
|
20
20
|
[RelationU]: E;
|
|
@@ -35,13 +35,13 @@ interface EnumCollection<T extends Entity, E> {
|
|
|
35
35
|
readonly hasBeenSet: boolean;
|
|
36
36
|
}
|
|
37
37
|
/** Adds a known-safe `get` accessor. */
|
|
38
|
-
interface LoadedEnumCollection<T extends Entity, E> extends EnumCollection<T, E> {
|
|
38
|
+
export interface LoadedEnumCollection<T extends Entity, E> extends EnumCollection<T, E> {
|
|
39
39
|
get: ReadonlyArray<E>;
|
|
40
40
|
removeAll(): void;
|
|
41
41
|
}
|
|
42
42
|
/** An alias for creating `EnumCollection`s. */
|
|
43
|
-
declare function hasEnumCollection<T extends Entity, E>(): EnumCollection<T, E>;
|
|
44
|
-
declare class EnumCollectionImpl<T extends Entity, E> extends AbstractRelationImpl<T, E[]> implements EnumCollection<T, E>, LoadedEnumCollection<T, E>, ManyToManyLike {
|
|
43
|
+
export declare function hasEnumCollection<T extends Entity, E>(): EnumCollection<T, E>;
|
|
44
|
+
export declare class EnumCollectionImpl<T extends Entity, E> extends AbstractRelationImpl<T, E[]> implements EnumCollection<T, E>, LoadedEnumCollection<T, E>, ManyToManyLike {
|
|
45
45
|
#private;
|
|
46
46
|
constructor(entity: T, field: ManyToManyEnumField);
|
|
47
47
|
load(opts?: {
|
|
@@ -82,5 +82,5 @@ declare class EnumCollectionImpl<T extends Entity, E> extends AbstractRelationIm
|
|
|
82
82
|
[RelationU]: E;
|
|
83
83
|
}
|
|
84
84
|
//#endregion
|
|
85
|
-
export {
|
|
85
|
+
export {};
|
|
86
86
|
//# sourceMappingURL=EnumCollection.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnumCollection.d.mts","names":[],"sources":["../../src/relations/EnumCollection.ts"],"mappings":";;;;;;;;;cAoBc;;;;;;;
|
|
1
|
+
{"version":3,"file":"EnumCollection.d.mts","names":[],"sources":["../../src/relations/EnumCollection.ts"],"mappings":";;;;;;;;;cAoBc;;;;;;;iBAQG,eAAe,UAAU,QAAQ;GAC/C;GACA,YAAY;GACZ,YAAY;EAEb,KAAK;IAAS;MAA0B,QAAQ,cAAc;EAE9D,IAAI,MAAM;EAEV,OAAO,MAAM;;;;;;EAOb,IAAI,gBAAgB;EAEpB,SAAS,MAAM,IAAI;WAEV;WACA,QAAQ;WACR;;;iBAIM,qBAAqB,UAAU,QAAQ,WAAW,eAAe,GAAG;EACnF,KAAK,cAAc;EAEnB;;;wBAIc,kBAAkB,UAAU,QAAQ,MAAM,eAAe,GAAG;qBAO/D,mBAAmB,UAAU,QAAQ,WACxC,qBAAqB,GAAG,gBACrB,eAAe,GAAG,IAAI,qBAAqB,GAAG,IAAI;;EAS7D,YAAY,QAAQ,GAAG,OAAO;EAMxB,KAAK;IAAQ;MAA+B,QAAQ,cAAc;EA0BxE,IAAI,MAAM;EAUV,OAAO,MAAM;EASb,IAAI,gBAAgB;EAWd,SAAS,MAAM,IAAI;EASzB;MAMI,OAAO;MAQP;MAIA;EAIJ;EAIA,YAAY,OAAO;;;;;;;EAWnB,OAAO,OAAO,mBAAmB,GAAG;EAQpC;EAIM,0BAA0B;MAK5B;MAIA;EAIJ;MAiCI;MAIA;MAIA;MAIA,QAAQ;MAIR,aAAa;MAIb;MAIA;MAIA;GAIK;GACR,YAAY;GACZ,YAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnumCollection.js","names":["#field","#loaded","#getPreloaded","#loadPromise","#pendingSet","#applySet","#joinRows","#idOf","#hasBeenSet","#codesFor"],"sources":["../../src/relations/EnumCollection.ts"],"sourcesContent":["import { enumCollectionBatchLoader } from \"src/batchloaders/enumCollectionBatchLoader.ts\";\nimport { type EnumMetadata } from \"src/EnumMetadata.ts\";\nimport {\n type Entity,\n type EntityMetadata,\n type ManyToManyEnumField,\n type ManyToManyLike,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { remove } from \"src/utils.ts\";\n\n/** A nominal brand so `EnumCollection` is not structurally confused with a regular `Collection`. */\ndeclare const enumCollectionTag: unique symbol;\n\n/**\n * A collection of enum codes `E` within `T`, backed by a m2m join table to an enum \"table\".\n *\n * To the user it looks like an array of enum codes (e.g. `Color[]`), but unlike an enum-array\n * column it is lazy and so needs a load hint, like any other relation.\n */\nexport interface EnumCollection<T extends Entity, E> {\n [enumCollectionTag]: true;\n [RelationT]: T;\n [RelationU]: E;\n\n load(opts?: { forceReload?: boolean }): Promise<ReadonlyArray<E>>;\n\n add(code: E): void;\n\n remove(code: E): void;\n\n /**\n * Sets the collection to `codes`.\n *\n * Can be called on unloaded collections - the diff will be resolved at load or flush time.\n */\n set(codes: readonly E[]): void;\n\n includes(code: E): Promise<boolean>;\n\n readonly isLoaded: boolean;\n readonly entity: Entity;\n readonly hasBeenSet: boolean;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedEnumCollection<T extends Entity, E> extends EnumCollection<T, E> {\n get: ReadonlyArray<E>;\n\n removeAll(): void;\n}\n\n/** An alias for creating `EnumCollection`s. */\nexport function hasEnumCollection<T extends Entity, E>(): EnumCollection<T, E> {\n return lazyField((entity: T, fieldName) => {\n const field = getMetadata(entity).allFields[fieldName] as ManyToManyEnumField;\n return new EnumCollectionImpl<T, E>(entity, field);\n });\n}\n\nexport class EnumCollectionImpl<T extends Entity, E>\n extends AbstractRelationImpl<T, E[]>\n implements EnumCollection<T, E>, LoadedEnumCollection<T, E>, ManyToManyLike\n{\n readonly #field: ManyToManyEnumField;\n #loaded: boolean;\n #loadPromise: any;\n #hasBeenSet = false;\n /** Holds a pending `set()` when called on an unloaded collection, resolved at load. */\n #pendingSet: E[] | undefined;\n\n constructor(entity: T, field: ManyToManyEnumField) {\n super(entity);\n this.#field = field;\n this.#loaded = getInstanceData(entity).isOrWasNew;\n }\n\n async load(opts: { forceReload?: boolean } = {}): Promise<ReadonlyArray<E>> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#loaded || (opts.forceReload && !this.entity.isNewEntity)) {\n if (this.#getPreloaded() !== undefined) {\n this.#loaded = true;\n } else {\n await (this.#loadPromise ??= enumCollectionBatchLoader(this.entity.em, this).load(this.entity.idTagged!))\n .then(() => {\n this.#loaded = true;\n })\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n if (this.#pendingSet) {\n const pending = this.#pendingSet;\n this.#pendingSet = undefined;\n this.#applySet(pending);\n }\n }\n return this.get;\n }\n\n add(code: E): void {\n ensureNotDeleted(this.entity);\n if (this.#pendingSet) {\n if (!this.#pendingSet.includes(code)) this.#pendingSet.push(code);\n return;\n }\n if (this.#loaded && this.get.includes(code)) return;\n this.#joinRows.addNew(this, this.entity, this.#idOf(code));\n }\n\n remove(code: E): void {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#pendingSet) {\n remove(this.#pendingSet, code);\n return;\n }\n this.#joinRows.addRemove(this, this.entity, this.#idOf(code));\n }\n\n set(codes: readonly E[]): void {\n ensureNotDeleted(this.entity);\n this.#hasBeenSet = true;\n if (!this.#loaded) {\n this.#pendingSet = [...codes];\n getEmInternalApi(this.entity.em).pendingLoads.add(this as any);\n return;\n }\n this.#applySet(codes);\n }\n\n async includes(code: E): Promise<boolean> {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#pendingSet) return this.#pendingSet.includes(code);\n if (this.#loaded) return this.get.includes(code);\n if (this.entity.isNewEntity) return false;\n await this.load();\n return this.get.includes(code);\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#loaded) throw new Error(\"removeAll was called when not loaded\");\n for (const code of [...this.get]) this.remove(code);\n }\n\n get get(): E[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#loaded) {\n throw new Error(`${this.entity}.${this.fieldName}.get was called when not loaded`);\n }\n return this.#codesFor(this.entity);\n }\n\n get isLoaded(): boolean {\n return this.#loaded;\n }\n\n get isPreloaded(): boolean {\n return this.#getPreloaded() !== undefined;\n }\n\n preload(): void {\n if (this.#getPreloaded() !== undefined) this.#loaded = true;\n }\n\n setFromOpts(codes: E[]): void {\n this.#loaded = true;\n for (const code of codes ?? []) this.add(code);\n }\n\n /**\n * Mirrors `other`'s codes into us for `em.fork`/`importEntity`.\n *\n * Enum codes have no entity identity to remap, and we copy them as already-persisted rows (not\n * pending adds) so the receiving em doesn't think it has spurious inserts to flush.\n */\n import(other: EnumCollectionImpl<T, E>): void {\n if (!other.isLoaded) return;\n this.#loaded = true;\n for (const code of other.get) {\n this.#joinRows.addPreloadedRow(this, undefined, this.entity, this.#idOf(code));\n }\n }\n\n maybeCascadeDelete(): void {\n // The join table FK cascades on the db side, so there's nothing to cascade in memory.\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // The db cascade-deletes our join rows, so just drop any pending in-memory changes for us.\n this.#joinRows.removeAllFor(this.columnName, this.entity);\n }\n\n get fieldName(): string {\n return this.#field.fieldName;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `EnumCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, enum: ${this.#field.enumDetailType.name})`;\n }\n\n #applySet(codes: readonly E[]): void {\n const current = this.get;\n for (const code of current) if (!codes.includes(code)) this.remove(code);\n for (const code of codes) if (!current.includes(code)) this.add(code);\n }\n\n /** The current (non-deleted) codes for `entity`, sorted by enum id for a stable order. */\n #codesFor(entity: Entity): E[] {\n return (this.#joinRows.getOthers(this.columnName, entity) as number[])\n .sort((a, b) => a - b)\n .map((id) => this.#field.enumDetailType.findById(id)!.code as E);\n }\n\n #idOf(code: E): number {\n return this.#field.enumDetailType.getByCode(code).id;\n }\n\n #getPreloaded(): E[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<E>(this.entity.idTagged, this.fieldName);\n }\n\n get #joinRows() {\n return getEmInternalApi(this.entity.em).joinRows(this);\n }\n\n // The `ManyToManyLike` surface, so JoinRows/batch loaders can use us directly. There is no\n // `otherMeta`/`otherFieldName` because the \"other\" side is an enum table, not an entity.\n\n get joinTableName(): string {\n return this.#field.joinTableName;\n }\n\n get columnName(): string {\n return this.#field.columnNames[0];\n }\n\n get otherColumnName(): string {\n return this.#field.columnNames[1];\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.#field.fieldName);\n }\n\n get otherEnum(): EnumMetadata<any, any, number> {\n return this.#field.enumDetailType;\n }\n\n get otherMeta(): undefined {\n return undefined;\n }\n\n get otherFieldName(): undefined {\n return undefined;\n }\n\n get hasJoinTableId(): boolean {\n return this.#field.hasJoinTableId;\n }\n\n declare [enumCollectionTag]: true;\n [RelationT]: T = null!;\n [RelationU]: E = null!;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EnumCollection.js","names":[],"sources":["../../src/relations/EnumCollection.ts"],"sourcesContent":["import { enumCollectionBatchLoader } from \"src/batchloaders/enumCollectionBatchLoader.ts\";\nimport { type EnumMetadata } from \"src/EnumMetadata.ts\";\nimport {\n type Entity,\n type EntityMetadata,\n type ManyToManyEnumField,\n type ManyToManyLike,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { remove } from \"src/utils.ts\";\n\n/** A nominal brand so `EnumCollection` is not structurally confused with a regular `Collection`. */\ndeclare const enumCollectionTag: unique symbol;\n\n/**\n * A collection of enum codes `E` within `T`, backed by a m2m join table to an enum \"table\".\n *\n * To the user it looks like an array of enum codes (e.g. `Color[]`), but unlike an enum-array\n * column it is lazy and so needs a load hint, like any other relation.\n */\nexport interface EnumCollection<T extends Entity, E> {\n [enumCollectionTag]: true;\n [RelationT]: T;\n [RelationU]: E;\n\n load(opts?: { forceReload?: boolean }): Promise<ReadonlyArray<E>>;\n\n add(code: E): void;\n\n remove(code: E): void;\n\n /**\n * Sets the collection to `codes`.\n *\n * Can be called on unloaded collections - the diff will be resolved at load or flush time.\n */\n set(codes: readonly E[]): void;\n\n includes(code: E): Promise<boolean>;\n\n readonly isLoaded: boolean;\n readonly entity: Entity;\n readonly hasBeenSet: boolean;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedEnumCollection<T extends Entity, E> extends EnumCollection<T, E> {\n get: ReadonlyArray<E>;\n\n removeAll(): void;\n}\n\n/** An alias for creating `EnumCollection`s. */\nexport function hasEnumCollection<T extends Entity, E>(): EnumCollection<T, E> {\n return lazyField((entity: T, fieldName) => {\n const field = getMetadata(entity).allFields[fieldName] as ManyToManyEnumField;\n return new EnumCollectionImpl<T, E>(entity, field);\n });\n}\n\nexport class EnumCollectionImpl<T extends Entity, E>\n extends AbstractRelationImpl<T, E[]>\n implements EnumCollection<T, E>, LoadedEnumCollection<T, E>, ManyToManyLike\n{\n readonly #field: ManyToManyEnumField;\n #loaded: boolean;\n #loadPromise: any;\n #hasBeenSet = false;\n /** Holds a pending `set()` when called on an unloaded collection, resolved at load. */\n #pendingSet: E[] | undefined;\n\n constructor(entity: T, field: ManyToManyEnumField) {\n super(entity);\n this.#field = field;\n this.#loaded = getInstanceData(entity).isOrWasNew;\n }\n\n async load(opts: { forceReload?: boolean } = {}): Promise<ReadonlyArray<E>> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#loaded || (opts.forceReload && !this.entity.isNewEntity)) {\n if (this.#getPreloaded() !== undefined) {\n this.#loaded = true;\n } else {\n await (this.#loadPromise ??= enumCollectionBatchLoader(this.entity.em, this).load(this.entity.idTagged!))\n .then(() => {\n this.#loaded = true;\n })\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n if (this.#pendingSet) {\n const pending = this.#pendingSet;\n this.#pendingSet = undefined;\n this.#applySet(pending);\n }\n }\n return this.get;\n }\n\n add(code: E): void {\n ensureNotDeleted(this.entity);\n if (this.#pendingSet) {\n if (!this.#pendingSet.includes(code)) this.#pendingSet.push(code);\n return;\n }\n if (this.#loaded && this.get.includes(code)) return;\n this.#joinRows.addNew(this, this.entity, this.#idOf(code));\n }\n\n remove(code: E): void {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#pendingSet) {\n remove(this.#pendingSet, code);\n return;\n }\n this.#joinRows.addRemove(this, this.entity, this.#idOf(code));\n }\n\n set(codes: readonly E[]): void {\n ensureNotDeleted(this.entity);\n this.#hasBeenSet = true;\n if (!this.#loaded) {\n this.#pendingSet = [...codes];\n getEmInternalApi(this.entity.em).pendingLoads.add(this as any);\n return;\n }\n this.#applySet(codes);\n }\n\n async includes(code: E): Promise<boolean> {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#pendingSet) return this.#pendingSet.includes(code);\n if (this.#loaded) return this.get.includes(code);\n if (this.entity.isNewEntity) return false;\n await this.load();\n return this.get.includes(code);\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#loaded) throw new Error(\"removeAll was called when not loaded\");\n for (const code of [...this.get]) this.remove(code);\n }\n\n get get(): E[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#loaded) {\n throw new Error(`${this.entity}.${this.fieldName}.get was called when not loaded`);\n }\n return this.#codesFor(this.entity);\n }\n\n get isLoaded(): boolean {\n return this.#loaded;\n }\n\n get isPreloaded(): boolean {\n return this.#getPreloaded() !== undefined;\n }\n\n preload(): void {\n if (this.#getPreloaded() !== undefined) this.#loaded = true;\n }\n\n setFromOpts(codes: E[]): void {\n this.#loaded = true;\n for (const code of codes ?? []) this.add(code);\n }\n\n /**\n * Mirrors `other`'s codes into us for `em.fork`/`importEntity`.\n *\n * Enum codes have no entity identity to remap, and we copy them as already-persisted rows (not\n * pending adds) so the receiving em doesn't think it has spurious inserts to flush.\n */\n import(other: EnumCollectionImpl<T, E>): void {\n if (!other.isLoaded) return;\n this.#loaded = true;\n for (const code of other.get) {\n this.#joinRows.addPreloadedRow(this, undefined, this.entity, this.#idOf(code));\n }\n }\n\n maybeCascadeDelete(): void {\n // The join table FK cascades on the db side, so there's nothing to cascade in memory.\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // The db cascade-deletes our join rows, so just drop any pending in-memory changes for us.\n this.#joinRows.removeAllFor(this.columnName, this.entity);\n }\n\n get fieldName(): string {\n return this.#field.fieldName;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `EnumCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, enum: ${this.#field.enumDetailType.name})`;\n }\n\n #applySet(codes: readonly E[]): void {\n const current = this.get;\n for (const code of current) if (!codes.includes(code)) this.remove(code);\n for (const code of codes) if (!current.includes(code)) this.add(code);\n }\n\n /** The current (non-deleted) codes for `entity`, sorted by enum id for a stable order. */\n #codesFor(entity: Entity): E[] {\n return (this.#joinRows.getOthers(this.columnName, entity) as number[])\n .sort((a, b) => a - b)\n .map((id) => this.#field.enumDetailType.findById(id)!.code as E);\n }\n\n #idOf(code: E): number {\n return this.#field.enumDetailType.getByCode(code).id;\n }\n\n #getPreloaded(): E[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<E>(this.entity.idTagged, this.fieldName);\n }\n\n get #joinRows() {\n return getEmInternalApi(this.entity.em).joinRows(this);\n }\n\n // The `ManyToManyLike` surface, so JoinRows/batch loaders can use us directly. There is no\n // `otherMeta`/`otherFieldName` because the \"other\" side is an enum table, not an entity.\n\n get joinTableName(): string {\n return this.#field.joinTableName;\n }\n\n get columnName(): string {\n return this.#field.columnNames[0];\n }\n\n get otherColumnName(): string {\n return this.#field.columnNames[1];\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.#field.fieldName);\n }\n\n get otherEnum(): EnumMetadata<any, any, number> {\n return this.#field.enumDetailType;\n }\n\n get otherMeta(): undefined {\n return undefined;\n }\n\n get otherFieldName(): undefined {\n return undefined;\n }\n\n get hasJoinTableId(): boolean {\n return this.#field.hasJoinTableId;\n }\n\n declare [enumCollectionTag]: true;\n [RelationT]: T = null!;\n [RelationU]: E = null!;\n}\n"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { Entity } from "../Entity.cjs";
|
|
|
9
9
|
* We consider this a `Relation`, but not a true `Collection` b/c it cannot be
|
|
10
10
|
* loaded.
|
|
11
11
|
*/
|
|
12
|
-
interface LargeCollection<T extends Entity, U extends Entity> extends Relation<T, U> {
|
|
12
|
+
export interface LargeCollection<T extends Entity, U extends Entity> extends Relation<T, U> {
|
|
13
13
|
/** Looks up the specific `id` without fully loading the collection. */
|
|
14
14
|
find(id: IdOf<U>): Promise<U | undefined>;
|
|
15
15
|
/** Looks up the specific `other` without fully loading the collection. */
|
|
@@ -18,5 +18,4 @@ interface LargeCollection<T extends Entity, U extends Entity> extends Relation<T
|
|
|
18
18
|
remove(other: U): void;
|
|
19
19
|
}
|
|
20
20
|
//#endregion
|
|
21
|
-
export { LargeCollection };
|
|
22
21
|
//# sourceMappingURL=LargeCollection.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LargeCollection.d.cts","names":[],"sources":["../../src/relations/LargeCollection.ts"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"LargeCollection.d.cts","names":[],"sources":["../../src/relations/LargeCollection.ts"],"mappings":";;;;;;;;;;;iBAWiB,gBAAgB,UAAU,QAAQ,UAAU,gBAAgB,SAAS,GAAG;;EAEvF,KAAK,IAAI,KAAK,KAAK,QAAQ;;EAG3B,SAAS,OAAO,IAAI;EAEpB,IAAI,OAAO;EAEX,OAAO,OAAO"}
|
|
@@ -9,7 +9,7 @@ import { Entity } from "../Entity.mjs";
|
|
|
9
9
|
* We consider this a `Relation`, but not a true `Collection` b/c it cannot be
|
|
10
10
|
* loaded.
|
|
11
11
|
*/
|
|
12
|
-
interface LargeCollection<T extends Entity, U extends Entity> extends Relation<T, U> {
|
|
12
|
+
export interface LargeCollection<T extends Entity, U extends Entity> extends Relation<T, U> {
|
|
13
13
|
/** Looks up the specific `id` without fully loading the collection. */
|
|
14
14
|
find(id: IdOf<U>): Promise<U | undefined>;
|
|
15
15
|
/** Looks up the specific `other` without fully loading the collection. */
|
|
@@ -18,5 +18,4 @@ interface LargeCollection<T extends Entity, U extends Entity> extends Relation<T
|
|
|
18
18
|
remove(other: U): void;
|
|
19
19
|
}
|
|
20
20
|
//#endregion
|
|
21
|
-
export { LargeCollection };
|
|
22
21
|
//# sourceMappingURL=LargeCollection.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LargeCollection.d.mts","names":[],"sources":["../../src/relations/LargeCollection.ts"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"LargeCollection.d.mts","names":[],"sources":["../../src/relations/LargeCollection.ts"],"mappings":";;;;;;;;;;;iBAWiB,gBAAgB,UAAU,QAAQ,UAAU,gBAAgB,SAAS,GAAG;;EAEvF,KAAK,IAAI,KAAK,KAAK,QAAQ;;EAG3B,SAAS,OAAO,IAAI;EAEpB,IAAI,OAAO;EAEX,OAAO,OAAO"}
|
|
@@ -72,6 +72,20 @@ var LazyFieldImpl = class extends require_relations_AbstractPropertyImpl.Abstrac
|
|
|
72
72
|
if (require_BaseEntity.getInstanceData(this.entity).isOrWasNew) return true;
|
|
73
73
|
return this.#loaded;
|
|
74
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Marks this field loaded, using its value in entity data or reading it from the entity's row.
|
|
77
|
+
*
|
|
78
|
+
* The caller must know the value is present in entity data or the row; default SELECTs omit lazy columns.
|
|
79
|
+
*/
|
|
80
|
+
preload() {
|
|
81
|
+
const { data, rowData, rowIndex } = require_BaseEntity.getInstanceData(this.entity);
|
|
82
|
+
if (!(this.#fieldName in data)) {
|
|
83
|
+
const field = require_EntityMetadata.getMetadata(this.entity).allFields[this.#fieldName];
|
|
84
|
+
data[this.#fieldName] = field.serde.fromRow(rowData, rowIndex);
|
|
85
|
+
}
|
|
86
|
+
this.#loaded = true;
|
|
87
|
+
this.#loadPromise = void 0;
|
|
88
|
+
}
|
|
75
89
|
/** Called after em.flush to invalidate the cached value, since the db state may have changed. */
|
|
76
90
|
resetAfterFlush() {
|
|
77
91
|
this.#loaded = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LazyField.cjs","names":["lazyField","AbstractPropertyImpl","#fieldName","#loaded","#loadPromise","#value","getMetadata","getInstanceData","PropertyT","abbreviation","keyToNumber","kqDot","PojoRowData","tagId"],"sources":["../../src/relations/LazyField.ts"],"sourcesContent":["import { getInstanceData } from \"src/BaseEntity.ts\";\nimport { type BatchLoader } from \"src/batchloaders/BatchLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type EntityManager } from \"src/EntityManager.ts\";\nimport { type EntityMetadata, type PrimitiveField, getMetadata } from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport { keyToNumber, tagId } from \"src/keys.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport type { ParsedFindQuery } from \"src/queries/find/QueryParser.ts\";\nimport { kqDot } from \"src/queries/sql/keywords.ts\";\nimport { AbstractPropertyImpl } from \"src/relations/AbstractPropertyImpl.ts\";\nimport { type LoadedProperty, type Property } from \"src/relations/hasProperty.ts\";\nimport { PropertyT } from \"src/relations/PropertySymbols.ts\";\nimport { PojoRowData } from \"src/RowData.ts\";\nimport { abbreviation } from \"src/utils.ts\";\n\nexport const lazyColumnLoadOperation = \"lazy-column-load\";\n\n/**\n * The \"original value\" of an unloaded lazy column: unknown, and never equal to any set value.\n *\n * Seeded into `__orm.data` by `LazyFieldImpl.set` so that setting an unloaded column (even to\n * `undefined`) always registers as a change, i.e. instead of comparing equal to the `undefined`\n * that the excluded column would otherwise read as.\n */\nexport const notLoadedValue = Symbol(\"notLoadedValue\");\n\n/**\n * A single-column primitive (i.e. a large `jsonb`/`text`) that is deliberately excluded from the\n * entity's default SELECT and only fetched from the database on demand.\n *\n * I.e. `await author.someBigColumn.load()`, or synchronously via `.get` after `em.populate`.\n */\nexport interface LazyField<T extends Entity, V> extends Property<T, V> {\n load(opts?: { forceReload?: boolean }): Promise<V>;\n /** Sets the value in memory (dirtied for the next flush), i.e. without loading the current db value first. */\n set(value: V): void;\n}\n\n/** Creates a `LazyField` for a column that codegen has marked `lazy: true`. */\nexport function hasLazyField<T extends Entity, V>(): LazyField<T, V> {\n return lazyField((entity: T, fieldName: string) => new LazyFieldImpl<T, V>(entity, fieldName));\n}\n\nexport class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T> implements LazyField<T, V> {\n #fieldName: string;\n #loaded = false;\n #loadPromise: Promise<V> | undefined;\n\n constructor(entity: T, fieldName: string) {\n super(entity);\n this.#fieldName = fieldName;\n }\n\n /** Fetches this column from the database (batched across peers) and caches it on the entity. */\n load(opts?: { forceReload?: boolean }): Promise<V> {\n const { entity } = this;\n if (opts?.forceReload) {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n if (this.isLoaded) return Promise.resolve(this.#value);\n const meta = getMetadata(entity);\n return (this.#loadPromise ??= lazyColumnBatchLoader(entity.em, meta, this.#fieldName)\n .load(entity.idTagged)\n .then(() => {\n this.#loaded = true;\n return this.#value;\n }));\n }\n\n get get(): V {\n if (!this.isLoaded) {\n throw new Error(`${this.#fieldName} has not been loaded yet, use '.load()' or an 'em.populate' hint`);\n }\n return this.#value;\n }\n\n /** Sets the value in memory; the column is dirtied and written on the next `em.flush`. */\n set(value: V): void {\n if (this.isLoaded) {\n setField(this.entity, this.#fieldName, value);\n } else {\n // Seed `notLoadedValue` as the current value so the set always registers as a change against\n // the unknown db value: an unloaded column otherwise reads as `undefined`, which would make\n // `set(undefined)` a silent no-op, and a later `set(undefined)` falsely revert to clean.\n const { data } = getInstanceData(this.entity);\n data[this.#fieldName] = notLoadedValue;\n try {\n setField(this.entity, this.#fieldName, value);\n } catch (e) {\n // Don't leak the marker as a readable value, i.e. if setting on a deleted entity throws\n delete data[this.#fieldName];\n throw e;\n }\n }\n this.#loaded = true;\n }\n\n get isLoaded(): boolean {\n // New entities keep their value in-memory, so there's nothing to lazy-load.\n if (getInstanceData(this.entity).isOrWasNew) return true;\n return this.#loaded;\n }\n\n /** Called after em.flush to invalidate the cached value, since the db state may have changed. */\n resetAfterFlush(): void {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n\n /** The domain value, which `load`/`set` keep in the entity's `__orm.data` like any other column. */\n get #value(): V {\n return getInstanceData(this.entity).data[this.#fieldName] as V;\n }\n\n [PropertyT] = undefined as any as T;\n}\n\n/** Type guard utility for determining if an entity field is a LazyField. */\nexport function isLazyField(maybe: any): maybe is LazyField<any, any> {\n return maybe instanceof LazyFieldImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded LazyField. */\nexport function isLoadedLazyField(maybe: any): maybe is LazyField<any, any> & LoadedProperty<any, any> {\n return isLazyField(maybe) && maybe.isLoaded;\n}\n\n/** Batches `LazyField.load`s for the same column into a single `SELECT id, <column> ... WHERE id IN (...)`. */\nfunction lazyColumnBatchLoader(em: EntityManager, meta: EntityMetadata, fieldName: string): BatchLoader<string> {\n return em.getBatchLoader(lazyColumnLoadOperation, `${meta.tableName}-${fieldName}`, async (taggedIds) => {\n const field = meta.allFields[fieldName] as PrimitiveField;\n const column = field.serde.columns[0];\n const alias = abbreviation(meta.tableName);\n const keys = taggedIds.map((id) => keyToNumber(meta, id));\n const query: ParsedFindQuery = {\n selects: [`${kqDot(alias, \"id\")} as id`, kqDot(alias, column.columnName)],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: {\n kind: \"exp\",\n op: \"and\",\n conditions: [{ kind: \"column\", alias, column: \"id\", dbType: meta.idDbType, cond: { kind: \"in\", value: keys } }],\n },\n orderBys: [],\n };\n const rows = await em[\"executeFind\"](meta, lazyColumnLoadOperation, query, {});\n const rowData = new PojoRowData(rows);\n for (let i = 0; i < rows.length; i++) {\n const entity = em.findExistingInstance(tagId(meta, rows[i].id));\n if (entity) getInstanceData(entity).data[fieldName] = field.serde.fromRow(rowData, i);\n }\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LazyField.cjs","names":["lazyField","AbstractPropertyImpl","getMetadata","getInstanceData","PropertyT","abbreviation","keyToNumber","kqDot","PojoRowData","tagId"],"sources":["../../src/relations/LazyField.ts"],"sourcesContent":["import { getInstanceData } from \"src/BaseEntity.ts\";\nimport { type BatchLoader } from \"src/batchloaders/BatchLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type EntityManager } from \"src/EntityManager.ts\";\nimport { type EntityMetadata, type PrimitiveField, getMetadata } from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport { keyToNumber, tagId } from \"src/keys.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport type { ParsedFindQuery } from \"src/queries/find/QueryParser.ts\";\nimport { kqDot } from \"src/queries/sql/keywords.ts\";\nimport { AbstractPropertyImpl } from \"src/relations/AbstractPropertyImpl.ts\";\nimport { type LoadedProperty, type Property } from \"src/relations/hasProperty.ts\";\nimport { PropertyT } from \"src/relations/PropertySymbols.ts\";\nimport { PojoRowData } from \"src/RowData.ts\";\nimport { abbreviation } from \"src/utils.ts\";\n\nexport const lazyColumnLoadOperation = \"lazy-column-load\";\n\n/**\n * The \"original value\" of an unloaded lazy column: unknown, and never equal to any set value.\n *\n * Seeded into `__orm.data` by `LazyFieldImpl.set` so that setting an unloaded column (even to\n * `undefined`) always registers as a change, i.e. instead of comparing equal to the `undefined`\n * that the excluded column would otherwise read as.\n */\nexport const notLoadedValue = Symbol(\"notLoadedValue\");\n\n/**\n * A single-column primitive (i.e. a large `jsonb`/`text`) that is deliberately excluded from the\n * entity's default SELECT and only fetched from the database on demand.\n *\n * I.e. `await author.someBigColumn.load()`, or synchronously via `.get` after `em.populate`.\n */\nexport interface LazyField<T extends Entity, V> extends Property<T, V> {\n load(opts?: { forceReload?: boolean }): Promise<V>;\n /** Sets the value in memory (dirtied for the next flush), i.e. without loading the current db value first. */\n set(value: V): void;\n}\n\n/** Creates a `LazyField` for a column that codegen has marked `lazy: true`. */\nexport function hasLazyField<T extends Entity, V>(): LazyField<T, V> {\n return lazyField((entity: T, fieldName: string) => new LazyFieldImpl<T, V>(entity, fieldName));\n}\n\nexport class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T> implements LazyField<T, V> {\n #fieldName: string;\n #loaded = false;\n #loadPromise: Promise<V> | undefined;\n\n constructor(entity: T, fieldName: string) {\n super(entity);\n this.#fieldName = fieldName;\n }\n\n /** Fetches this column from the database (batched across peers) and caches it on the entity. */\n load(opts?: { forceReload?: boolean }): Promise<V> {\n const { entity } = this;\n if (opts?.forceReload) {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n if (this.isLoaded) return Promise.resolve(this.#value);\n const meta = getMetadata(entity);\n return (this.#loadPromise ??= lazyColumnBatchLoader(entity.em, meta, this.#fieldName)\n .load(entity.idTagged)\n .then(() => {\n this.#loaded = true;\n return this.#value;\n }));\n }\n\n get get(): V {\n if (!this.isLoaded) {\n throw new Error(`${this.#fieldName} has not been loaded yet, use '.load()' or an 'em.populate' hint`);\n }\n return this.#value;\n }\n\n /** Sets the value in memory; the column is dirtied and written on the next `em.flush`. */\n set(value: V): void {\n if (this.isLoaded) {\n setField(this.entity, this.#fieldName, value);\n } else {\n // Seed `notLoadedValue` as the current value so the set always registers as a change against\n // the unknown db value: an unloaded column otherwise reads as `undefined`, which would make\n // `set(undefined)` a silent no-op, and a later `set(undefined)` falsely revert to clean.\n const { data } = getInstanceData(this.entity);\n data[this.#fieldName] = notLoadedValue;\n try {\n setField(this.entity, this.#fieldName, value);\n } catch (e) {\n // Don't leak the marker as a readable value, i.e. if setting on a deleted entity throws\n delete data[this.#fieldName];\n throw e;\n }\n }\n this.#loaded = true;\n }\n\n get isLoaded(): boolean {\n // New entities keep their value in-memory, so there's nothing to lazy-load.\n if (getInstanceData(this.entity).isOrWasNew) return true;\n return this.#loaded;\n }\n\n /**\n * Marks this field loaded, using its value in entity data or reading it from the entity's row.\n *\n * The caller must know the value is present in entity data or the row; default SELECTs omit lazy columns.\n */\n preload(): void {\n const { data, rowData, rowIndex } = getInstanceData(this.entity);\n if (!(this.#fieldName in data)) {\n const field = getMetadata(this.entity).allFields[this.#fieldName];\n data[this.#fieldName] = field.serde!.fromRow(rowData, rowIndex);\n }\n\n this.#loaded = true;\n this.#loadPromise = undefined;\n }\n\n /** Called after em.flush to invalidate the cached value, since the db state may have changed. */\n resetAfterFlush(): void {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n\n /** The domain value, which `load`/`set` keep in the entity's `__orm.data` like any other column. */\n get #value(): V {\n return getInstanceData(this.entity).data[this.#fieldName] as V;\n }\n\n [PropertyT] = undefined as any as T;\n}\n\n/** Type guard utility for determining if an entity field is a LazyField. */\nexport function isLazyField(maybe: any): maybe is LazyField<any, any> {\n return maybe instanceof LazyFieldImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded LazyField. */\nexport function isLoadedLazyField(maybe: any): maybe is LazyField<any, any> & LoadedProperty<any, any> {\n return isLazyField(maybe) && maybe.isLoaded;\n}\n\n/** Batches `LazyField.load`s for the same column into a single `SELECT id, <column> ... WHERE id IN (...)`. */\nfunction lazyColumnBatchLoader(em: EntityManager, meta: EntityMetadata, fieldName: string): BatchLoader<string> {\n return em.getBatchLoader(lazyColumnLoadOperation, `${meta.tableName}-${fieldName}`, async (taggedIds) => {\n const field = meta.allFields[fieldName] as PrimitiveField;\n const column = field.serde.columns[0];\n const alias = abbreviation(meta.tableName);\n const keys = taggedIds.map((id) => keyToNumber(meta, id));\n const query: ParsedFindQuery = {\n selects: [`${kqDot(alias, \"id\")} as id`, kqDot(alias, column.columnName)],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: {\n kind: \"exp\",\n op: \"and\",\n conditions: [{ kind: \"column\", alias, column: \"id\", dbType: meta.idDbType, cond: { kind: \"in\", value: keys } }],\n },\n orderBys: [],\n };\n const rows = await em[\"executeFind\"](meta, lazyColumnLoadOperation, query, {});\n const rowData = new PojoRowData(rows);\n for (let i = 0; i < rows.length; i++) {\n const entity = em.findExistingInstance(tagId(meta, rows[i].id));\n if (entity) getInstanceData(entity).data[fieldName] = field.serde.fromRow(rowData, i);\n }\n });\n}\n"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { PropertyT } from "./PropertySymbols.cjs";
|
|
|
3
3
|
import { LoadedProperty, Property } from "./hasProperty.cjs";
|
|
4
4
|
import { Entity } from "../Entity.cjs";
|
|
5
5
|
//#region src/relations/LazyField.d.ts
|
|
6
|
-
declare const lazyColumnLoadOperation = "lazy-column-load";
|
|
6
|
+
export declare const lazyColumnLoadOperation = "lazy-column-load";
|
|
7
7
|
/**
|
|
8
8
|
* The "original value" of an unloaded lazy column: unknown, and never equal to any set value.
|
|
9
9
|
*
|
|
@@ -11,14 +11,14 @@ declare const lazyColumnLoadOperation = "lazy-column-load";
|
|
|
11
11
|
* `undefined`) always registers as a change, i.e. instead of comparing equal to the `undefined`
|
|
12
12
|
* that the excluded column would otherwise read as.
|
|
13
13
|
*/
|
|
14
|
-
declare const notLoadedValue: unique symbol;
|
|
14
|
+
export declare const notLoadedValue: unique symbol;
|
|
15
15
|
/**
|
|
16
16
|
* A single-column primitive (i.e. a large `jsonb`/`text`) that is deliberately excluded from the
|
|
17
17
|
* entity's default SELECT and only fetched from the database on demand.
|
|
18
18
|
*
|
|
19
19
|
* I.e. `await author.someBigColumn.load()`, or synchronously via `.get` after `em.populate`.
|
|
20
20
|
*/
|
|
21
|
-
interface LazyField<T extends Entity, V> extends Property<T, V> {
|
|
21
|
+
export interface LazyField<T extends Entity, V> extends Property<T, V> {
|
|
22
22
|
load(opts?: {
|
|
23
23
|
forceReload?: boolean;
|
|
24
24
|
}): Promise<V>;
|
|
@@ -26,8 +26,8 @@ interface LazyField<T extends Entity, V> extends Property<T, V> {
|
|
|
26
26
|
set(value: V): void;
|
|
27
27
|
}
|
|
28
28
|
/** Creates a `LazyField` for a column that codegen has marked `lazy: true`. */
|
|
29
|
-
declare function hasLazyField<T extends Entity, V>(): LazyField<T, V>;
|
|
30
|
-
declare class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T> implements LazyField<T, V> {
|
|
29
|
+
export declare function hasLazyField<T extends Entity, V>(): LazyField<T, V>;
|
|
30
|
+
export declare class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T> implements LazyField<T, V> {
|
|
31
31
|
#private;
|
|
32
32
|
constructor(entity: T, fieldName: string);
|
|
33
33
|
/** Fetches this column from the database (batched across peers) and caches it on the entity. */
|
|
@@ -38,14 +38,19 @@ declare class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T>
|
|
|
38
38
|
/** Sets the value in memory; the column is dirtied and written on the next `em.flush`. */
|
|
39
39
|
set(value: V): void;
|
|
40
40
|
get isLoaded(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Marks this field loaded, using its value in entity data or reading it from the entity's row.
|
|
43
|
+
*
|
|
44
|
+
* The caller must know the value is present in entity data or the row; default SELECTs omit lazy columns.
|
|
45
|
+
*/
|
|
46
|
+
preload(): void;
|
|
41
47
|
/** Called after em.flush to invalidate the cached value, since the db state may have changed. */
|
|
42
48
|
resetAfterFlush(): void;
|
|
43
49
|
[PropertyT]: T;
|
|
44
50
|
}
|
|
45
51
|
/** Type guard utility for determining if an entity field is a LazyField. */
|
|
46
|
-
declare function isLazyField(maybe: any): maybe is LazyField<any, any>;
|
|
52
|
+
export declare function isLazyField(maybe: any): maybe is LazyField<any, any>;
|
|
47
53
|
/** Type guard utility for determining if an entity field is a loaded LazyField. */
|
|
48
|
-
declare function isLoadedLazyField(maybe: any): maybe is LazyField<any, any> & LoadedProperty<any, any>;
|
|
54
|
+
export declare function isLoadedLazyField(maybe: any): maybe is LazyField<any, any> & LoadedProperty<any, any>;
|
|
49
55
|
//#endregion
|
|
50
|
-
export { LazyField, LazyFieldImpl, hasLazyField, isLazyField, isLoadedLazyField, lazyColumnLoadOperation, notLoadedValue };
|
|
51
56
|
//# sourceMappingURL=LazyField.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LazyField.d.cts","names":[],"sources":["../../src/relations/LazyField.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"LazyField.d.cts","names":[],"sources":["../../src/relations/LazyField.ts"],"mappings":";;;;;qBAgBa;;;;;;;;qBASA;;;;;;;iBAQI,UAAU,UAAU,QAAQ,WAAW,SAAS,GAAG;EAClE,KAAK;IAAS;MAA0B,QAAQ;;EAEhD,IAAI,OAAO;;;wBAIG,aAAa,UAAU,QAAQ,MAAM,UAAU,GAAG;qBAIrD,cAAc,UAAU,QAAQ,WAAW,qBAAqB,cAAc,UAAU,GAAG;;EAKtG,YAAY,QAAQ,GAAG;;EAMvB,KAAK;IAAS;MAA0B,QAAQ;MAgB5C,OAAO;;EAQX,IAAI,OAAO;MAoBP;;;;;;EAWJ;;EAYA;GAUC,YAAiC;;;wBAIpB,YAAY,aAAa,SAAS;;wBAKlC,kBAAkB,aAAa,SAAS,sBAAsB"}
|
|
@@ -3,7 +3,7 @@ import { PropertyT } from "./PropertySymbols.mjs";
|
|
|
3
3
|
import { LoadedProperty, Property } from "./hasProperty.mjs";
|
|
4
4
|
import { Entity } from "../Entity.mjs";
|
|
5
5
|
//#region src/relations/LazyField.d.ts
|
|
6
|
-
declare const lazyColumnLoadOperation = "lazy-column-load";
|
|
6
|
+
export declare const lazyColumnLoadOperation = "lazy-column-load";
|
|
7
7
|
/**
|
|
8
8
|
* The "original value" of an unloaded lazy column: unknown, and never equal to any set value.
|
|
9
9
|
*
|
|
@@ -11,14 +11,14 @@ declare const lazyColumnLoadOperation = "lazy-column-load";
|
|
|
11
11
|
* `undefined`) always registers as a change, i.e. instead of comparing equal to the `undefined`
|
|
12
12
|
* that the excluded column would otherwise read as.
|
|
13
13
|
*/
|
|
14
|
-
declare const notLoadedValue: unique symbol;
|
|
14
|
+
export declare const notLoadedValue: unique symbol;
|
|
15
15
|
/**
|
|
16
16
|
* A single-column primitive (i.e. a large `jsonb`/`text`) that is deliberately excluded from the
|
|
17
17
|
* entity's default SELECT and only fetched from the database on demand.
|
|
18
18
|
*
|
|
19
19
|
* I.e. `await author.someBigColumn.load()`, or synchronously via `.get` after `em.populate`.
|
|
20
20
|
*/
|
|
21
|
-
interface LazyField<T extends Entity, V> extends Property<T, V> {
|
|
21
|
+
export interface LazyField<T extends Entity, V> extends Property<T, V> {
|
|
22
22
|
load(opts?: {
|
|
23
23
|
forceReload?: boolean;
|
|
24
24
|
}): Promise<V>;
|
|
@@ -26,8 +26,8 @@ interface LazyField<T extends Entity, V> extends Property<T, V> {
|
|
|
26
26
|
set(value: V): void;
|
|
27
27
|
}
|
|
28
28
|
/** Creates a `LazyField` for a column that codegen has marked `lazy: true`. */
|
|
29
|
-
declare function hasLazyField<T extends Entity, V>(): LazyField<T, V>;
|
|
30
|
-
declare class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T> implements LazyField<T, V> {
|
|
29
|
+
export declare function hasLazyField<T extends Entity, V>(): LazyField<T, V>;
|
|
30
|
+
export declare class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T> implements LazyField<T, V> {
|
|
31
31
|
#private;
|
|
32
32
|
constructor(entity: T, fieldName: string);
|
|
33
33
|
/** Fetches this column from the database (batched across peers) and caches it on the entity. */
|
|
@@ -38,14 +38,19 @@ declare class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T>
|
|
|
38
38
|
/** Sets the value in memory; the column is dirtied and written on the next `em.flush`. */
|
|
39
39
|
set(value: V): void;
|
|
40
40
|
get isLoaded(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Marks this field loaded, using its value in entity data or reading it from the entity's row.
|
|
43
|
+
*
|
|
44
|
+
* The caller must know the value is present in entity data or the row; default SELECTs omit lazy columns.
|
|
45
|
+
*/
|
|
46
|
+
preload(): void;
|
|
41
47
|
/** Called after em.flush to invalidate the cached value, since the db state may have changed. */
|
|
42
48
|
resetAfterFlush(): void;
|
|
43
49
|
[PropertyT]: T;
|
|
44
50
|
}
|
|
45
51
|
/** Type guard utility for determining if an entity field is a LazyField. */
|
|
46
|
-
declare function isLazyField(maybe: any): maybe is LazyField<any, any>;
|
|
52
|
+
export declare function isLazyField(maybe: any): maybe is LazyField<any, any>;
|
|
47
53
|
/** Type guard utility for determining if an entity field is a loaded LazyField. */
|
|
48
|
-
declare function isLoadedLazyField(maybe: any): maybe is LazyField<any, any> & LoadedProperty<any, any>;
|
|
54
|
+
export declare function isLoadedLazyField(maybe: any): maybe is LazyField<any, any> & LoadedProperty<any, any>;
|
|
49
55
|
//#endregion
|
|
50
|
-
export { LazyField, LazyFieldImpl, hasLazyField, isLazyField, isLoadedLazyField, lazyColumnLoadOperation, notLoadedValue };
|
|
51
56
|
//# sourceMappingURL=LazyField.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LazyField.d.mts","names":[],"sources":["../../src/relations/LazyField.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"LazyField.d.mts","names":[],"sources":["../../src/relations/LazyField.ts"],"mappings":";;;;;qBAgBa;;;;;;;;qBASA;;;;;;;iBAQI,UAAU,UAAU,QAAQ,WAAW,SAAS,GAAG;EAClE,KAAK;IAAS;MAA0B,QAAQ;;EAEhD,IAAI,OAAO;;;wBAIG,aAAa,UAAU,QAAQ,MAAM,UAAU,GAAG;qBAIrD,cAAc,UAAU,QAAQ,WAAW,qBAAqB,cAAc,UAAU,GAAG;;EAKtG,YAAY,QAAQ,GAAG;;EAMvB,KAAK;IAAS;MAA0B,QAAQ;MAgB5C,OAAO;;EAQX,IAAI,OAAO;MAoBP;;;;;;EAWJ;;EAYA;GAUC,YAAiC;;;wBAIpB,YAAY,aAAa,SAAS;;wBAKlC,kBAAkB,aAAa,SAAS,sBAAsB"}
|
|
@@ -71,6 +71,20 @@ var LazyFieldImpl = class extends AbstractPropertyImpl {
|
|
|
71
71
|
if (getInstanceData(this.entity).isOrWasNew) return true;
|
|
72
72
|
return this.#loaded;
|
|
73
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Marks this field loaded, using its value in entity data or reading it from the entity's row.
|
|
76
|
+
*
|
|
77
|
+
* The caller must know the value is present in entity data or the row; default SELECTs omit lazy columns.
|
|
78
|
+
*/
|
|
79
|
+
preload() {
|
|
80
|
+
const { data, rowData, rowIndex } = getInstanceData(this.entity);
|
|
81
|
+
if (!(this.#fieldName in data)) {
|
|
82
|
+
const field = getMetadata(this.entity).allFields[this.#fieldName];
|
|
83
|
+
data[this.#fieldName] = field.serde.fromRow(rowData, rowIndex);
|
|
84
|
+
}
|
|
85
|
+
this.#loaded = true;
|
|
86
|
+
this.#loadPromise = void 0;
|
|
87
|
+
}
|
|
74
88
|
/** Called after em.flush to invalidate the cached value, since the db state may have changed. */
|
|
75
89
|
resetAfterFlush() {
|
|
76
90
|
this.#loaded = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LazyField.js","names":[
|
|
1
|
+
{"version":3,"file":"LazyField.js","names":[],"sources":["../../src/relations/LazyField.ts"],"sourcesContent":["import { getInstanceData } from \"src/BaseEntity.ts\";\nimport { type BatchLoader } from \"src/batchloaders/BatchLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type EntityManager } from \"src/EntityManager.ts\";\nimport { type EntityMetadata, type PrimitiveField, getMetadata } from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport { keyToNumber, tagId } from \"src/keys.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport type { ParsedFindQuery } from \"src/queries/find/QueryParser.ts\";\nimport { kqDot } from \"src/queries/sql/keywords.ts\";\nimport { AbstractPropertyImpl } from \"src/relations/AbstractPropertyImpl.ts\";\nimport { type LoadedProperty, type Property } from \"src/relations/hasProperty.ts\";\nimport { PropertyT } from \"src/relations/PropertySymbols.ts\";\nimport { PojoRowData } from \"src/RowData.ts\";\nimport { abbreviation } from \"src/utils.ts\";\n\nexport const lazyColumnLoadOperation = \"lazy-column-load\";\n\n/**\n * The \"original value\" of an unloaded lazy column: unknown, and never equal to any set value.\n *\n * Seeded into `__orm.data` by `LazyFieldImpl.set` so that setting an unloaded column (even to\n * `undefined`) always registers as a change, i.e. instead of comparing equal to the `undefined`\n * that the excluded column would otherwise read as.\n */\nexport const notLoadedValue = Symbol(\"notLoadedValue\");\n\n/**\n * A single-column primitive (i.e. a large `jsonb`/`text`) that is deliberately excluded from the\n * entity's default SELECT and only fetched from the database on demand.\n *\n * I.e. `await author.someBigColumn.load()`, or synchronously via `.get` after `em.populate`.\n */\nexport interface LazyField<T extends Entity, V> extends Property<T, V> {\n load(opts?: { forceReload?: boolean }): Promise<V>;\n /** Sets the value in memory (dirtied for the next flush), i.e. without loading the current db value first. */\n set(value: V): void;\n}\n\n/** Creates a `LazyField` for a column that codegen has marked `lazy: true`. */\nexport function hasLazyField<T extends Entity, V>(): LazyField<T, V> {\n return lazyField((entity: T, fieldName: string) => new LazyFieldImpl<T, V>(entity, fieldName));\n}\n\nexport class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T> implements LazyField<T, V> {\n #fieldName: string;\n #loaded = false;\n #loadPromise: Promise<V> | undefined;\n\n constructor(entity: T, fieldName: string) {\n super(entity);\n this.#fieldName = fieldName;\n }\n\n /** Fetches this column from the database (batched across peers) and caches it on the entity. */\n load(opts?: { forceReload?: boolean }): Promise<V> {\n const { entity } = this;\n if (opts?.forceReload) {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n if (this.isLoaded) return Promise.resolve(this.#value);\n const meta = getMetadata(entity);\n return (this.#loadPromise ??= lazyColumnBatchLoader(entity.em, meta, this.#fieldName)\n .load(entity.idTagged)\n .then(() => {\n this.#loaded = true;\n return this.#value;\n }));\n }\n\n get get(): V {\n if (!this.isLoaded) {\n throw new Error(`${this.#fieldName} has not been loaded yet, use '.load()' or an 'em.populate' hint`);\n }\n return this.#value;\n }\n\n /** Sets the value in memory; the column is dirtied and written on the next `em.flush`. */\n set(value: V): void {\n if (this.isLoaded) {\n setField(this.entity, this.#fieldName, value);\n } else {\n // Seed `notLoadedValue` as the current value so the set always registers as a change against\n // the unknown db value: an unloaded column otherwise reads as `undefined`, which would make\n // `set(undefined)` a silent no-op, and a later `set(undefined)` falsely revert to clean.\n const { data } = getInstanceData(this.entity);\n data[this.#fieldName] = notLoadedValue;\n try {\n setField(this.entity, this.#fieldName, value);\n } catch (e) {\n // Don't leak the marker as a readable value, i.e. if setting on a deleted entity throws\n delete data[this.#fieldName];\n throw e;\n }\n }\n this.#loaded = true;\n }\n\n get isLoaded(): boolean {\n // New entities keep their value in-memory, so there's nothing to lazy-load.\n if (getInstanceData(this.entity).isOrWasNew) return true;\n return this.#loaded;\n }\n\n /**\n * Marks this field loaded, using its value in entity data or reading it from the entity's row.\n *\n * The caller must know the value is present in entity data or the row; default SELECTs omit lazy columns.\n */\n preload(): void {\n const { data, rowData, rowIndex } = getInstanceData(this.entity);\n if (!(this.#fieldName in data)) {\n const field = getMetadata(this.entity).allFields[this.#fieldName];\n data[this.#fieldName] = field.serde!.fromRow(rowData, rowIndex);\n }\n\n this.#loaded = true;\n this.#loadPromise = undefined;\n }\n\n /** Called after em.flush to invalidate the cached value, since the db state may have changed. */\n resetAfterFlush(): void {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n\n /** The domain value, which `load`/`set` keep in the entity's `__orm.data` like any other column. */\n get #value(): V {\n return getInstanceData(this.entity).data[this.#fieldName] as V;\n }\n\n [PropertyT] = undefined as any as T;\n}\n\n/** Type guard utility for determining if an entity field is a LazyField. */\nexport function isLazyField(maybe: any): maybe is LazyField<any, any> {\n return maybe instanceof LazyFieldImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded LazyField. */\nexport function isLoadedLazyField(maybe: any): maybe is LazyField<any, any> & LoadedProperty<any, any> {\n return isLazyField(maybe) && maybe.isLoaded;\n}\n\n/** Batches `LazyField.load`s for the same column into a single `SELECT id, <column> ... WHERE id IN (...)`. */\nfunction lazyColumnBatchLoader(em: EntityManager, meta: EntityMetadata, fieldName: string): BatchLoader<string> {\n return em.getBatchLoader(lazyColumnLoadOperation, `${meta.tableName}-${fieldName}`, async (taggedIds) => {\n const field = meta.allFields[fieldName] as PrimitiveField;\n const column = field.serde.columns[0];\n const alias = abbreviation(meta.tableName);\n const keys = taggedIds.map((id) => keyToNumber(meta, id));\n const query: ParsedFindQuery = {\n selects: [`${kqDot(alias, \"id\")} as id`, kqDot(alias, column.columnName)],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: {\n kind: \"exp\",\n op: \"and\",\n conditions: [{ kind: \"column\", alias, column: \"id\", dbType: meta.idDbType, cond: { kind: \"in\", value: keys } }],\n },\n orderBys: [],\n };\n const rows = await em[\"executeFind\"](meta, lazyColumnLoadOperation, query, {});\n const rowData = new PojoRowData(rows);\n for (let i = 0; i < rows.length; i++) {\n const entity = em.findExistingInstance(tagId(meta, rows[i].id));\n if (entity) getInstanceData(entity).data[fieldName] = field.serde.fromRow(rowData, i);\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAa,0BAA0B;;;;;;;;AASvC,MAAa,iBAAiB,OAAO,gBAAgB;;AAerD,SAAgB,eAAqD;CACnE,OAAO,WAAW,QAAW,cAAsB,IAAI,cAAoB,QAAQ,SAAS,CAAC;AAC/F;AAEA,IAAa,gBAAb,cAAwD,qBAAmD;CACzG;CACA,UAAU;CACV;CAEA,YAAY,QAAW,WAAmB;EACxC,MAAM,MAAM;EACZ,KAAK,aAAa;CACpB;;CAGA,KAAK,MAA8C;EACjD,MAAM,EAAE,WAAW;EACnB,IAAI,MAAM,aAAa;GACrB,KAAK,UAAU;GACf,KAAK,eAAe,KAAA;EACtB;EACA,IAAI,KAAK,UAAU,OAAO,QAAQ,QAAQ,KAAK,MAAM;EACrD,MAAM,OAAO,YAAY,MAAM;EAC/B,OAAQ,KAAK,iBAAiB,sBAAsB,OAAO,IAAI,MAAM,KAAK,UAAU,CAAC,CAClF,KAAK,OAAO,QAAQ,CAAC,CACrB,WAAW;GACV,KAAK,UAAU;GACf,OAAO,KAAK;EACd,CAAC;CACL;CAEA,IAAI,MAAS;EACX,IAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,GAAG,KAAK,WAAW,iEAAiE;EAEtG,OAAO,KAAK;CACd;;CAGA,IAAI,OAAgB;EAClB,IAAI,KAAK,UACP,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK;OACvC;GAIL,MAAM,EAAE,SAAS,gBAAgB,KAAK,MAAM;GAC5C,KAAK,KAAK,cAAc;GACxB,IAAI;IACF,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK;GAC9C,SAAS,GAAG;IAEV,OAAO,KAAK,KAAK;IACjB,MAAM;GACR;EACF;EACA,KAAK,UAAU;CACjB;CAEA,IAAI,WAAoB;EAEtB,IAAI,gBAAgB,KAAK,MAAM,CAAC,CAAC,YAAY,OAAO;EACpD,OAAO,KAAK;CACd;;;;;;CAOA,UAAgB;EACd,MAAM,EAAE,MAAM,SAAS,aAAa,gBAAgB,KAAK,MAAM;EAC/D,IAAI,EAAE,KAAK,cAAc,OAAO;GAC9B,MAAM,QAAQ,YAAY,KAAK,MAAM,CAAC,CAAC,UAAU,KAAK;GACtD,KAAK,KAAK,cAAc,MAAM,MAAO,QAAQ,SAAS,QAAQ;EAChE;EAEA,KAAK,UAAU;EACf,KAAK,eAAe,KAAA;CACtB;;CAGA,kBAAwB;EACtB,KAAK,UAAU;EACf,KAAK,eAAe,KAAA;CACtB;;CAGA,IAAI,SAAY;EACd,OAAO,gBAAgB,KAAK,MAAM,CAAC,CAAC,KAAK,KAAK;CAChD;CAEA,CAAC,aAAa,KAAA;AAChB;;AAGA,SAAgB,YAAY,OAA0C;CACpE,OAAO,iBAAiB;AAC1B;;AAGA,SAAgB,kBAAkB,OAAqE;CACrG,OAAO,YAAY,KAAK,KAAK,MAAM;AACrC;;AAGA,SAAS,sBAAsB,IAAmB,MAAsB,WAAwC;CAC9G,OAAO,GAAG,eAAe,yBAAyB,GAAG,KAAK,UAAU,GAAG,aAAa,OAAO,cAAc;EACvG,MAAM,QAAQ,KAAK,UAAU;EAC7B,MAAM,SAAS,MAAM,MAAM,QAAQ;EACnC,MAAM,QAAQ,aAAa,KAAK,SAAS;EACzC,MAAM,OAAO,UAAU,KAAK,OAAO,YAAY,MAAM,EAAE,CAAC;EACxD,MAAM,QAAyB;GAC7B,SAAS,CAAC,GAAG,MAAM,OAAO,IAAI,EAAE,SAAS,MAAM,OAAO,OAAO,UAAU,CAAC;GACxE,QAAQ,CAAC;IAAE;IAAO,MAAM;IAAW,OAAO,KAAK;GAAU,CAAC;GAC1D,WAAW;IACT,MAAM;IACN,IAAI;IACJ,YAAY,CAAC;KAAE,MAAM;KAAU;KAAO,QAAQ;KAAM,QAAQ,KAAK;KAAU,MAAM;MAAE,MAAM;MAAM,OAAO;KAAK;IAAE,CAAC;GAChH;GACA,UAAU,CAAC;EACb;EACA,MAAM,OAAO,MAAM,GAAG,cAAc,CAAC,MAAM,yBAAyB,OAAO,CAAC,CAAC;EAC7E,MAAM,UAAU,IAAI,YAAY,IAAI;EACpC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,SAAS,GAAG,qBAAqB,MAAM,MAAM,KAAK,EAAE,CAAC,EAAE,CAAC;GAC9D,IAAI,QAAQ,gBAAgB,MAAM,CAAC,CAAC,KAAK,aAAa,MAAM,MAAM,QAAQ,SAAS,CAAC;EACtF;CACF,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManyToManyCollection.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","#field","getInstanceData","#state","#getPreloaded","#loadPromise","manyToManyBatchLoader","appendStack","manyToManyFindDataLoader","toTaggedId","#isCascadeDelete","getMetadataForField","isCascadeDelete","getEmInternalApi","RelationT","RelationU","#m2m","#added","#removed","#pendingSet","#loaded","#hasBeenSet"],"sources":["../../src/relations/ManyToManyCollection.ts"],"sourcesContent":["import { manyToManyBatchLoader } from \"src/batchloaders/manyToManyBatchLoader.ts\";\nimport { manyToManyFindDataLoader } from \"src/dataloaders/manyToManyFindDataLoader.ts\";\nimport {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type ManyToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n toTaggedId,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { maybeAdd, maybeRemove, remove } from \"src/utils.ts\";\n\n/** An alias for creating `ManyToManyCollections`s. */\nexport function hasManyToMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const m2m = getMetadata(entity).allFields[fieldName] as ManyToManyField;\n return new ManyToManyCollection<T, U>(entity, m2m);\n });\n}\n\nexport class ManyToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>\n{\n readonly #field: ManyToManyField;\n #loadPromise: any;\n #state: M2MState<T, U>;\n\n // I.e. when entity = Book:\n // fieldName == tags, because it's our collection to tags\n // columnName = book_id, what we use as the `where book_id = us` to find our join table rows\n // otherFieldName = books, how tags points to us\n // otherColumnName = tag_id, how the other side finds its join table rows\n constructor(entity: T, field: ManyToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new LoadedState<T, U>(this, [], false);\n } else {\n this.#state = new UnloadedPristineState<T, U>(this);\n }\n }\n\n /** @internal */\n percolateAdd(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).add(this.entity, true);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).remove(this.entity, true);\n }\n\n /** @internal */\n registerJoinRowAdd(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addNew(this, this.entity, other);\n }\n\n /** @internal */\n registerJoinRowRemove(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addRemove(this, this.entity, other);\n }\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n private filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n if (opts?.withDeleted === true) return [...entities];\n // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n return entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<ReadonlyArray<U>> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const key = `${this.columnName}=${this.entity.id}`;\n const maybePreloaded = this.#getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= manyToManyBatchLoader(this.entity.em, this).load(key))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n }\n return this.filterDeleted(this.#state.doGet(), opts) as ReadonlyArray<U>;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.find(id);\n if (inMemory) return inMemory;\n if (this.#state.isLoaded) return undefined;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${id}`;\n const includes = await manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n const taggedId = toTaggedId(this.otherMeta, id);\n return includes ? (this.entity.em.load(taggedId) as Promise<U>) : undefined;\n }\n\n async includes(other: U): Promise<boolean> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.includesInMemory(other);\n if (inMemory !== undefined) return inMemory;\n if (other.isNewEntity) return false;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${other.id}`;\n return manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function includes(err) {\n throw appendStack(err, new Error());\n });\n }\n\n add(other: U, percolated = false): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other, percolated);\n }\n\n remove(other: U, percolated = false): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, percolated);\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.#getPreloaded();\n }\n\n preload(): void {\n const preloaded = this.#getPreloaded();\n if (preloaded) {\n this.#state = this.#state.applyLoad(preloaded);\n }\n }\n\n import(other: ManyToManyCollection<T, U>, _: unknown, mapEntities: (e: U[] | undefined) => U[] | undefined): void {\n this.#state = other.#state.import(this, mapEntities);\n }\n\n private doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n return this.#state.doGet();\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#state.isLoaded) {\n throw new Error(\"removeAll was called when not loaded\");\n }\n for (const other of [...this.#state.doGet()]) {\n this.remove(other);\n }\n }\n\n // impl details\n\n setFromOpts(others: U[]): void {\n this.#state = new LoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n maybeCascadeDelete() {\n if (this.#isCascadeDelete) {\n this.filterDeleted(this.#state.current({ withDeleted: true }), { withDeleted: true }).forEach((e) =>\n this.entity.em.delete(e),\n );\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n if (this.#isCascadeDelete) return;\n const entities = await this.load({ withDeleted: true });\n entities.forEach((other) => {\n const m2m = other[this.otherFieldName] as any as ManyToManyCollection<U, T>;\n m2m.remove(this.entity);\n });\n if (this.#state instanceof LoadedState) {\n this.#state.setLoaded([]);\n }\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n get joinTableName(): string {\n return this.#field.joinTableName;\n }\n\n get fieldName(): string {\n return this.#field.fieldName;\n }\n\n get otherFieldName(): string & keyof U {\n return this.#field.otherFieldName as string & keyof U;\n }\n\n get columnName(): string {\n return this.#field.columnNames[0];\n }\n\n get otherColumnName(): string {\n return this.#field.columnNames[1];\n }\n\n get hasJoinTableId(): boolean {\n return this.#field.hasJoinTableId;\n }\n\n get #isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n #getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<U>(this.entity.idTagged, this.fieldName);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for ManyToManyCollection state machine.\n *\n * State transitions:\n * ```\n * Constructor (existing entity) → UnloadedPristine\n * Constructor (new entity) → Loaded\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + applyLoad → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + applyLoad → Loaded (merges tracked adds/removes)\n *\n * PendingSet + applyLoad → Loaded (diffs pending values against DB)\n *\n * Loaded + applyLoad (forceReload) → Loaded (refreshed)\n * ```\n */\ninterface M2MState<T extends Entity, U extends Entity> {\n /** Adds an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n add(other: U, percolated: boolean): M2MState<T, U>;\n /** Removes an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n remove(other: U, percolated: boolean): M2MState<T, U>;\n /** Sets the collection; transitions UnloadedPristine/UnloadedAddedRemoved → PendingSet. */\n set(values: readonly U[]): M2MState<T, U>;\n /** Returns the current entities; throws if not loaded (except PendingSet returns pending values). */\n doGet(): U[];\n /** Finds an entity by id in memory; returns undefined if not found or not tracked. */\n find(id: IdOf<U>): U | undefined;\n /** Checks if entity is in memory; returns undefined if async lookup needed. */\n includesInMemory(other: U): boolean | undefined;\n /** Applies loaded DB entities; always transitions to Loaded. */\n applyLoad(dbEntities: U[]): LoadedState<T, U>;\n /** Returns current entities for cascade delete (works in any state). */\n current(opts?: { withDeleted?: boolean }): U[];\n /** Creates a copy of this state for a different collection (used by em.clone). */\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass UnloadedPristineState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n\n constructor(m2m: ManyToManyCollection<T, U>) {\n this.#m2m = m2m;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n const newState = new UnloadedAddedRemovedState<T, U>(this.#m2m, [other], []);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return newState;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n return new UnloadedAddedRemovedState<T, U>(this.#m2m, [], [other]);\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n includesInMemory(_other: U): boolean | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n return new LoadedState<T, U>(this.#m2m, dbEntities, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return [];\n }\n\n import(m2m: ManyToManyCollection<T, U>, _mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n return new UnloadedPristineState<T, U>(m2m);\n }\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass UnloadedAddedRemovedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n #added: U[];\n #removed: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#m2m = m2m;\n this.#added = added;\n this.#removed = removed;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n maybeRemove(this.#removed, other);\n if (!this.#added.includes(other)) {\n this.#added.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n maybeRemove(this.#added, other);\n maybeAdd(this.#removed, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#added.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n if (this.#added.includes(other)) return true;\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n for (const e of this.#added) {\n if (!loaded.includes(e)) {\n loaded.unshift(e);\n this.#m2m.registerJoinRowAdd(e);\n }\n }\n for (const e of this.#removed) {\n remove(loaded, e);\n this.#m2m.registerJoinRowRemove(e);\n }\n return new LoadedState<T, U>(this.#m2m, loaded, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#added;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const added = mapEntities(this.#added);\n const removed = mapEntities(this.#removed);\n return new UnloadedAddedRemovedState<T, U>(m2m, added ?? [], removed ?? []);\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass PendingSetState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #m2m: ManyToManyCollection<T, U>;\n #pendingSet: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, pendingSet: U[]) {\n this.#m2m = m2m;\n this.#pendingSet = pendingSet;\n getEmInternalApi(m2m.entity.em).pendingLoads.add(m2m);\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (!this.#pendingSet.includes(other)) {\n this.#pendingSet.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#pendingSet, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#pendingSet = [...values];\n return this;\n }\n\n doGet(): U[] {\n return this.#pendingSet;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#pendingSet.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#pendingSet.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n const pending = this.#pendingSet;\n for (const other of [...loaded]) {\n if (!pending.includes(other)) {\n remove(loaded, other);\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n }\n for (const other of pending) {\n if (!loaded.includes(other)) {\n loaded.push(other);\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n }\n return new LoadedState<T, U>(this.#m2m, loaded, true);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#pendingSet;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const pendingSet = mapEntities(this.#pendingSet);\n return new PendingSetState<T, U>(m2m, pendingSet ?? []);\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass LoadedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = true;\n #m2m: ManyToManyCollection<T, U>;\n #loaded: U[];\n #hasBeenSet: boolean;\n\n constructor(m2m: ManyToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean) {\n this.#m2m = m2m;\n this.#loaded = loaded;\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (this.#loaded.includes(other)) return this;\n this.#loaded.push(other);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#loaded, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#hasBeenSet = true;\n const loaded = new Set(this.#loaded);\n const valuesSet = new Set(values);\n for (const other of loaded) {\n if (!valuesSet.has(other)) {\n this.remove(other, false);\n }\n }\n for (const other of values) {\n if (!loaded.has(other)) {\n this.add(other, false);\n }\n }\n return this;\n }\n\n doGet(): U[] {\n return this.#loaded;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#loaded.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#loaded.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n this.#loaded = dbEntities;\n return this;\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#loaded;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const loaded = mapEntities(this.#loaded);\n return new LoadedState<T, U>(m2m, loaded ?? [], this.#hasBeenSet);\n }\n\n getLoaded(): U[] {\n return this.#loaded;\n }\n\n setLoaded(entities: U[]): void {\n this.#loaded = entities;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ManyToManyCollection.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","getInstanceData","manyToManyBatchLoader","appendStack","manyToManyFindDataLoader","toTaggedId","getMetadataForField","isCascadeDelete","getEmInternalApi","RelationT","RelationU"],"sources":["../../src/relations/ManyToManyCollection.ts"],"sourcesContent":["import { manyToManyBatchLoader } from \"src/batchloaders/manyToManyBatchLoader.ts\";\nimport { manyToManyFindDataLoader } from \"src/dataloaders/manyToManyFindDataLoader.ts\";\nimport {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type ManyToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n toTaggedId,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { maybeAdd, maybeRemove, remove } from \"src/utils.ts\";\n\n/** An alias for creating `ManyToManyCollections`s. */\nexport function hasManyToMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const m2m = getMetadata(entity).allFields[fieldName] as ManyToManyField;\n return new ManyToManyCollection<T, U>(entity, m2m);\n });\n}\n\nexport class ManyToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>\n{\n readonly #field: ManyToManyField;\n #loadPromise: any;\n #state: M2MState<T, U>;\n\n // I.e. when entity = Book:\n // fieldName == tags, because it's our collection to tags\n // columnName = book_id, what we use as the `where book_id = us` to find our join table rows\n // otherFieldName = books, how tags points to us\n // otherColumnName = tag_id, how the other side finds its join table rows\n constructor(entity: T, field: ManyToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new LoadedState<T, U>(this, [], false);\n } else {\n this.#state = new UnloadedPristineState<T, U>(this);\n }\n }\n\n /** @internal */\n percolateAdd(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).add(this.entity, true);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n (other[this.otherFieldName] as any as ManyToManyCollection<U, T>).remove(this.entity, true);\n }\n\n /** @internal */\n registerJoinRowAdd(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addNew(this, this.entity, other);\n }\n\n /** @internal */\n registerJoinRowRemove(other: U): void {\n getEmInternalApi(this.entity.em).joinRows(this).addRemove(this, this.entity, other);\n }\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n private filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n if (opts?.withDeleted === true) return [...entities];\n // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n return entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<ReadonlyArray<U>> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const key = `${this.columnName}=${this.entity.id}`;\n const maybePreloaded = this.#getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= manyToManyBatchLoader(this.entity.em, this).load(key))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n }\n return this.filterDeleted(this.#state.doGet(), opts) as ReadonlyArray<U>;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.find(id);\n if (inMemory) return inMemory;\n if (this.#state.isLoaded) return undefined;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${id}`;\n const includes = await manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n const taggedId = toTaggedId(this.otherMeta, id);\n return includes ? (this.entity.em.load(taggedId) as Promise<U>) : undefined;\n }\n\n async includes(other: U): Promise<boolean> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.includesInMemory(other);\n if (inMemory !== undefined) return inMemory;\n if (other.isNewEntity) return false;\n const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${other.id}`;\n return manyToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function includes(err) {\n throw appendStack(err, new Error());\n });\n }\n\n add(other: U, percolated = false): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other, percolated);\n }\n\n remove(other: U, percolated = false): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, percolated);\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.#getPreloaded();\n }\n\n preload(): void {\n const preloaded = this.#getPreloaded();\n if (preloaded) {\n this.#state = this.#state.applyLoad(preloaded);\n }\n }\n\n import(other: ManyToManyCollection<T, U>, _: unknown, mapEntities: (e: U[] | undefined) => U[] | undefined): void {\n this.#state = other.#state.import(this, mapEntities);\n }\n\n private doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n return this.#state.doGet();\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#state.isLoaded) {\n throw new Error(\"removeAll was called when not loaded\");\n }\n for (const other of [...this.#state.doGet()]) {\n this.remove(other);\n }\n }\n\n // impl details\n\n setFromOpts(others: U[]): void {\n this.#state = new LoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n maybeCascadeDelete() {\n if (this.#isCascadeDelete) {\n this.filterDeleted(this.#state.current({ withDeleted: true }), { withDeleted: true }).forEach((e) =>\n this.entity.em.delete(e),\n );\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n if (this.#isCascadeDelete) return;\n const entities = await this.load({ withDeleted: true });\n entities.forEach((other) => {\n const m2m = other[this.otherFieldName] as any as ManyToManyCollection<U, T>;\n m2m.remove(this.entity);\n });\n if (this.#state instanceof LoadedState) {\n this.#state.setLoaded([]);\n }\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n get joinTableName(): string {\n return this.#field.joinTableName;\n }\n\n get fieldName(): string {\n return this.#field.fieldName;\n }\n\n get otherFieldName(): string & keyof U {\n return this.#field.otherFieldName as string & keyof U;\n }\n\n get columnName(): string {\n return this.#field.columnNames[0];\n }\n\n get otherColumnName(): string {\n return this.#field.columnNames[1];\n }\n\n get hasJoinTableId(): boolean {\n return this.#field.hasJoinTableId;\n }\n\n get #isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n #getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<U>(this.entity.idTagged, this.fieldName);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for ManyToManyCollection state machine.\n *\n * State transitions:\n * ```\n * Constructor (existing entity) → UnloadedPristine\n * Constructor (new entity) → Loaded\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + applyLoad → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + applyLoad → Loaded (merges tracked adds/removes)\n *\n * PendingSet + applyLoad → Loaded (diffs pending values against DB)\n *\n * Loaded + applyLoad (forceReload) → Loaded (refreshed)\n * ```\n */\ninterface M2MState<T extends Entity, U extends Entity> {\n /** Adds an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n add(other: U, percolated: boolean): M2MState<T, U>;\n /** Removes an entity; may transition UnloadedPristine → UnloadedAddedRemoved. */\n remove(other: U, percolated: boolean): M2MState<T, U>;\n /** Sets the collection; transitions UnloadedPristine/UnloadedAddedRemoved → PendingSet. */\n set(values: readonly U[]): M2MState<T, U>;\n /** Returns the current entities; throws if not loaded (except PendingSet returns pending values). */\n doGet(): U[];\n /** Finds an entity by id in memory; returns undefined if not found or not tracked. */\n find(id: IdOf<U>): U | undefined;\n /** Checks if entity is in memory; returns undefined if async lookup needed. */\n includesInMemory(other: U): boolean | undefined;\n /** Applies loaded DB entities; always transitions to Loaded. */\n applyLoad(dbEntities: U[]): LoadedState<T, U>;\n /** Returns current entities for cascade delete (works in any state). */\n current(opts?: { withDeleted?: boolean }): U[];\n /** Creates a copy of this state for a different collection (used by em.clone). */\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass UnloadedPristineState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n\n constructor(m2m: ManyToManyCollection<T, U>) {\n this.#m2m = m2m;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n const newState = new UnloadedAddedRemovedState<T, U>(this.#m2m, [other], []);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return newState;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n return new UnloadedAddedRemovedState<T, U>(this.#m2m, [], [other]);\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n includesInMemory(_other: U): boolean | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n return new LoadedState<T, U>(this.#m2m, dbEntities, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return [];\n }\n\n import(m2m: ManyToManyCollection<T, U>, _mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n return new UnloadedPristineState<T, U>(m2m);\n }\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass UnloadedAddedRemovedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #m2m: ManyToManyCollection<T, U>;\n #added: U[];\n #removed: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#m2m = m2m;\n this.#added = added;\n this.#removed = removed;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n maybeRemove(this.#removed, other);\n if (!this.#added.includes(other)) {\n this.#added.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n maybeRemove(this.#added, other);\n maybeAdd(this.#removed, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n return new PendingSetState<T, U>(this.#m2m, [...values]);\n }\n\n doGet(): U[] {\n throw new Error(`${this.#m2m.entity}.${this.#m2m.fieldName}.get was called when not loaded`);\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#added.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n if (this.#added.includes(other)) return true;\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n for (const e of this.#added) {\n if (!loaded.includes(e)) {\n loaded.unshift(e);\n this.#m2m.registerJoinRowAdd(e);\n }\n }\n for (const e of this.#removed) {\n remove(loaded, e);\n this.#m2m.registerJoinRowRemove(e);\n }\n return new LoadedState<T, U>(this.#m2m, loaded, false);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#added;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const added = mapEntities(this.#added);\n const removed = mapEntities(this.#removed);\n return new UnloadedAddedRemovedState<T, U>(m2m, added ?? [], removed ?? []);\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass PendingSetState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #m2m: ManyToManyCollection<T, U>;\n #pendingSet: U[];\n\n constructor(m2m: ManyToManyCollection<T, U>, pendingSet: U[]) {\n this.#m2m = m2m;\n this.#pendingSet = pendingSet;\n getEmInternalApi(m2m.entity.em).pendingLoads.add(m2m);\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (!this.#pendingSet.includes(other)) {\n this.#pendingSet.push(other);\n }\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#pendingSet, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#pendingSet = [...values];\n return this;\n }\n\n doGet(): U[] {\n return this.#pendingSet;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#pendingSet.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#pendingSet.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n const loaded = [...dbEntities];\n const pending = this.#pendingSet;\n for (const other of [...loaded]) {\n if (!pending.includes(other)) {\n remove(loaded, other);\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n }\n for (const other of pending) {\n if (!loaded.includes(other)) {\n loaded.push(other);\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n }\n return new LoadedState<T, U>(this.#m2m, loaded, true);\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#pendingSet;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const pendingSet = mapEntities(this.#pendingSet);\n return new PendingSetState<T, U>(m2m, pendingSet ?? []);\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass LoadedState<T extends Entity, U extends Entity> implements M2MState<T, U> {\n readonly isLoaded = true;\n #m2m: ManyToManyCollection<T, U>;\n #loaded: U[];\n #hasBeenSet: boolean;\n\n constructor(m2m: ManyToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean) {\n this.#m2m = m2m;\n this.#loaded = loaded;\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U, percolated: boolean): M2MState<T, U> {\n if (this.#loaded.includes(other)) return this;\n this.#loaded.push(other);\n if (!percolated) {\n this.#m2m.registerJoinRowAdd(other);\n this.#m2m.percolateAdd(other);\n }\n return this;\n }\n\n remove(other: U, percolated: boolean): M2MState<T, U> {\n if (!percolated) {\n this.#m2m.registerJoinRowRemove(other);\n this.#m2m.percolateRemove(other);\n }\n remove(this.#loaded, other);\n return this;\n }\n\n set(values: readonly U[]): M2MState<T, U> {\n this.#hasBeenSet = true;\n const loaded = new Set(this.#loaded);\n const valuesSet = new Set(values);\n for (const other of loaded) {\n if (!valuesSet.has(other)) {\n this.remove(other, false);\n }\n }\n for (const other of values) {\n if (!loaded.has(other)) {\n this.add(other, false);\n }\n }\n return this;\n }\n\n doGet(): U[] {\n return this.#loaded;\n }\n\n find(id: IdOf<U>): U | undefined {\n return this.#loaded.find((u) => u.id === id);\n }\n\n includesInMemory(other: U): boolean | undefined {\n return this.#loaded.includes(other);\n }\n\n applyLoad(dbEntities: U[]): LoadedState<T, U> {\n this.#loaded = dbEntities;\n return this;\n }\n\n current(_opts?: { withDeleted?: boolean }): U[] {\n return this.#loaded;\n }\n\n import(m2m: ManyToManyCollection<T, U>, mapEntities: (e: U[] | undefined) => U[] | undefined): M2MState<T, U> {\n const loaded = mapEntities(this.#loaded);\n return new LoadedState<T, U>(m2m, loaded ?? [], this.#hasBeenSet);\n }\n\n getLoaded(): U[] {\n return this.#loaded;\n }\n\n setLoaded(entities: U[]): void {\n this.#loaded = entities;\n }\n}\n"],"mappings":"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"}
|
|
@@ -7,8 +7,8 @@ import { IdOf } from "../EntityManager.cjs";
|
|
|
7
7
|
import { Entity } from "../Entity.cjs";
|
|
8
8
|
//#region src/relations/ManyToManyCollection.d.ts
|
|
9
9
|
/** An alias for creating `ManyToManyCollections`s. */
|
|
10
|
-
declare function hasManyToMany<T extends Entity, U extends Entity>(): Collection<T, U>;
|
|
11
|
-
declare class ManyToManyCollection<T extends Entity, U extends Entity> extends AbstractRelationImpl<T, U[]> implements Collection<T, U> {
|
|
10
|
+
export declare function hasManyToMany<T extends Entity, U extends Entity>(): Collection<T, U>;
|
|
11
|
+
export declare class ManyToManyCollection<T extends Entity, U extends Entity> extends AbstractRelationImpl<T, U[]> implements Collection<T, U> {
|
|
12
12
|
#private;
|
|
13
13
|
constructor(entity: T, field: ManyToManyField);
|
|
14
14
|
/** @internal */
|
|
@@ -55,5 +55,4 @@ declare class ManyToManyCollection<T extends Entity, U extends Entity> extends A
|
|
|
55
55
|
[RelationU]: U;
|
|
56
56
|
}
|
|
57
57
|
//#endregion
|
|
58
|
-
export { ManyToManyCollection, hasManyToMany };
|
|
59
58
|
//# sourceMappingURL=ManyToManyCollection.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManyToManyCollection.d.cts","names":[],"sources":["../../src/relations/ManyToManyCollection.ts"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"ManyToManyCollection.d.cts","names":[],"sources":["../../src/relations/ManyToManyCollection.ts"],"mappings":";;;;;;;;;wBAuBgB,cAAc,UAAU,QAAQ,UAAU,WAAW,WAAW,GAAG;qBAOtE,qBAAqB,UAAU,QAAQ,UAAU,gBACpD,qBAAqB,GAAG,gBACrB,WAAW,GAAG;;EAWzB,YAAY,QAAQ,GAAG,OAAO;;EAW9B,aAAa,OAAO;;EAKpB,gBAAgB,OAAO;;EAKvB,mBAAmB,OAAO;;EAK1B,sBAAsB,OAAO;;UAKrB;EAOF,KAAK;IAAQ;IAAuB;MAA+B,QAAQ,cAAc;EAqBzF,KAAK,IAAI,KAAK,KAAK,QAAQ;EAe3B,SAAS,OAAO,IAAI;EAa1B,IAAI,OAAO,GAAG;EAKd,OAAO,OAAO,GAAG;MAKb;MAIA;EAIJ;EAOA,OAAO,OAAO,qBAAqB,GAAG,IAAI,YAAY,cAAc,GAAG,oBAAoB;UAInF;MAKJ,kBAAkB;MAIlB,OAAO;EAIX,IAAI,iBAAiB;EAKrB;EAYA,YAAY,QAAQ;EAKpB;EAQM,0BAA0B;MAY5B,QAAQ;MAIR,aAAa;MAIb;MAIA;MAIA,iCAAiC;MAIjC;MAIA;MAIA;MAQA;EAIJ;GASC,YAAY;GACZ,YAAY"}
|