joist-core 2.4.0-next.37 → 2.4.0-next.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/BaseEntity.d.cts +3 -4
- package/build/BaseEntity.d.cts.map +1 -1
- package/build/BaseEntity.d.mts +3 -4
- package/build/BaseEntity.d.mts.map +1 -1
- package/build/Entity.d.cts +3 -4
- package/build/Entity.d.cts.map +1 -1
- package/build/Entity.d.mts +3 -4
- package/build/Entity.d.mts.map +1 -1
- package/build/EntityFields.d.cts +3 -4
- package/build/EntityFields.d.cts.map +1 -1
- package/build/EntityFields.d.mts +3 -4
- package/build/EntityFields.d.mts.map +1 -1
- package/build/EntityManager.cjs +11 -3
- package/build/EntityManager.cjs.map +1 -1
- package/build/EntityManager.d.cts +47 -41
- package/build/EntityManager.d.cts.map +1 -1
- package/build/EntityManager.d.mts +47 -41
- package/build/EntityManager.d.mts.map +1 -1
- package/build/EntityManager.js +11 -3
- package/build/EntityManager.js.map +1 -1
- package/build/EntityMetadata.d.cts +31 -32
- package/build/EntityMetadata.d.cts.map +1 -1
- package/build/EntityMetadata.d.mts +31 -32
- package/build/EntityMetadata.d.mts.map +1 -1
- package/build/EnumMetadata.d.cts +1 -2
- package/build/EnumMetadata.d.cts.map +1 -1
- package/build/EnumMetadata.d.mts +1 -2
- package/build/EnumMetadata.d.mts.map +1 -1
- package/build/IndexManager.cjs.map +1 -1
- package/build/IndexManager.d.cts +2 -3
- package/build/IndexManager.d.cts.map +1 -1
- package/build/IndexManager.d.mts +2 -3
- package/build/IndexManager.d.mts.map +1 -1
- package/build/IndexManager.js.map +1 -1
- package/build/InstanceData.cjs.map +1 -1
- package/build/InstanceData.d.cts +1 -2
- package/build/InstanceData.d.cts.map +1 -1
- package/build/InstanceData.d.mts +1 -2
- package/build/InstanceData.d.mts.map +1 -1
- package/build/InstanceData.js.map +1 -1
- package/build/PluginManager.cjs.map +1 -1
- package/build/PluginManager.d.cts +4 -4
- package/build/PluginManager.d.cts.map +1 -1
- package/build/PluginManager.d.mts +4 -4
- package/build/PluginManager.d.mts.map +1 -1
- package/build/PluginManager.js.map +1 -1
- package/build/RowData.d.cts +3 -4
- package/build/RowData.d.cts.map +1 -1
- package/build/RowData.d.mts +3 -4
- package/build/RowData.d.mts.map +1 -1
- package/build/batchloaders/BatchLoader.cjs.map +1 -1
- package/build/batchloaders/BatchLoader.d.cts +1 -2
- package/build/batchloaders/BatchLoader.d.cts.map +1 -1
- package/build/batchloaders/BatchLoader.d.mts +1 -2
- package/build/batchloaders/BatchLoader.d.mts.map +1 -1
- package/build/batchloaders/BatchLoader.js.map +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.cts +2 -3
- package/build/batchloaders/enumCollectionBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.mts +2 -3
- package/build/batchloaders/enumCollectionBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.cts +2 -3
- package/build/batchloaders/loadBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.mts +2 -3
- package/build/batchloaders/loadBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.d.cts +2 -3
- package/build/batchloaders/manyToManyBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.d.mts +2 -3
- package/build/batchloaders/manyToManyBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.d.cts +2 -3
- package/build/batchloaders/oneToManyBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.d.mts +2 -3
- package/build/batchloaders/oneToManyBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.d.cts +2 -3
- package/build/batchloaders/oneToOneBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.d.mts +2 -3
- package/build/batchloaders/oneToOneBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/populateBatchLoader.d.cts +2 -3
- package/build/batchloaders/populateBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/populateBatchLoader.d.mts +2 -3
- package/build/batchloaders/populateBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.d.cts +2 -3
- package/build/batchloaders/recursiveChildrenBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.d.mts +2 -3
- package/build/batchloaders/recursiveChildrenBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.d.cts +2 -3
- package/build/batchloaders/recursiveM2mBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.d.mts +2 -3
- package/build/batchloaders/recursiveM2mBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.d.cts +2 -3
- package/build/batchloaders/recursiveParentsBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.d.mts +2 -3
- package/build/batchloaders/recursiveParentsBatchLoader.d.mts.map +1 -1
- package/build/changes.cjs.map +1 -1
- package/build/changes.d.cts +9 -10
- package/build/changes.d.cts.map +1 -1
- package/build/changes.d.mts +9 -10
- package/build/changes.d.mts.map +1 -1
- package/build/changes.js.map +1 -1
- package/build/config.d.cts +17 -17
- package/build/config.d.cts.map +1 -1
- package/build/config.d.mts +17 -17
- package/build/config.d.mts.map +1 -1
- package/build/configure.d.cts +8 -9
- package/build/configure.d.cts.map +1 -1
- package/build/configure.d.mts +8 -9
- package/build/configure.d.mts.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.d.cts +1 -2
- package/build/dataloaders/fastWhereFilterHash.d.cts.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.d.mts +1 -2
- package/build/dataloaders/fastWhereFilterHash.d.mts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.cts +2 -3
- package/build/dataloaders/findByUniqueDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.mts +2 -3
- package/build/dataloaders/findByUniqueDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findCountDataLoader.d.cts +4 -5
- package/build/dataloaders/findCountDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findCountDataLoader.d.mts +4 -5
- package/build/dataloaders/findCountDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findDataLoader.d.cts +11 -12
- package/build/dataloaders/findDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findDataLoader.d.mts +11 -12
- package/build/dataloaders/findDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findIdsDataLoader.d.cts +2 -3
- package/build/dataloaders/findIdsDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findIdsDataLoader.d.mts +2 -3
- package/build/dataloaders/findIdsDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.d.cts +3 -3
- package/build/dataloaders/findOrCreateDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.d.mts +3 -3
- package/build/dataloaders/findOrCreateDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.cts +1 -2
- package/build/dataloaders/findPaginatedDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.mts +1 -2
- package/build/dataloaders/findPaginatedDataLoader.d.mts.map +1 -1
- package/build/dataloaders/lensDataLoader.d.cts +2 -3
- package/build/dataloaders/lensDataLoader.d.cts.map +1 -1
- package/build/dataloaders/lensDataLoader.d.mts +2 -3
- package/build/dataloaders/lensDataLoader.d.mts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.cts +2 -3
- package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.mts +2 -3
- package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.cts +2 -3
- package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.mts +2 -3
- package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
- package/build/defaults.cjs.map +1 -1
- package/build/defaults.d.cts +7 -7
- package/build/defaults.d.cts.map +1 -1
- package/build/defaults.d.mts +7 -7
- package/build/defaults.d.mts.map +1 -1
- package/build/defaults.js.map +1 -1
- package/build/drivers/Driver.d.cts +2 -3
- package/build/drivers/Driver.d.cts.map +1 -1
- package/build/drivers/Driver.d.mts +2 -3
- package/build/drivers/Driver.d.mts.map +1 -1
- package/build/drivers/EntityWriter.d.cts +7 -7
- package/build/drivers/EntityWriter.d.cts.map +1 -1
- package/build/drivers/EntityWriter.d.mts +7 -7
- package/build/drivers/EntityWriter.d.mts.map +1 -1
- package/build/drivers/IdAssigner.cjs.map +1 -1
- package/build/drivers/IdAssigner.d.cts +5 -5
- package/build/drivers/IdAssigner.d.cts.map +1 -1
- package/build/drivers/IdAssigner.d.mts +5 -5
- package/build/drivers/IdAssigner.d.mts.map +1 -1
- package/build/drivers/IdAssigner.js.map +1 -1
- package/build/drivers/driverApi.d.cts +2 -3
- package/build/drivers/driverApi.d.cts.map +1 -1
- package/build/drivers/driverApi.d.mts +2 -3
- package/build/drivers/driverApi.d.mts.map +1 -1
- package/build/fields.d.cts +6 -7
- package/build/fields.d.cts.map +1 -1
- package/build/fields.d.mts +6 -7
- package/build/fields.d.mts.map +1 -1
- package/build/flush/FlushLock.cjs.map +1 -1
- package/build/flush/FlushLock.d.cts +1 -2
- package/build/flush/FlushLock.d.cts.map +1 -1
- package/build/flush/FlushLock.d.mts +1 -2
- package/build/flush/FlushLock.d.mts.map +1 -1
- package/build/flush/FlushLock.js.map +1 -1
- package/build/flush/JoinRows.cjs.map +1 -1
- package/build/flush/JoinRows.d.cts +5 -6
- package/build/flush/JoinRows.d.cts.map +1 -1
- package/build/flush/JoinRows.d.mts +5 -6
- package/build/flush/JoinRows.d.mts.map +1 -1
- package/build/flush/JoinRows.js.map +1 -1
- package/build/flush/PendingChanges.d.cts +5 -6
- package/build/flush/PendingChanges.d.cts.map +1 -1
- package/build/flush/PendingChanges.d.mts +5 -6
- package/build/flush/PendingChanges.d.mts.map +1 -1
- package/build/flush/Todo.d.cts +5 -6
- package/build/flush/Todo.d.cts.map +1 -1
- package/build/flush/Todo.d.mts +5 -6
- package/build/flush/Todo.d.mts.map +1 -1
- package/build/getProperties.d.cts +3 -4
- package/build/getProperties.d.cts.map +1 -1
- package/build/getProperties.d.mts +3 -4
- package/build/getProperties.d.mts.map +1 -1
- package/build/index.d.cts +17 -17
- package/build/index.d.cts.map +1 -1
- package/build/index.d.mts +17 -17
- package/build/index.d.mts.map +1 -1
- package/build/json.d.cts +11 -11
- package/build/json.d.cts.map +1 -1
- package/build/json.d.mts +11 -11
- package/build/json.d.mts.map +1 -1
- package/build/keys.d.cts +27 -27
- package/build/keys.d.cts.map +1 -1
- package/build/keys.d.mts +27 -27
- package/build/keys.d.mts.map +1 -1
- package/build/loading/HintTree.d.cts +3 -4
- package/build/loading/HintTree.d.cts.map +1 -1
- package/build/loading/HintTree.d.mts +3 -4
- package/build/loading/HintTree.d.mts.map +1 -1
- package/build/loading/IsLoadedCache.cjs.map +1 -1
- package/build/loading/IsLoadedCache.d.cts +2 -3
- package/build/loading/IsLoadedCache.d.cts.map +1 -1
- package/build/loading/IsLoadedCache.d.mts +2 -3
- package/build/loading/IsLoadedCache.d.mts.map +1 -1
- package/build/loading/IsLoadedCache.js.map +1 -1
- package/build/loading/loadHints.d.cts +17 -17
- package/build/loading/loadHints.d.cts.map +1 -1
- package/build/loading/loadHints.d.mts +17 -17
- package/build/loading/loadHints.d.mts.map +1 -1
- package/build/loading/loadLens.d.cts +13 -13
- package/build/loading/loadLens.d.cts.map +1 -1
- package/build/loading/loadLens.d.mts +13 -13
- package/build/loading/loadLens.d.mts.map +1 -1
- package/build/loading/withLoaded.d.cts +5 -6
- package/build/loading/withLoaded.d.cts.map +1 -1
- package/build/loading/withLoaded.d.mts +5 -6
- package/build/loading/withLoaded.d.mts.map +1 -1
- package/build/logging/FactoryLogger.d.cts +3 -4
- package/build/logging/FactoryLogger.d.cts.map +1 -1
- package/build/logging/FactoryLogger.d.mts +3 -4
- package/build/logging/FactoryLogger.d.mts.map +1 -1
- package/build/logging/FieldLogger.cjs.map +1 -1
- package/build/logging/FieldLogger.d.cts +4 -5
- package/build/logging/FieldLogger.d.cts.map +1 -1
- package/build/logging/FieldLogger.d.mts +4 -5
- package/build/logging/FieldLogger.d.mts.map +1 -1
- package/build/logging/FieldLogger.js.map +1 -1
- package/build/logging/ReactionLogger.d.cts +7 -7
- package/build/logging/ReactionLogger.d.cts.map +1 -1
- package/build/logging/ReactionLogger.d.mts +7 -7
- package/build/logging/ReactionLogger.d.mts.map +1 -1
- package/build/newEntity.cjs.map +1 -1
- package/build/newEntity.d.cts +4 -5
- package/build/newEntity.d.cts.map +1 -1
- package/build/newEntity.d.mts +4 -5
- package/build/newEntity.d.mts.map +1 -1
- package/build/newEntity.js.map +1 -1
- package/build/newTestInstance.d.cts +21 -21
- package/build/newTestInstance.d.cts.map +1 -1
- package/build/newTestInstance.d.mts +21 -21
- package/build/newTestInstance.d.mts.map +1 -1
- package/build/normalizeHints.d.cts +7 -8
- package/build/normalizeHints.d.cts.map +1 -1
- package/build/normalizeHints.d.mts +7 -8
- package/build/normalizeHints.d.mts.map +1 -1
- package/build/nowUTC.d.cts +4 -5
- package/build/nowUTC.d.cts.map +1 -1
- package/build/nowUTC.d.mts +4 -5
- package/build/nowUTC.d.mts.map +1 -1
- package/build/plugins/ImmutableEntitiesPlugin.d.cts +1 -2
- package/build/plugins/ImmutableEntitiesPlugin.d.cts.map +1 -1
- package/build/plugins/ImmutableEntitiesPlugin.d.mts +1 -2
- package/build/plugins/ImmutableEntitiesPlugin.d.mts.map +1 -1
- package/build/plugins/PreloadPlugin.d.cts +3 -4
- package/build/plugins/PreloadPlugin.d.cts.map +1 -1
- package/build/plugins/PreloadPlugin.d.mts +3 -4
- package/build/plugins/PreloadPlugin.d.mts.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.cts +1 -2
- package/build/preloading/JsonAggregatePreloader.d.cts.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.mts +1 -2
- package/build/preloading/JsonAggregatePreloader.d.mts.map +1 -1
- package/build/preloading/canPreload.d.cts +1 -2
- package/build/preloading/canPreload.d.cts.map +1 -1
- package/build/preloading/canPreload.d.mts +1 -2
- package/build/preloading/canPreload.d.mts.map +1 -1
- package/build/preloading/partitionHint.d.cts +1 -2
- package/build/preloading/partitionHint.d.cts.map +1 -1
- package/build/preloading/partitionHint.d.mts +1 -2
- package/build/preloading/partitionHint.d.mts.map +1 -1
- package/build/queries/ConditionBuilder.d.cts +2 -2
- package/build/queries/ConditionBuilder.d.cts.map +1 -1
- package/build/queries/ConditionBuilder.d.mts +2 -2
- package/build/queries/ConditionBuilder.d.mts.map +1 -1
- package/build/queries/conditions.d.cts +11 -12
- package/build/queries/conditions.d.cts.map +1 -1
- package/build/queries/conditions.d.mts +11 -12
- package/build/queries/conditions.d.mts.map +1 -1
- package/build/queries/entityQueryUtils.d.cts +4 -5
- package/build/queries/entityQueryUtils.d.cts.map +1 -1
- package/build/queries/entityQueryUtils.d.mts +4 -5
- package/build/queries/entityQueryUtils.d.mts.map +1 -1
- package/build/queries/find/Aliases.d.cts +16 -16
- package/build/queries/find/Aliases.d.cts.map +1 -1
- package/build/queries/find/Aliases.d.mts +16 -16
- package/build/queries/find/Aliases.d.mts.map +1 -1
- package/build/queries/find/DeferredAlias.d.cts +5 -6
- package/build/queries/find/DeferredAlias.d.cts.map +1 -1
- package/build/queries/find/DeferredAlias.d.mts +5 -6
- package/build/queries/find/DeferredAlias.d.mts.map +1 -1
- package/build/queries/find/EntityFilter.d.cts +12 -13
- package/build/queries/find/EntityFilter.d.cts.map +1 -1
- package/build/queries/find/EntityFilter.d.mts +12 -13
- package/build/queries/find/EntityFilter.d.mts.map +1 -1
- package/build/queries/find/EntityGraphQLFilter.d.cts +8 -9
- package/build/queries/find/EntityGraphQLFilter.d.cts.map +1 -1
- package/build/queries/find/EntityGraphQLFilter.d.mts +8 -9
- package/build/queries/find/EntityGraphQLFilter.d.mts.map +1 -1
- package/build/queries/find/QueryParser.collectionJoins.d.cts +1 -2
- package/build/queries/find/QueryParser.collectionJoins.d.cts.map +1 -1
- package/build/queries/find/QueryParser.collectionJoins.d.mts +1 -2
- package/build/queries/find/QueryParser.collectionJoins.d.mts.map +1 -1
- package/build/queries/find/QueryParser.d.cts +18 -18
- package/build/queries/find/QueryParser.d.cts.map +1 -1
- package/build/queries/find/QueryParser.d.mts +18 -18
- package/build/queries/find/QueryParser.d.mts.map +1 -1
- package/build/queries/find/QueryParser.pruning.d.cts +2 -3
- package/build/queries/find/QueryParser.pruning.d.cts.map +1 -1
- package/build/queries/find/QueryParser.pruning.d.mts +2 -3
- package/build/queries/find/QueryParser.pruning.d.mts.map +1 -1
- package/build/queries/find/QueryVisitor.d.cts +4 -4
- package/build/queries/find/QueryVisitor.d.cts.map +1 -1
- package/build/queries/find/QueryVisitor.d.mts +4 -4
- package/build/queries/find/QueryVisitor.d.mts.map +1 -1
- package/build/queries/find/buildFindQuery.d.cts +3 -3
- package/build/queries/find/buildFindQuery.d.cts.map +1 -1
- package/build/queries/find/buildFindQuery.d.mts +3 -3
- package/build/queries/find/buildFindQuery.d.mts.map +1 -1
- package/build/queries/find/scopes.cjs.map +1 -1
- package/build/queries/find/scopes.d.cts +12 -13
- package/build/queries/find/scopes.d.cts.map +1 -1
- package/build/queries/find/scopes.d.mts +12 -13
- package/build/queries/find/scopes.d.mts.map +1 -1
- package/build/queries/find/scopes.js.map +1 -1
- package/build/queries/parsedConditions.d.cts +7 -8
- package/build/queries/parsedConditions.d.cts.map +1 -1
- package/build/queries/parsedConditions.d.mts +7 -8
- package/build/queries/parsedConditions.d.mts.map +1 -1
- package/build/queries/renderConditions.d.cts +3 -4
- package/build/queries/renderConditions.d.cts.map +1 -1
- package/build/queries/renderConditions.d.mts +3 -4
- package/build/queries/renderConditions.d.mts.map +1 -1
- package/build/queries/skipCondition.d.cts +1 -2
- package/build/queries/skipCondition.d.cts.map +1 -1
- package/build/queries/skipCondition.d.mts +1 -2
- package/build/queries/skipCondition.d.mts.map +1 -1
- package/build/queries/sql/AliasAssigner.cjs.map +1 -1
- package/build/queries/sql/AliasAssigner.d.cts +1 -2
- package/build/queries/sql/AliasAssigner.d.cts.map +1 -1
- package/build/queries/sql/AliasAssigner.d.mts +1 -2
- package/build/queries/sql/AliasAssigner.d.mts.map +1 -1
- package/build/queries/sql/AliasAssigner.js.map +1 -1
- package/build/queries/sql/Expr.d.cts +26 -27
- package/build/queries/sql/Expr.d.cts.map +1 -1
- package/build/queries/sql/Expr.d.mts +26 -27
- package/build/queries/sql/Expr.d.mts.map +1 -1
- package/build/queries/sql/JoinTree.d.cts +5 -5
- package/build/queries/sql/JoinTree.d.cts.map +1 -1
- package/build/queries/sql/JoinTree.d.mts +5 -5
- package/build/queries/sql/JoinTree.d.mts.map +1 -1
- package/build/queries/sql/Tables.d.cts +39 -39
- package/build/queries/sql/Tables.d.cts.map +1 -1
- package/build/queries/sql/Tables.d.mts +39 -39
- package/build/queries/sql/Tables.d.mts.map +1 -1
- package/build/queries/sql/custom.d.cts +14 -14
- package/build/queries/sql/custom.d.cts.map +1 -1
- package/build/queries/sql/custom.d.mts +14 -14
- package/build/queries/sql/custom.d.mts.map +1 -1
- package/build/queries/sql/execute.d.cts +15 -15
- package/build/queries/sql/execute.d.cts.map +1 -1
- package/build/queries/sql/execute.d.mts +15 -15
- package/build/queries/sql/execute.d.mts.map +1 -1
- package/build/queries/sql/expressions/arrayAgg.d.cts +5 -6
- package/build/queries/sql/expressions/arrayAgg.d.cts.map +1 -1
- package/build/queries/sql/expressions/arrayAgg.d.mts +5 -6
- package/build/queries/sql/expressions/arrayAgg.d.mts.map +1 -1
- package/build/queries/sql/expressions/case.d.cts +10 -10
- package/build/queries/sql/expressions/case.d.cts.map +1 -1
- package/build/queries/sql/expressions/case.d.mts +10 -10
- package/build/queries/sql/expressions/case.d.mts.map +1 -1
- package/build/queries/sql/expressions/coalesce.d.cts +5 -6
- package/build/queries/sql/expressions/coalesce.d.cts.map +1 -1
- package/build/queries/sql/expressions/coalesce.d.mts +5 -6
- package/build/queries/sql/expressions/coalesce.d.mts.map +1 -1
- package/build/queries/sql/expressions/codecs.d.cts +1 -2
- package/build/queries/sql/expressions/codecs.d.cts.map +1 -1
- package/build/queries/sql/expressions/codecs.d.mts +1 -2
- package/build/queries/sql/expressions/codecs.d.mts.map +1 -1
- package/build/queries/sql/expressions/expression.d.cts +6 -6
- package/build/queries/sql/expressions/expression.d.cts.map +1 -1
- package/build/queries/sql/expressions/expression.d.mts +6 -6
- package/build/queries/sql/expressions/expression.d.mts.map +1 -1
- package/build/queries/sql/expressions/greatest.d.cts +5 -6
- package/build/queries/sql/expressions/greatest.d.cts.map +1 -1
- package/build/queries/sql/expressions/greatest.d.mts +5 -6
- package/build/queries/sql/expressions/greatest.d.mts.map +1 -1
- package/build/queries/sql/expressions/least.d.cts +5 -6
- package/build/queries/sql/expressions/least.d.cts.map +1 -1
- package/build/queries/sql/expressions/least.d.mts +5 -6
- package/build/queries/sql/expressions/least.d.mts.map +1 -1
- package/build/queries/sql/expressions/nullIf.d.cts +5 -6
- package/build/queries/sql/expressions/nullIf.d.cts.map +1 -1
- package/build/queries/sql/expressions/nullIf.d.mts +5 -6
- package/build/queries/sql/expressions/nullIf.d.mts.map +1 -1
- package/build/queries/sql/expressions/parseExpression.d.cts +5 -6
- package/build/queries/sql/expressions/parseExpression.d.cts.map +1 -1
- package/build/queries/sql/expressions/parseExpression.d.mts +5 -6
- package/build/queries/sql/expressions/parseExpression.d.mts.map +1 -1
- package/build/queries/sql/expressions/types.d.cts +11 -11
- package/build/queries/sql/expressions/types.d.cts.map +1 -1
- package/build/queries/sql/expressions/types.d.mts +11 -11
- package/build/queries/sql/expressions/types.d.mts.map +1 -1
- package/build/queries/sql/keywords.d.cts +4 -5
- package/build/queries/sql/keywords.d.cts.map +1 -1
- package/build/queries/sql/keywords.d.mts +4 -5
- package/build/queries/sql/keywords.d.mts.map +1 -1
- package/build/queries/sql/query.cjs.map +1 -1
- package/build/queries/sql/query.d.cts +67 -67
- package/build/queries/sql/query.d.cts.map +1 -1
- package/build/queries/sql/query.d.mts +67 -67
- package/build/queries/sql/query.d.mts.map +1 -1
- package/build/queries/sql/query.js.map +1 -1
- package/build/queries/unnest.d.cts +2 -3
- package/build/queries/unnest.d.cts.map +1 -1
- package/build/queries/unnest.d.mts +2 -3
- package/build/queries/unnest.d.mts.map +1 -1
- package/build/queries/valueFilters.d.cts +5 -6
- package/build/queries/valueFilters.d.cts.map +1 -1
- package/build/queries/valueFilters.d.mts +5 -6
- package/build/queries/valueFilters.d.mts.map +1 -1
- package/build/reactivity/ReactionsManager.cjs.map +1 -1
- package/build/reactivity/ReactionsManager.d.cts +2 -3
- package/build/reactivity/ReactionsManager.d.cts.map +1 -1
- package/build/reactivity/ReactionsManager.d.mts +2 -3
- package/build/reactivity/ReactionsManager.d.mts.map +1 -1
- package/build/reactivity/ReactionsManager.js.map +1 -1
- package/build/reactivity/reactiveHints.d.cts +18 -18
- package/build/reactivity/reactiveHints.d.cts.map +1 -1
- package/build/reactivity/reactiveHints.d.mts +18 -18
- package/build/reactivity/reactiveHints.d.mts.map +1 -1
- package/build/relations/AbstractPropertyImpl.cjs.map +1 -1
- package/build/relations/AbstractPropertyImpl.d.cts +1 -2
- package/build/relations/AbstractPropertyImpl.d.cts.map +1 -1
- package/build/relations/AbstractPropertyImpl.d.mts +1 -2
- package/build/relations/AbstractPropertyImpl.d.mts.map +1 -1
- package/build/relations/AbstractPropertyImpl.js.map +1 -1
- package/build/relations/AbstractRelationImpl.d.cts +1 -2
- package/build/relations/AbstractRelationImpl.d.cts.map +1 -1
- package/build/relations/AbstractRelationImpl.d.mts +1 -2
- package/build/relations/AbstractRelationImpl.d.mts.map +1 -1
- package/build/relations/AsyncProperty.cjs.map +1 -1
- package/build/relations/AsyncProperty.d.cts +5 -6
- package/build/relations/AsyncProperty.d.cts.map +1 -1
- package/build/relations/AsyncProperty.d.mts +5 -6
- package/build/relations/AsyncProperty.d.mts.map +1 -1
- package/build/relations/AsyncProperty.js.map +1 -1
- package/build/relations/AsyncReactiveField.cjs.map +1 -1
- package/build/relations/AsyncReactiveField.d.cts +4 -5
- package/build/relations/AsyncReactiveField.d.cts.map +1 -1
- package/build/relations/AsyncReactiveField.d.mts +4 -5
- package/build/relations/AsyncReactiveField.d.mts.map +1 -1
- package/build/relations/AsyncReactiveField.js.map +1 -1
- package/build/relations/Collection.d.cts +4 -5
- package/build/relations/Collection.d.cts.map +1 -1
- package/build/relations/Collection.d.mts +4 -5
- package/build/relations/Collection.d.mts.map +1 -1
- package/build/relations/CustomCollection.cjs.map +1 -1
- package/build/relations/CustomCollection.d.cts +3 -4
- package/build/relations/CustomCollection.d.cts.map +1 -1
- package/build/relations/CustomCollection.d.mts +3 -4
- package/build/relations/CustomCollection.d.mts.map +1 -1
- package/build/relations/CustomCollection.js.map +1 -1
- package/build/relations/CustomReference.cjs.map +1 -1
- package/build/relations/CustomReference.d.cts +3 -4
- package/build/relations/CustomReference.d.cts.map +1 -1
- package/build/relations/CustomReference.d.mts +3 -4
- package/build/relations/CustomReference.d.mts.map +1 -1
- package/build/relations/CustomReference.js.map +1 -1
- package/build/relations/EnumCollection.cjs.map +1 -1
- package/build/relations/EnumCollection.d.cts +5 -5
- package/build/relations/EnumCollection.d.cts.map +1 -1
- package/build/relations/EnumCollection.d.mts +5 -5
- package/build/relations/EnumCollection.d.mts.map +1 -1
- package/build/relations/EnumCollection.js.map +1 -1
- package/build/relations/LargeCollection.d.cts +1 -2
- package/build/relations/LargeCollection.d.cts.map +1 -1
- package/build/relations/LargeCollection.d.mts +1 -2
- package/build/relations/LargeCollection.d.mts.map +1 -1
- package/build/relations/LazyField.cjs.map +1 -1
- package/build/relations/LazyField.d.cts +7 -8
- package/build/relations/LazyField.d.cts.map +1 -1
- package/build/relations/LazyField.d.mts +7 -8
- package/build/relations/LazyField.d.mts.map +1 -1
- package/build/relations/LazyField.js.map +1 -1
- package/build/relations/ManyToManyCollection.cjs.map +1 -1
- package/build/relations/ManyToManyCollection.d.cts +2 -3
- package/build/relations/ManyToManyCollection.d.cts.map +1 -1
- package/build/relations/ManyToManyCollection.d.mts +2 -3
- package/build/relations/ManyToManyCollection.d.mts.map +1 -1
- package/build/relations/ManyToManyCollection.js.map +1 -1
- package/build/relations/ManyToManyLargeCollection.d.cts +2 -3
- package/build/relations/ManyToManyLargeCollection.d.cts.map +1 -1
- package/build/relations/ManyToManyLargeCollection.d.mts +2 -3
- package/build/relations/ManyToManyLargeCollection.d.mts.map +1 -1
- package/build/relations/ManyToOneReference.cjs.map +1 -1
- package/build/relations/ManyToOneReference.d.cts +6 -7
- package/build/relations/ManyToOneReference.d.cts.map +1 -1
- package/build/relations/ManyToOneReference.d.mts +6 -7
- package/build/relations/ManyToOneReference.d.mts.map +1 -1
- package/build/relations/ManyToOneReference.js.map +1 -1
- package/build/relations/OneToManyCollection.cjs.map +1 -1
- package/build/relations/OneToManyCollection.d.cts +2 -3
- package/build/relations/OneToManyCollection.d.cts.map +1 -1
- package/build/relations/OneToManyCollection.d.mts +2 -3
- package/build/relations/OneToManyCollection.d.mts.map +1 -1
- package/build/relations/OneToManyCollection.js.map +1 -1
- package/build/relations/OneToManyLargeCollection.cjs.map +1 -1
- package/build/relations/OneToManyLargeCollection.d.cts +2 -3
- package/build/relations/OneToManyLargeCollection.d.cts.map +1 -1
- package/build/relations/OneToManyLargeCollection.d.mts +2 -3
- package/build/relations/OneToManyLargeCollection.d.mts.map +1 -1
- package/build/relations/OneToManyLargeCollection.js.map +1 -1
- package/build/relations/OneToOneReference.cjs.map +1 -1
- package/build/relations/OneToOneReference.d.cts +7 -7
- package/build/relations/OneToOneReference.d.cts.map +1 -1
- package/build/relations/OneToOneReference.d.mts +7 -7
- package/build/relations/OneToOneReference.d.mts.map +1 -1
- package/build/relations/OneToOneReference.js.map +1 -1
- package/build/relations/PolymorphicReference.cjs.map +1 -1
- package/build/relations/PolymorphicReference.d.cts +4 -5
- package/build/relations/PolymorphicReference.d.cts.map +1 -1
- package/build/relations/PolymorphicReference.d.mts +4 -5
- package/build/relations/PolymorphicReference.d.mts.map +1 -1
- package/build/relations/PolymorphicReference.js.map +1 -1
- package/build/relations/PropertySymbols.d.cts +1 -2
- package/build/relations/PropertySymbols.d.cts.map +1 -1
- package/build/relations/PropertySymbols.d.mts +1 -2
- package/build/relations/PropertySymbols.d.mts.map +1 -1
- package/build/relations/ReactiveField.cjs.map +1 -1
- package/build/relations/ReactiveField.d.cts +4 -5
- package/build/relations/ReactiveField.d.cts.map +1 -1
- package/build/relations/ReactiveField.d.mts +4 -5
- package/build/relations/ReactiveField.d.mts.map +1 -1
- package/build/relations/ReactiveField.js.map +1 -1
- package/build/relations/ReactiveGetter.cjs.map +1 -1
- package/build/relations/ReactiveGetter.d.cts +4 -5
- package/build/relations/ReactiveGetter.d.cts.map +1 -1
- package/build/relations/ReactiveGetter.d.mts +4 -5
- package/build/relations/ReactiveGetter.d.mts.map +1 -1
- package/build/relations/ReactiveGetter.js.map +1 -1
- package/build/relations/ReactiveManyToMany.cjs.map +1 -1
- package/build/relations/ReactiveManyToMany.d.cts +4 -5
- package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
- package/build/relations/ReactiveManyToMany.d.mts +4 -5
- package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
- package/build/relations/ReactiveManyToMany.js.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.cjs.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.d.cts +4 -5
- package/build/relations/ReactiveManyToManyOtherSide.d.cts.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.d.mts +4 -5
- package/build/relations/ReactiveManyToManyOtherSide.d.mts.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.js.map +1 -1
- package/build/relations/ReactiveReference.cjs.map +1 -1
- package/build/relations/ReactiveReference.d.cts +5 -6
- package/build/relations/ReactiveReference.d.cts.map +1 -1
- package/build/relations/ReactiveReference.d.mts +5 -6
- package/build/relations/ReactiveReference.d.mts.map +1 -1
- package/build/relations/ReactiveReference.js.map +1 -1
- package/build/relations/ReadOnlyCollection.d.cts +4 -5
- package/build/relations/ReadOnlyCollection.d.cts.map +1 -1
- package/build/relations/ReadOnlyCollection.d.mts +4 -5
- package/build/relations/ReadOnlyCollection.d.mts.map +1 -1
- package/build/relations/RecursiveCollection.cjs.map +1 -1
- package/build/relations/RecursiveCollection.d.cts +10 -10
- package/build/relations/RecursiveCollection.d.cts.map +1 -1
- package/build/relations/RecursiveCollection.d.mts +10 -10
- package/build/relations/RecursiveCollection.d.mts.map +1 -1
- package/build/relations/RecursiveCollection.js.map +1 -1
- package/build/relations/RecursiveCycleError.d.cts +2 -2
- package/build/relations/RecursiveCycleError.d.cts.map +1 -1
- package/build/relations/RecursiveCycleError.d.mts +2 -2
- package/build/relations/RecursiveCycleError.d.mts.map +1 -1
- package/build/relations/Reference.d.cts +5 -5
- package/build/relations/Reference.d.cts.map +1 -1
- package/build/relations/Reference.d.mts +5 -5
- package/build/relations/Reference.d.mts.map +1 -1
- package/build/relations/ReferenceSymbols.d.cts +1 -2
- package/build/relations/ReferenceSymbols.d.cts.map +1 -1
- package/build/relations/ReferenceSymbols.d.mts +1 -2
- package/build/relations/ReferenceSymbols.d.mts.map +1 -1
- package/build/relations/Relation.d.cts +3 -3
- package/build/relations/Relation.d.cts.map +1 -1
- package/build/relations/Relation.d.mts +3 -3
- package/build/relations/Relation.d.mts.map +1 -1
- package/build/relations/RelationSymbols.d.cts +2 -3
- package/build/relations/RelationSymbols.d.cts.map +1 -1
- package/build/relations/RelationSymbols.d.mts +2 -3
- package/build/relations/RelationSymbols.d.mts.map +1 -1
- package/build/relations/hasAsyncMethod.cjs.map +1 -1
- package/build/relations/hasAsyncMethod.d.cts +6 -6
- package/build/relations/hasAsyncMethod.d.cts.map +1 -1
- package/build/relations/hasAsyncMethod.d.mts +6 -6
- package/build/relations/hasAsyncMethod.d.mts.map +1 -1
- package/build/relations/hasAsyncMethod.js.map +1 -1
- package/build/relations/hasManyDerived.d.cts +2 -2
- package/build/relations/hasManyDerived.d.cts.map +1 -1
- package/build/relations/hasManyDerived.d.mts +2 -2
- package/build/relations/hasManyDerived.d.mts.map +1 -1
- package/build/relations/hasManyThrough.d.cts +1 -2
- package/build/relations/hasManyThrough.d.cts.map +1 -1
- package/build/relations/hasManyThrough.d.mts +1 -2
- package/build/relations/hasManyThrough.d.mts.map +1 -1
- package/build/relations/hasOneDerived.d.cts +1 -2
- package/build/relations/hasOneDerived.d.cts.map +1 -1
- package/build/relations/hasOneDerived.d.mts +1 -2
- package/build/relations/hasOneDerived.d.mts.map +1 -1
- package/build/relations/hasOneThrough.d.cts +1 -2
- package/build/relations/hasOneThrough.d.cts.map +1 -1
- package/build/relations/hasOneThrough.d.mts +1 -2
- package/build/relations/hasOneThrough.d.mts.map +1 -1
- package/build/relations/hasProperty.cjs.map +1 -1
- package/build/relations/hasProperty.d.cts +8 -8
- package/build/relations/hasProperty.d.cts.map +1 -1
- package/build/relations/hasProperty.d.mts +8 -8
- package/build/relations/hasProperty.d.mts.map +1 -1
- package/build/relations/hasProperty.js.map +1 -1
- package/build/relations/isCascadeDelete.d.cts +1 -2
- package/build/relations/isCascadeDelete.d.cts.map +1 -1
- package/build/relations/isCascadeDelete.d.mts +1 -2
- package/build/relations/isCascadeDelete.d.mts.map +1 -1
- package/build/resurrection.d.cts +3 -4
- package/build/resurrection.d.cts.map +1 -1
- package/build/resurrection.d.mts +3 -4
- package/build/resurrection.d.mts.map +1 -1
- package/build/rules.d.cts +20 -20
- package/build/rules.d.cts.map +1 -1
- package/build/rules.d.mts +20 -20
- package/build/rules.d.mts.map +1 -1
- package/build/runtimeConfig.d.cts +4 -5
- package/build/runtimeConfig.d.cts.map +1 -1
- package/build/runtimeConfig.d.mts +4 -5
- package/build/runtimeConfig.d.mts.map +1 -1
- package/build/serde/TypeInfo.d.cts +3 -4
- package/build/serde/TypeInfo.d.cts.map +1 -1
- package/build/serde/TypeInfo.d.mts +3 -4
- package/build/serde/TypeInfo.d.mts.map +1 -1
- package/build/serde/columns.d.cts +2 -3
- package/build/serde/columns.d.cts.map +1 -1
- package/build/serde/columns.d.mts +2 -3
- package/build/serde/columns.d.mts.map +1 -1
- package/build/serde/fieldSerde.d.cts +9 -9
- package/build/serde/fieldSerde.d.cts.map +1 -1
- package/build/serde/fieldSerde.d.mts +9 -9
- package/build/serde/fieldSerde.d.mts.map +1 -1
- package/build/serde/serde.d.cts +18 -19
- package/build/serde/serde.d.cts.map +1 -1
- package/build/serde/serde.d.mts +18 -19
- package/build/serde/serde.d.mts.map +1 -1
- package/build/serde/temporal.d.cts +5 -5
- package/build/serde/temporal.d.cts.map +1 -1
- package/build/serde/temporal.d.mts +5 -5
- package/build/serde/temporal.d.mts.map +1 -1
- package/build/serde/temporalMappers.d.cts +4 -5
- package/build/serde/temporalMappers.d.cts.map +1 -1
- package/build/serde/temporalMappers.d.mts +4 -5
- package/build/serde/temporalMappers.d.mts.map +1 -1
- package/build/transitions.d.cts +17 -18
- package/build/transitions.d.cts.map +1 -1
- package/build/transitions.d.mts +17 -18
- package/build/transitions.d.mts.map +1 -1
- package/build/trusted.d.cts +2 -3
- package/build/trusted.d.cts.map +1 -1
- package/build/trusted.d.mts +2 -3
- package/build/trusted.d.mts.map +1 -1
- package/build/typeMap.d.cts +17 -17
- package/build/typeMap.d.cts.map +1 -1
- package/build/typeMap.d.mts +17 -17
- package/build/typeMap.d.mts.map +1 -1
- package/build/upsert.d.cts +4 -4
- package/build/upsert.d.cts.map +1 -1
- package/build/upsert.d.mts +4 -4
- package/build/upsert.d.mts.map +1 -1
- package/build/utils.d.cts +27 -28
- package/build/utils.d.cts.map +1 -1
- package/build/utils.d.mts +27 -28
- package/build/utils.d.mts.map +1 -1
- package/package.json +4 -4
package/build/defaults.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","names":["#loadHint","#deps","#deferreds"],"sources":["../src/defaults.ts"],"sourcesContent":["import { Deferred } from \"joist-utils\";\nimport { getInstanceData } from \"src/BaseEntity.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport {\n type EntityMetadata,\n type EnumField,\n type Field,\n type PrimitiveField,\n getBaseAndSelfMetas,\n getMetadata,\n} from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport { normalizeHint } from \"src/normalizeHints.ts\";\nimport { type ReactiveHint, convertToLoadHint } from \"src/reactivity/reactiveHints.ts\";\nimport { isLoadedReference } from \"src/relations/index.ts\";\nimport { runInTrustedContext } from \"src/trusted.ts\";\nimport { fail, failIfAnyRejected } from \"src/utils.ts\";\n\nexport function hasDefaultValue(meta: EntityMetadata, fieldName: string): boolean {\n return getBaseAndSelfMetas(meta).some(\n (m) => fieldName in m.config.__data.syncDefaults || fieldName in m.config.__data.asyncDefaults,\n );\n}\n\n/** Run the sync defaults for `entity`. */\nexport function setSyncDefaults(entity: Entity): void {\n return runInTrustedContext(() => {\n const meta = getMetadata(entity);\n // Allow subtypes to override base setDefaults\n const syncDefaults: Record<string, any> = getBaseAndSelfMetas(meta).reduce(\n (acc, m) => ({ ...acc, ...m.config.__data.syncDefaults }),\n {},\n );\n for (const [fieldName, maybeFn] of Object.entries(syncDefaults)) {\n const field = meta.allFields[fieldName];\n // Use allFields in case a subtype sets a default for one of its base fields\n if (\n (field.kind === \"primitive\" || field.kind === \"enum\") &&\n (field as PrimitiveField | EnumField).derived === \"async\"\n ) {\n // If this is an AsyncReactiveField, we want to push in a default, but setOpts is called\n // from the codegen constructor, so the user-defined `hasAsyncReactiveField` fields will\n // not have been initialized yet (i.e. `entity[field]` will be undefined and not yet an\n // `instanceof AsyncReactiveField`). Thankfully we can just use setField.\n const value = maybeFn instanceof Function ? maybeFn(entity) : maybeFn;\n setField(entity, fieldName, value);\n } else if (!isRelation(field)) {\n const hasBeenSet = fieldName in getInstanceData(entity).data;\n if (!hasBeenSet) {\n const value = maybeFn instanceof Function ? maybeFn(entity) : maybeFn;\n // If the value is undefined, leave it unset, so that a default invoked during\n // the constructor being called (before any other opts are set) can be called\n // again during `em.flush` and get an opportunity to observe other fields.\n if (value !== undefined) {\n (entity as any)[fieldName] = value;\n }\n }\n } else {\n const value = (entity as any)[fieldName];\n if (isLoadedReference(value) && !value.isSet && !value.hasBeenSet) {\n // A sync default usually would never be for a reference, because reference defaults usually\n // require a field hint (so would be async) to get \"the other entity\". However, something like:\n // `config.setDefault(\"original\", (self) => self);` is technically valid.\n value.set(maybeFn instanceof Function ? maybeFn(entity) : maybeFn);\n }\n }\n }\n });\n}\n\n/** Runs the async defaults for all inserted entities in `todos`. */\nexport async function setAsyncDefaults(\n suppressedTypeErrors: Error[],\n ctx: unknown,\n // We want this to be per-subtype, so that a subtype can have its own default, and we still invoke\n // the subtype `setOnEntities(...all subtype entities...)` and `setOnEntities(...any base types...)`\n // as bulk calls.\n insertsBySubType: Map<EntityMetadata, Entity[]>,\n): Promise<void> {\n return runInTrustedContext(async () => {\n const dt = new DependencyTracker(insertsBySubType);\n const results = await Promise.allSettled(\n [...insertsBySubType.entries()].flatMap(([meta, inserts]) => {\n // configure will have copy/pasted base defaults into our config, so we can loop over it directly\n return Object.values(meta.config.__data.asyncDefaults).map((df) =>\n df.setOnEntities(ctx, dt, suppressedTypeErrors, meta, inserts),\n );\n }),\n );\n failIfAnyRejected(results);\n });\n}\n\n/** Sets async defaults *synchronously*, only safe for factories with `DeepNew` entities. */\nexport function setAsyncDefaultsSynchronously(ctx: unknown, entity: Entity): void {\n return runInTrustedContext(() => {\n // configure will have copy/pasted base defaults into our config, so we can loop over it directly\n for (const df of Object.values(getMetadata(entity).config.__data.asyncDefaults)) {\n df.setOnFactoryEntity(ctx, entity);\n }\n });\n}\n\n/** Wraps the hint + lambda of an async `setDefault`. */\nexport class AsyncDefault<T extends Entity> {\n readonly fieldName: string;\n readonly fieldHint: ReactiveHint<T>;\n readonly fn: (entity: any, ctx: any) => any;\n #loadHint: any;\n // We can't calc this until post-boot because it requires following metadata\n #deps: DefaultDependency[] | undefined;\n\n constructor(fieldName: string, fieldHint: ReactiveHint<T>, fn: (entity: T, ctx: any) => any) {\n this.fieldName = fieldName;\n this.fieldHint = fieldHint;\n this.fn = fn;\n }\n\n /** Given a list of inserts of the same type/subtype, set ourselves on each of them. */\n async setOnEntities(\n ctx: any,\n dt: DependencyTracker,\n suppressedTypeErrors: Error[],\n baseMetadata: EntityMetadata,\n inserts: T[],\n ): Promise<any> {\n try {\n // Ensure our dependencies have been set\n // (...and only wait on dependencies that are actively being calculated)\n const deps = this.deps(baseMetadata).filter((dep) => dt.hasMaybePending(dep.meta));\n if (deps.length > 0) {\n // console.log(\n // \"WAITING ON\",\n // deps.map((dep) => `${dep.meta.type}.${dep.fieldName}`),\n // `FOR ${baseMetadata.type}.${this.fieldName}`,\n // );\n // deps promises shouldn't reject, so we should be fine w/o allSettled here\n await Promise.all(deps.map((dep) => dt.getDeferred(dep.meta, dep.fieldName).promise));\n }\n\n // Run our default for all entities, use allSettled to avoid leaving lambdas running if one fails\n const results = await Promise.allSettled(\n inserts\n .map(async (entity) => {\n if (!isRelation(baseMetadata.allFields[this.fieldName])) {\n const hasBeenSet = this.fieldName in getInstanceData(entity).data;\n if (!hasBeenSet) {\n const value = await this.getValue(entity, ctx);\n if (value !== undefined) {\n (entity as any)[this.fieldName] = value;\n }\n }\n } else {\n const value = (entity as any)[this.fieldName];\n if (isLoadedReference(value) && !value.isSet && !value.hasBeenSet) {\n const val = await this.getValue(entity, ctx);\n if (val !== undefined) {\n value.set(val);\n }\n }\n }\n })\n .map((promise) =>\n promise.catch((reason) => {\n // If we NPE-d because a required field wasn't set, hold on to this and\n // let the validation failures reject the `em.flush` instead of us\n if (reason instanceof TypeError) {\n suppressedTypeErrors.push(reason);\n } else {\n throw reason;\n }\n }),\n ),\n );\n failIfAnyRejected(results);\n } finally {\n // Mark ourselves as complete (from a `finally` just in case our `setDefault`\n // blows up, we don't forever block the other defaults waiting on us).\n // console.log(`FINISHED ${baseMetadata.type}.${this.fieldName}`);\n dt.getDeferred(baseMetadata, this.fieldName).resolve();\n }\n }\n\n setOnFactoryEntity(ctx: unknown, entity: T): void {\n // If the lambda uses the `async` keyword, it definitely makes a promise, so don't invoke it\n // from a synchronous factory call.\n if (this.fn.constructor.name === \"AsyncFunction\") return;\n const value = (entity as any)[this.fieldName];\n try {\n if (value === undefined || (isLoadedReference(value) && !value.isSet)) {\n const val = this.fn(entity, ctx);\n // Even though we checked `async () => ...` above, a lambda could still return a Promise\n if (val instanceof Promise) {\n throw new Error(\n `Use the \\`async\\` keyword for the setDefault \"${this.fieldName}\" function that returns a Promise`,\n );\n } else if (val === undefined) {\n // If val is undefined, let the setDefault get invoked again later\n } else {\n if (isLoadedReference(value)) {\n value.set(val);\n } else {\n (entity as any)[this.fieldName] = val;\n }\n }\n }\n } catch (e) {\n // It's likely common to get NPEs/TypeErrors from speculatively executing defaults\n // pre-em.flush, i.e. we don't have the DependencyTracker/etc infra here, the lambdas\n // could do a `book.author.get.name` and NPE on the `author.get.name`. So instead just\n // suppress errors and assume `em.flush` will try again.\n // ...we need to add a NotLoadedError\n // if (!(e instanceof TypeError || e instanceof NotL)) {\n // throw e;\n // }\n }\n }\n\n /** For the given `entity`, returns what the default value should be. */\n private getValue(entity: T, ctx: any): Promise<any> {\n // We can't convert this until now, since it requires the `metadata`\n this.#loadHint ??= convertToLoadHint(getMetadata(entity), this.fieldHint);\n return entity.em.populate(entity, this.#loadHint).then((loaded) => this.fn(loaded, ctx));\n }\n\n // Calc once and cache\n private deps(meta: EntityMetadata): DefaultDependency[] {\n return (this.#deps ??= getDefaultDependencies(meta, this.fieldName, this.fieldHint));\n }\n}\n\ntype DefaultDependency = {\n meta: EntityMetadata;\n fieldName: string;\n};\n\n/**\n * Given a `meta` and a nested field hint, return the meta+field tuples included within the hint.\n *\n * I.e. passing `{ author: { firstName: {}, publisher: \"name\" } }` would return `[[Author, \"firstName\"],\n * [Publisher, \"name\"]]`.\n */\nexport function getDefaultDependencies<T extends Entity>(\n baseMeta: EntityMetadata<T>,\n baseFieldName: string,\n baseHint: ReactiveHint<T>,\n): DefaultDependency[] {\n // Ensure the hint is an `{ ... }`\n const deps: DefaultDependency[] = [];\n const todo: [meta: EntityMetadata, hint: ReactiveHint<any>][] = [[baseMeta, normalizeHint(baseHint)]];\n while (todo.length !== 0) {\n const [meta, hint] = todo.pop()!;\n for (const [fieldName, nestedHint] of Object.entries(hint)) {\n const field = meta.allFields[fieldName];\n // Super naive circular dependency detection\n const isSameField = meta === baseMeta && fieldName === baseFieldName;\n if (isSameField) continue;\n // If this is an invalid hint, just ignore it, and assume someone else will fail on it\n if (!field) continue;\n switch (field.kind) {\n case \"enum\":\n case \"primitive\":\n if (field.default === \"config\" && fieldName in meta.config.__data.asyncDefaults) {\n deps.push({ meta, fieldName });\n }\n break;\n case \"m2o\":\n if (field.default === \"config\" && fieldName in meta.config.__data.asyncDefaults) {\n deps.push({ meta, fieldName });\n }\n if (nestedHint) {\n todo.push([field.otherMetadata(), normalizeHint(nestedHint)]);\n }\n break;\n case \"o2o\":\n case \"o2m\":\n case \"m2m\":\n if (nestedHint) {\n todo.push([field.otherMetadata(), normalizeHint(nestedHint)]);\n }\n break;\n }\n }\n }\n return deps;\n}\n\n/**\n * This tracks cross-default dependencies that are active within a single `em.flush` loop.\n *\n * I.e. this is not a static \"the Author.firstName in general depends on Publisher.whatever\",\n * it tracks that we're actively inserting 10 new `Author` instances, and their `firstName`\n * default needs to wait until the `Publisher.whatever` fields have their async default\n * calculated.\n *\n * Really this is just a smaller wrapper around a map of `Deferred`s.\n */\nclass DependencyTracker {\n // Create a map \"entityType -> fieldName -> deferred\"\n #deferreds = new Map<string, Map<string, Deferred<void>>>();\n\n constructor(insertsBySubType: Map<EntityMetadata, Entity[]>) {\n // Seed it with any entities that we're actively inserting (as any dependencies to\n // entities that aren't even having `setDefault` called can be skipped)\n for (const meta of [...insertsBySubType.keys()]) {\n this.#deferreds.set(meta.type, new Map());\n }\n }\n\n hasMaybePending(meta: EntityMetadata): boolean {\n return this.#deferreds.has(meta.type) ?? false;\n }\n\n getDeferred(meta: EntityMetadata, fieldName: string): Deferred<void> {\n const map = this.#deferreds.get(meta.type) ?? fail(`No deferred check necessary for ${meta.type}.${fieldName}`);\n let deferred = map.get(fieldName);\n if (!deferred) {\n deferred = new Deferred();\n map.set(fieldName, deferred);\n }\n return deferred;\n }\n}\n\nfunction isRelation(field: Field): boolean {\n return field.kind !== \"primitive\" && field.kind !== \"enum\";\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"defaults.js","names":[],"sources":["../src/defaults.ts"],"sourcesContent":["import { Deferred } from \"joist-utils\";\nimport { getInstanceData } from \"src/BaseEntity.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport {\n type EntityMetadata,\n type EnumField,\n type Field,\n type PrimitiveField,\n getBaseAndSelfMetas,\n getMetadata,\n} from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport { normalizeHint } from \"src/normalizeHints.ts\";\nimport { type ReactiveHint, convertToLoadHint } from \"src/reactivity/reactiveHints.ts\";\nimport { isLoadedReference } from \"src/relations/index.ts\";\nimport { runInTrustedContext } from \"src/trusted.ts\";\nimport { fail, failIfAnyRejected } from \"src/utils.ts\";\n\nexport function hasDefaultValue(meta: EntityMetadata, fieldName: string): boolean {\n return getBaseAndSelfMetas(meta).some(\n (m) => fieldName in m.config.__data.syncDefaults || fieldName in m.config.__data.asyncDefaults,\n );\n}\n\n/** Run the sync defaults for `entity`. */\nexport function setSyncDefaults(entity: Entity): void {\n return runInTrustedContext(() => {\n const meta = getMetadata(entity);\n // Allow subtypes to override base setDefaults\n const syncDefaults: Record<string, any> = getBaseAndSelfMetas(meta).reduce(\n (acc, m) => ({ ...acc, ...m.config.__data.syncDefaults }),\n {},\n );\n for (const [fieldName, maybeFn] of Object.entries(syncDefaults)) {\n const field = meta.allFields[fieldName];\n // Use allFields in case a subtype sets a default for one of its base fields\n if (\n (field.kind === \"primitive\" || field.kind === \"enum\") &&\n (field as PrimitiveField | EnumField).derived === \"async\"\n ) {\n // If this is an AsyncReactiveField, we want to push in a default, but setOpts is called\n // from the codegen constructor, so the user-defined `hasAsyncReactiveField` fields will\n // not have been initialized yet (i.e. `entity[field]` will be undefined and not yet an\n // `instanceof AsyncReactiveField`). Thankfully we can just use setField.\n const value = maybeFn instanceof Function ? maybeFn(entity) : maybeFn;\n setField(entity, fieldName, value);\n } else if (!isRelation(field)) {\n const hasBeenSet = fieldName in getInstanceData(entity).data;\n if (!hasBeenSet) {\n const value = maybeFn instanceof Function ? maybeFn(entity) : maybeFn;\n // If the value is undefined, leave it unset, so that a default invoked during\n // the constructor being called (before any other opts are set) can be called\n // again during `em.flush` and get an opportunity to observe other fields.\n if (value !== undefined) {\n (entity as any)[fieldName] = value;\n }\n }\n } else {\n const value = (entity as any)[fieldName];\n if (isLoadedReference(value) && !value.isSet && !value.hasBeenSet) {\n // A sync default usually would never be for a reference, because reference defaults usually\n // require a field hint (so would be async) to get \"the other entity\". However, something like:\n // `config.setDefault(\"original\", (self) => self);` is technically valid.\n value.set(maybeFn instanceof Function ? maybeFn(entity) : maybeFn);\n }\n }\n }\n });\n}\n\n/** Runs the async defaults for all inserted entities in `todos`. */\nexport async function setAsyncDefaults(\n suppressedTypeErrors: Error[],\n ctx: unknown,\n // We want this to be per-subtype, so that a subtype can have its own default, and we still invoke\n // the subtype `setOnEntities(...all subtype entities...)` and `setOnEntities(...any base types...)`\n // as bulk calls.\n insertsBySubType: Map<EntityMetadata, Entity[]>,\n): Promise<void> {\n return runInTrustedContext(async () => {\n const dt = new DependencyTracker(insertsBySubType);\n const results = await Promise.allSettled(\n [...insertsBySubType.entries()].flatMap(([meta, inserts]) => {\n // configure will have copy/pasted base defaults into our config, so we can loop over it directly\n return Object.values(meta.config.__data.asyncDefaults).map((df) =>\n df.setOnEntities(ctx, dt, suppressedTypeErrors, meta, inserts),\n );\n }),\n );\n failIfAnyRejected(results);\n });\n}\n\n/** Sets async defaults *synchronously*, only safe for factories with `DeepNew` entities. */\nexport function setAsyncDefaultsSynchronously(ctx: unknown, entity: Entity): void {\n return runInTrustedContext(() => {\n // configure will have copy/pasted base defaults into our config, so we can loop over it directly\n for (const df of Object.values(getMetadata(entity).config.__data.asyncDefaults)) {\n df.setOnFactoryEntity(ctx, entity);\n }\n });\n}\n\n/** Wraps the hint + lambda of an async `setDefault`. */\nexport class AsyncDefault<T extends Entity> {\n readonly fieldName: string;\n readonly fieldHint: ReactiveHint<T>;\n readonly fn: (entity: any, ctx: any) => any;\n #loadHint: any;\n // We can't calc this until post-boot because it requires following metadata\n #deps: DefaultDependency[] | undefined;\n\n constructor(fieldName: string, fieldHint: ReactiveHint<T>, fn: (entity: T, ctx: any) => any) {\n this.fieldName = fieldName;\n this.fieldHint = fieldHint;\n this.fn = fn;\n }\n\n /** Given a list of inserts of the same type/subtype, set ourselves on each of them. */\n async setOnEntities(\n ctx: any,\n dt: DependencyTracker,\n suppressedTypeErrors: Error[],\n baseMetadata: EntityMetadata,\n inserts: T[],\n ): Promise<any> {\n try {\n // Ensure our dependencies have been set\n // (...and only wait on dependencies that are actively being calculated)\n const deps = this.deps(baseMetadata).filter((dep) => dt.hasMaybePending(dep.meta));\n if (deps.length > 0) {\n // console.log(\n // \"WAITING ON\",\n // deps.map((dep) => `${dep.meta.type}.${dep.fieldName}`),\n // `FOR ${baseMetadata.type}.${this.fieldName}`,\n // );\n // deps promises shouldn't reject, so we should be fine w/o allSettled here\n await Promise.all(deps.map((dep) => dt.getDeferred(dep.meta, dep.fieldName).promise));\n }\n\n // Run our default for all entities, use allSettled to avoid leaving lambdas running if one fails\n const results = await Promise.allSettled(\n inserts\n .map(async (entity) => {\n if (!isRelation(baseMetadata.allFields[this.fieldName])) {\n const hasBeenSet = this.fieldName in getInstanceData(entity).data;\n if (!hasBeenSet) {\n const value = await this.getValue(entity, ctx);\n if (value !== undefined) {\n (entity as any)[this.fieldName] = value;\n }\n }\n } else {\n const value = (entity as any)[this.fieldName];\n if (isLoadedReference(value) && !value.isSet && !value.hasBeenSet) {\n const val = await this.getValue(entity, ctx);\n if (val !== undefined) {\n value.set(val);\n }\n }\n }\n })\n .map((promise) =>\n promise.catch((reason) => {\n // If we NPE-d because a required field wasn't set, hold on to this and\n // let the validation failures reject the `em.flush` instead of us\n if (reason instanceof TypeError) {\n suppressedTypeErrors.push(reason);\n } else {\n throw reason;\n }\n }),\n ),\n );\n failIfAnyRejected(results);\n } finally {\n // Mark ourselves as complete (from a `finally` just in case our `setDefault`\n // blows up, we don't forever block the other defaults waiting on us).\n // console.log(`FINISHED ${baseMetadata.type}.${this.fieldName}`);\n dt.getDeferred(baseMetadata, this.fieldName).resolve();\n }\n }\n\n setOnFactoryEntity(ctx: unknown, entity: T): void {\n // If the lambda uses the `async` keyword, it definitely makes a promise, so don't invoke it\n // from a synchronous factory call.\n if (this.fn.constructor.name === \"AsyncFunction\") return;\n const value = (entity as any)[this.fieldName];\n try {\n if (value === undefined || (isLoadedReference(value) && !value.isSet)) {\n const val = this.fn(entity, ctx);\n // Even though we checked `async () => ...` above, a lambda could still return a Promise\n if (val instanceof Promise) {\n throw new Error(\n `Use the \\`async\\` keyword for the setDefault \"${this.fieldName}\" function that returns a Promise`,\n );\n } else if (val === undefined) {\n // If val is undefined, let the setDefault get invoked again later\n } else {\n if (isLoadedReference(value)) {\n value.set(val);\n } else {\n (entity as any)[this.fieldName] = val;\n }\n }\n }\n } catch (e) {\n // It's likely common to get NPEs/TypeErrors from speculatively executing defaults\n // pre-em.flush, i.e. we don't have the DependencyTracker/etc infra here, the lambdas\n // could do a `book.author.get.name` and NPE on the `author.get.name`. So instead just\n // suppress errors and assume `em.flush` will try again.\n // ...we need to add a NotLoadedError\n // if (!(e instanceof TypeError || e instanceof NotL)) {\n // throw e;\n // }\n }\n }\n\n /** For the given `entity`, returns what the default value should be. */\n private getValue(entity: T, ctx: any): Promise<any> {\n // We can't convert this until now, since it requires the `metadata`\n this.#loadHint ??= convertToLoadHint(getMetadata(entity), this.fieldHint);\n return entity.em.populate(entity, this.#loadHint).then((loaded) => this.fn(loaded, ctx));\n }\n\n // Calc once and cache\n private deps(meta: EntityMetadata): DefaultDependency[] {\n return (this.#deps ??= getDefaultDependencies(meta, this.fieldName, this.fieldHint));\n }\n}\n\ntype DefaultDependency = {\n meta: EntityMetadata;\n fieldName: string;\n};\n\n/**\n * Given a `meta` and a nested field hint, return the meta+field tuples included within the hint.\n *\n * I.e. passing `{ author: { firstName: {}, publisher: \"name\" } }` would return `[[Author, \"firstName\"],\n * [Publisher, \"name\"]]`.\n */\nexport function getDefaultDependencies<T extends Entity>(\n baseMeta: EntityMetadata<T>,\n baseFieldName: string,\n baseHint: ReactiveHint<T>,\n): DefaultDependency[] {\n // Ensure the hint is an `{ ... }`\n const deps: DefaultDependency[] = [];\n const todo: [meta: EntityMetadata, hint: ReactiveHint<any>][] = [[baseMeta, normalizeHint(baseHint)]];\n while (todo.length !== 0) {\n const [meta, hint] = todo.pop()!;\n for (const [fieldName, nestedHint] of Object.entries(hint)) {\n const field = meta.allFields[fieldName];\n // Super naive circular dependency detection\n const isSameField = meta === baseMeta && fieldName === baseFieldName;\n if (isSameField) continue;\n // If this is an invalid hint, just ignore it, and assume someone else will fail on it\n if (!field) continue;\n switch (field.kind) {\n case \"enum\":\n case \"primitive\":\n if (field.default === \"config\" && fieldName in meta.config.__data.asyncDefaults) {\n deps.push({ meta, fieldName });\n }\n break;\n case \"m2o\":\n if (field.default === \"config\" && fieldName in meta.config.__data.asyncDefaults) {\n deps.push({ meta, fieldName });\n }\n if (nestedHint) {\n todo.push([field.otherMetadata(), normalizeHint(nestedHint)]);\n }\n break;\n case \"o2o\":\n case \"o2m\":\n case \"m2m\":\n if (nestedHint) {\n todo.push([field.otherMetadata(), normalizeHint(nestedHint)]);\n }\n break;\n }\n }\n }\n return deps;\n}\n\n/**\n * This tracks cross-default dependencies that are active within a single `em.flush` loop.\n *\n * I.e. this is not a static \"the Author.firstName in general depends on Publisher.whatever\",\n * it tracks that we're actively inserting 10 new `Author` instances, and their `firstName`\n * default needs to wait until the `Publisher.whatever` fields have their async default\n * calculated.\n *\n * Really this is just a smaller wrapper around a map of `Deferred`s.\n */\nclass DependencyTracker {\n // Create a map \"entityType -> fieldName -> deferred\"\n #deferreds = new Map<string, Map<string, Deferred<void>>>();\n\n constructor(insertsBySubType: Map<EntityMetadata, Entity[]>) {\n // Seed it with any entities that we're actively inserting (as any dependencies to\n // entities that aren't even having `setDefault` called can be skipped)\n for (const meta of [...insertsBySubType.keys()]) {\n this.#deferreds.set(meta.type, new Map());\n }\n }\n\n hasMaybePending(meta: EntityMetadata): boolean {\n return this.#deferreds.has(meta.type) ?? false;\n }\n\n getDeferred(meta: EntityMetadata, fieldName: string): Deferred<void> {\n const map = this.#deferreds.get(meta.type) ?? fail(`No deferred check necessary for ${meta.type}.${fieldName}`);\n let deferred = map.get(fieldName);\n if (!deferred) {\n deferred = new Deferred();\n map.set(fieldName, deferred);\n }\n return deferred;\n }\n}\n\nfunction isRelation(field: Field): boolean {\n return field.kind !== \"primitive\" && field.kind !== \"enum\";\n}\n"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { EntityManager } from "../EntityManager.cjs";
|
|
|
9
9
|
*
|
|
10
10
|
* @typeParam TX - the connection library-specific `Transaction` type, i.e. `Knex.Transaction`
|
|
11
11
|
*/
|
|
12
|
-
interface Driver<TX = unknown> {
|
|
12
|
+
export interface Driver<TX = unknown> {
|
|
13
13
|
/** Executes a low-level `ParsedFindQuery` against the database and returns the rows. */
|
|
14
14
|
executeFind(em: EntityManager, parsed: ParsedFindQuery, settings: {
|
|
15
15
|
limit?: number;
|
|
@@ -42,10 +42,9 @@ interface Driver<TX = unknown> {
|
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
/** Raw rows and the database command's affected-row count for mutations or selected-row count for reads. */
|
|
45
|
-
interface DriverQueryResult {
|
|
45
|
+
export interface DriverQueryResult {
|
|
46
46
|
rowCount: number | null;
|
|
47
47
|
rows: any[];
|
|
48
48
|
}
|
|
49
49
|
//#endregion
|
|
50
|
-
export { Driver, DriverQueryResult };
|
|
51
50
|
//# sourceMappingURL=Driver.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Driver.d.cts","names":[],"sources":["../../src/drivers/Driver.ts"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"Driver.d.cts","names":[],"sources":["../../src/drivers/Driver.ts"],"mappings":";;;;;;;;;;;iBAWiB,OAAO;;EAEtB,YACE,IAAI,eACJ,QAAQ,iBACR;IAAY;IAAgB;MAC3B;;;;;;;EAQH,aAAa,IAAI,eAAe,aAAa,kBAAkB,QAAQ;;;;;;;;EASvE,oBACE,IAAI,eACJ,QAAQ,iBACR;IAAY;IAAgB;MAC3B,QAAQ;EAEX,YAAY,GAAG,IAAI,eAAe,KAAK,KAAK,OAAO,QAAQ,KAAK,QAAQ;EAExE,aAAa,IAAI,eAAe,OAAO,eAAe,QAAQ;EAE9D,MAAM,IAAI,eAAe,OAAO,eAAe,OAAO,UAAU,eAAe,eAAe;;EAG9F;IAAkB,gBAAgB;;;;iBAInB;EACf;EACA"}
|
|
@@ -9,7 +9,7 @@ import { EntityManager } from "../EntityManager.mjs";
|
|
|
9
9
|
*
|
|
10
10
|
* @typeParam TX - the connection library-specific `Transaction` type, i.e. `Knex.Transaction`
|
|
11
11
|
*/
|
|
12
|
-
interface Driver<TX = unknown> {
|
|
12
|
+
export interface Driver<TX = unknown> {
|
|
13
13
|
/** Executes a low-level `ParsedFindQuery` against the database and returns the rows. */
|
|
14
14
|
executeFind(em: EntityManager, parsed: ParsedFindQuery, settings: {
|
|
15
15
|
limit?: number;
|
|
@@ -42,10 +42,9 @@ interface Driver<TX = unknown> {
|
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
/** Raw rows and the database command's affected-row count for mutations or selected-row count for reads. */
|
|
45
|
-
interface DriverQueryResult {
|
|
45
|
+
export interface DriverQueryResult {
|
|
46
46
|
rowCount: number | null;
|
|
47
47
|
rows: any[];
|
|
48
48
|
}
|
|
49
49
|
//#endregion
|
|
50
|
-
export { Driver, DriverQueryResult };
|
|
51
50
|
//# sourceMappingURL=Driver.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Driver.d.mts","names":[],"sources":["../../src/drivers/Driver.ts"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"Driver.d.mts","names":[],"sources":["../../src/drivers/Driver.ts"],"mappings":";;;;;;;;;;;iBAWiB,OAAO;;EAEtB,YACE,IAAI,eACJ,QAAQ,iBACR;IAAY;IAAgB;MAC3B;;;;;;;EAQH,aAAa,IAAI,eAAe,aAAa,kBAAkB,QAAQ;;;;;;;;EASvE,oBACE,IAAI,eACJ,QAAQ,iBACR;IAAY;IAAgB;MAC3B,QAAQ;EAEX,YAAY,GAAG,IAAI,eAAe,KAAK,KAAK,OAAO,QAAQ,KAAK,QAAQ;EAExE,aAAa,IAAI,eAAe,OAAO,eAAe,QAAQ;EAE9D,MAAM,IAAI,eAAe,OAAO,eAAe,OAAO,UAAU,eAAe,eAAe;;EAG9F;IAAkB,gBAAgB;;;;iBAInB;EACf;EACA"}
|
|
@@ -2,12 +2,12 @@ import { Todo } from "../flush/Todo.cjs";
|
|
|
2
2
|
import { Entity } from "../Entity.cjs";
|
|
3
3
|
//#region src/drivers/EntityWriter.d.ts
|
|
4
4
|
/** A simplified view of columns, with only the keys necessary to create SQL statements. */
|
|
5
|
-
type OpColumn = {
|
|
5
|
+
export type OpColumn = {
|
|
6
6
|
columnName: string;
|
|
7
7
|
dbType: string;
|
|
8
8
|
isNullableArray?: boolean;
|
|
9
9
|
};
|
|
10
|
-
type InsertOp = {
|
|
10
|
+
export type InsertOp = {
|
|
11
11
|
tableName: string;
|
|
12
12
|
columns: OpColumn[];
|
|
13
13
|
columnValues: any[][];
|
|
@@ -20,13 +20,13 @@ type InsertOp = {
|
|
|
20
20
|
* (with respective pre-update values in the `rows` data), for including in the conditional
|
|
21
21
|
* update clause.
|
|
22
22
|
*/
|
|
23
|
-
type UpdateOp = {
|
|
23
|
+
export type UpdateOp = {
|
|
24
24
|
tableName: string;
|
|
25
25
|
columns: OpColumn[];
|
|
26
26
|
columnValues: any[][];
|
|
27
27
|
updatedAt: string | undefined;
|
|
28
28
|
};
|
|
29
|
-
type DeleteOp = {
|
|
29
|
+
export type DeleteOp = {
|
|
30
30
|
tableName: string;
|
|
31
31
|
ids: any[];
|
|
32
32
|
};
|
|
@@ -42,7 +42,7 @@ type Ops = {
|
|
|
42
42
|
* I.e. `INSERT author.favorite_book_id` as `NULL` and then later do an `UPDATE author
|
|
43
43
|
* SET favorite_book_id = 1` after the book has been inserted/we have the id.
|
|
44
44
|
*/
|
|
45
|
-
type InsertFixup = {
|
|
45
|
+
export type InsertFixup = {
|
|
46
46
|
entity: Entity;
|
|
47
47
|
tableName: string;
|
|
48
48
|
column: OpColumn;
|
|
@@ -60,7 +60,7 @@ type InsertFixup = {
|
|
|
60
60
|
*
|
|
61
61
|
* But this should let us experiment with knex vs. raw client/etc.
|
|
62
62
|
*/
|
|
63
|
-
declare function generateOps(todos: Record<string, Todo>): Ops;
|
|
63
|
+
export declare function generateOps(todos: Record<string, Todo>): Ops;
|
|
64
64
|
//#endregion
|
|
65
|
-
export {
|
|
65
|
+
export {};
|
|
66
66
|
//# sourceMappingURL=EntityWriter.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityWriter.d.cts","names":[],"sources":["../../src/drivers/EntityWriter.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"EntityWriter.d.cts","names":[],"sources":["../../src/drivers/EntityWriter.ts"],"mappings":";;;;YAiBY;EAAa;EAAoB;EAAgB;;YACjD;EAAa;EAAmB,SAAS;EAAY;;;;;;;;;;YASrD;EACV;EACA,SAAS;EACT;EACA;;YAEU;EAAa;EAAmB;;KAEvC;EAAQ,SAAS;EAAY,SAAS;EAAY,SAAS;;;;;;;;;YASpD;EACV,QAAQ;EACR;EACA,QAAQ;EACR;;;;;;;;;;;;;;wBAec,YAAY,OAAO,eAAe,QAAQ"}
|
|
@@ -2,12 +2,12 @@ import { Todo } from "../flush/Todo.mjs";
|
|
|
2
2
|
import { Entity } from "../Entity.mjs";
|
|
3
3
|
//#region src/drivers/EntityWriter.d.ts
|
|
4
4
|
/** A simplified view of columns, with only the keys necessary to create SQL statements. */
|
|
5
|
-
type OpColumn = {
|
|
5
|
+
export type OpColumn = {
|
|
6
6
|
columnName: string;
|
|
7
7
|
dbType: string;
|
|
8
8
|
isNullableArray?: boolean;
|
|
9
9
|
};
|
|
10
|
-
type InsertOp = {
|
|
10
|
+
export type InsertOp = {
|
|
11
11
|
tableName: string;
|
|
12
12
|
columns: OpColumn[];
|
|
13
13
|
columnValues: any[][];
|
|
@@ -20,13 +20,13 @@ type InsertOp = {
|
|
|
20
20
|
* (with respective pre-update values in the `rows` data), for including in the conditional
|
|
21
21
|
* update clause.
|
|
22
22
|
*/
|
|
23
|
-
type UpdateOp = {
|
|
23
|
+
export type UpdateOp = {
|
|
24
24
|
tableName: string;
|
|
25
25
|
columns: OpColumn[];
|
|
26
26
|
columnValues: any[][];
|
|
27
27
|
updatedAt: string | undefined;
|
|
28
28
|
};
|
|
29
|
-
type DeleteOp = {
|
|
29
|
+
export type DeleteOp = {
|
|
30
30
|
tableName: string;
|
|
31
31
|
ids: any[];
|
|
32
32
|
};
|
|
@@ -42,7 +42,7 @@ type Ops = {
|
|
|
42
42
|
* I.e. `INSERT author.favorite_book_id` as `NULL` and then later do an `UPDATE author
|
|
43
43
|
* SET favorite_book_id = 1` after the book has been inserted/we have the id.
|
|
44
44
|
*/
|
|
45
|
-
type InsertFixup = {
|
|
45
|
+
export type InsertFixup = {
|
|
46
46
|
entity: Entity;
|
|
47
47
|
tableName: string;
|
|
48
48
|
column: OpColumn;
|
|
@@ -60,7 +60,7 @@ type InsertFixup = {
|
|
|
60
60
|
*
|
|
61
61
|
* But this should let us experiment with knex vs. raw client/etc.
|
|
62
62
|
*/
|
|
63
|
-
declare function generateOps(todos: Record<string, Todo>): Ops;
|
|
63
|
+
export declare function generateOps(todos: Record<string, Todo>): Ops;
|
|
64
64
|
//#endregion
|
|
65
|
-
export {
|
|
65
|
+
export {};
|
|
66
66
|
//# sourceMappingURL=EntityWriter.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityWriter.d.mts","names":[],"sources":["../../src/drivers/EntityWriter.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"EntityWriter.d.mts","names":[],"sources":["../../src/drivers/EntityWriter.ts"],"mappings":";;;;YAiBY;EAAa;EAAoB;EAAgB;;YACjD;EAAa;EAAmB,SAAS;EAAY;;;;;;;;;;YASrD;EACV;EACA,SAAS;EACT;EACA;;YAEU;EAAa;EAAmB;;KAEvC;EAAQ,SAAS;EAAY,SAAS;EAAY,SAAS;;;;;;;;;YASpD;EACV,QAAQ;EACR;EACA,QAAQ;EACR;;;;;;;;;;;;;;wBAec,YAAY,OAAO,eAAe,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdAssigner.cjs","names":["
|
|
1
|
+
{"version":3,"file":"IdAssigner.cjs","names":["keyToTaggedId"],"sources":["../../src/drivers/IdAssigner.ts"],"sourcesContent":["import * as crypto from \"crypto\";\n\nimport { getInstanceData } from \"src/BaseEntity.ts\";\nimport type { Todo } from \"src/flush/Todo.ts\";\nimport { keyToTaggedId } from \"src/keys.ts\";\n\nexport interface IdAssigner {\n assignNewIds(todos: Record<string, Todo>): Promise<void>;\n}\n\n/** Super-small/dumb wrapper around maybe-Knex/maybe-postgres.js/maybe-Bun-sql libraries. */\ntype QueryRunner = (sql: string) => Promise<any[]>;\n\n/**\n * Assigns all new entities an id directly from their corresponding sequence generator, instead of via INSERTs.\n *\n * This lets us avoid cyclic issues with some INSERTs having foreign keys to other rows that themselves\n * need to first be INSERTed.\n */\nexport class SequenceIdAssigner implements IdAssigner {\n #runner: QueryRunner;\n\n public constructor(runner: QueryRunner) {\n this.#runner = runner;\n }\n\n async assignNewIds(todos: Record<string, Todo>): Promise<void> {\n const seqStatements: string[] = [];\n Object.values(todos).forEach((todo) => {\n // Even if we have INSERTs, the user may have already assigned ids...\n const needsIds = todo.inserts.filter((e) => e.idMaybe === undefined);\n if (needsIds.length > 0) {\n const sequenceName = `${todo.metadata.tableName}_id_seq`;\n const sql = `select nextval('${sequenceName}') from generate_series(1, ${needsIds.length})`;\n seqStatements.push(sql);\n }\n });\n if (seqStatements.length > 0) {\n // There will be 1 per table; 1 single insert should be fine but we might need to batch for super-large schemas?\n const sql = seqStatements.join(\" UNION ALL \");\n const result = await this.#runner(sql);\n let i = 0;\n Object.values(todos).forEach((todo) => {\n for (const insert of todo.inserts.filter((e) => e.idMaybe === undefined)) {\n // Use todo.metadata so that all subtypes get their base type's tag\n getInstanceData(insert).data[\"id\"] = keyToTaggedId(todo.metadata, result[i++][\"nextval\"]);\n }\n });\n }\n }\n}\n\n/**\n * Creates random UUIDs for uuid-based keys in production environments.\n *\n * See {@link TestUuidAssigner} for creating stable-ish ids for tests\n */\nexport class RandomUuidAssigner implements IdAssigner {\n async assignNewIds(todos: Record<string, Todo>): Promise<void> {\n Object.values(todos).forEach((todo) => {\n for (const insert of todo.inserts) {\n getInstanceData(insert).data[\"id\"] = keyToTaggedId(todo.metadata, crypto.randomUUID());\n }\n });\n }\n}\n\n/**\n * Creates deterministic / stable-ish UUIDs for test suites.\n *\n * We use each entity's tag as the 3rd group of digits, and a per-entity incrementing integer as\n * the 4th group of digits.\n *\n * E.g. a test with two Authors (tag `a`) and three Books (tag `b`) will get these ids:\n *\n * ```\n * 00000000-0000-0000-000a-000000000000\n * 00000000-0000-0000-000a-000000000001\n * 00000000-0000-0000-000b-000000000000\n * 00000000-0000-0000-000b-000000000001\n * 00000000-0000-0000-000b-000000000002\n * ```\n */\nexport class TestUuidAssigner implements IdAssigner {\n private nextId: Record<string, number> = {};\n\n async assignNewIds(todos: Record<string, Todo>): Promise<void> {\n Object.entries(todos).forEach(([, todo]) => {\n if (todo.inserts.length > 0) {\n const tag = todo.metadata.tagName.substring(0, 4).padStart(4, \"0\");\n this.nextId[tag] ??= 0;\n for (const insert of todo.inserts) {\n const id = String(this.nextId[tag]++);\n const uuid = `00000000-0000-0000-${tag}-${id.padStart(12, \"0\")}`;\n getInstanceData(insert).data[\"id\"] = keyToTaggedId(todo.metadata, uuid);\n }\n }\n });\n }\n\n reset() {\n this.nextId = {};\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAmBA,IAAa,qBAAb,MAAsD;CACpD;CAEA,YAAmB,QAAqB;EACtC,KAAK,UAAU;CACjB;CAEA,MAAM,aAAa,OAA4C;EAC7D,MAAM,gBAA0B,CAAC;EACjC,OAAO,OAAO,KAAK,CAAC,CAAC,SAAS,SAAS;GAErC,MAAM,WAAW,KAAK,QAAQ,QAAQ,MAAM,EAAE,YAAY,KAAA,CAAS;GACnE,IAAI,SAAS,SAAS,GAAG;IAEvB,MAAM,MAAM,mBAAmB,GADP,KAAK,SAAS,UAAU,SACJ,6BAA6B,SAAS,OAAO;IACzF,cAAc,KAAK,GAAG;GACxB;EACF,CAAC;EACD,IAAI,cAAc,SAAS,GAAG;GAE5B,MAAM,MAAM,cAAc,KAAK,aAAa;GAC5C,MAAM,SAAS,MAAM,KAAK,QAAQ,GAAG;GACrC,IAAI,IAAI;GACR,OAAO,OAAO,KAAK,CAAC,CAAC,SAAS,SAAS;IACrC,KAAK,MAAM,UAAU,KAAK,QAAQ,QAAQ,MAAM,EAAE,YAAY,KAAA,CAAS,GAErE,mBAAA,gBAAgB,MAAM,CAAC,CAAC,KAAK,QAAQA,aAAAA,cAAc,KAAK,UAAU,OAAO,IAAI,CAAC,UAAU;GAE5F,CAAC;EACH;CACF;AACF;;;;;;AAOA,IAAa,qBAAb,MAAsD;CACpD,MAAM,aAAa,OAA4C;EAC7D,OAAO,OAAO,KAAK,CAAC,CAAC,SAAS,SAAS;GACrC,KAAK,MAAM,UAAU,KAAK,SACxB,mBAAA,gBAAgB,MAAM,CAAC,CAAC,KAAK,QAAQA,aAAAA,cAAc,KAAK,UAAU,OAAO,WAAW,CAAC;EAEzF,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;AAkBA,IAAa,mBAAb,MAAoD;CAClD,SAAyC,CAAC;CAE1C,MAAM,aAAa,OAA4C;EAC7D,OAAO,QAAQ,KAAK,CAAC,CAAC,SAAS,GAAG,UAAU;GAC1C,IAAI,KAAK,QAAQ,SAAS,GAAG;IAC3B,MAAM,MAAM,KAAK,SAAS,QAAQ,UAAU,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;IACjE,KAAK,OAAO,SAAS;IACrB,KAAK,MAAM,UAAU,KAAK,SAAS;KAEjC,MAAM,OAAO,sBAAsB,IAAI,GAD5B,OAAO,KAAK,OAAO,IAAI,EACS,CAAC,CAAC,SAAS,IAAI,GAAG;KAC7D,mBAAA,gBAAgB,MAAM,CAAC,CAAC,KAAK,QAAQA,aAAAA,cAAc,KAAK,UAAU,IAAI;IACxE;GACF;EACF,CAAC;CACH;CAEA,QAAQ;EACN,KAAK,SAAS,CAAC;CACjB;AACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Todo } from "../flush/Todo.cjs";
|
|
2
2
|
//#region src/drivers/IdAssigner.d.ts
|
|
3
|
-
interface IdAssigner {
|
|
3
|
+
export interface IdAssigner {
|
|
4
4
|
assignNewIds(todos: Record<string, Todo>): Promise<void>;
|
|
5
5
|
}
|
|
6
6
|
/** Super-small/dumb wrapper around maybe-Knex/maybe-postgres.js/maybe-Bun-sql libraries. */
|
|
@@ -11,7 +11,7 @@ type QueryRunner = (sql: string) => Promise<any[]>;
|
|
|
11
11
|
* This lets us avoid cyclic issues with some INSERTs having foreign keys to other rows that themselves
|
|
12
12
|
* need to first be INSERTed.
|
|
13
13
|
*/
|
|
14
|
-
declare class SequenceIdAssigner implements IdAssigner {
|
|
14
|
+
export declare class SequenceIdAssigner implements IdAssigner {
|
|
15
15
|
#private;
|
|
16
16
|
constructor(runner: QueryRunner);
|
|
17
17
|
assignNewIds(todos: Record<string, Todo>): Promise<void>;
|
|
@@ -21,7 +21,7 @@ declare class SequenceIdAssigner implements IdAssigner {
|
|
|
21
21
|
*
|
|
22
22
|
* See {@link TestUuidAssigner} for creating stable-ish ids for tests
|
|
23
23
|
*/
|
|
24
|
-
declare class RandomUuidAssigner implements IdAssigner {
|
|
24
|
+
export declare class RandomUuidAssigner implements IdAssigner {
|
|
25
25
|
assignNewIds(todos: Record<string, Todo>): Promise<void>;
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
@@ -40,11 +40,11 @@ declare class RandomUuidAssigner implements IdAssigner {
|
|
|
40
40
|
* 00000000-0000-0000-000b-000000000002
|
|
41
41
|
* ```
|
|
42
42
|
*/
|
|
43
|
-
declare class TestUuidAssigner implements IdAssigner {
|
|
43
|
+
export declare class TestUuidAssigner implements IdAssigner {
|
|
44
44
|
private nextId;
|
|
45
45
|
assignNewIds(todos: Record<string, Todo>): Promise<void>;
|
|
46
46
|
reset(): void;
|
|
47
47
|
}
|
|
48
48
|
//#endregion
|
|
49
|
-
export {
|
|
49
|
+
export {};
|
|
50
50
|
//# sourceMappingURL=IdAssigner.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdAssigner.d.cts","names":[],"sources":["../../src/drivers/IdAssigner.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"IdAssigner.d.cts","names":[],"sources":["../../src/drivers/IdAssigner.ts"],"mappings":";;iBAMiB;EACf,aAAa,OAAO,eAAe,QAAQ;;;KAIxC,eAAe,gBAAgB;;;;;;;qBAQvB,8BAA8B;;EAGzC,YAAmB,QAAQ;EAIrB,aAAa,OAAO,eAAe,QAAQ;;;;;;;qBA+BtC,8BAA8B;EACnC,aAAa,OAAO,eAAe,QAAQ;;;;;;;;;;;;;;;;;;qBAyBtC,4BAA4B;UAC/B;EAEF,aAAa,OAAO,eAAe,QAAQ;EAcjD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Todo } from "../flush/Todo.mjs";
|
|
2
2
|
//#region src/drivers/IdAssigner.d.ts
|
|
3
|
-
interface IdAssigner {
|
|
3
|
+
export interface IdAssigner {
|
|
4
4
|
assignNewIds(todos: Record<string, Todo>): Promise<void>;
|
|
5
5
|
}
|
|
6
6
|
/** Super-small/dumb wrapper around maybe-Knex/maybe-postgres.js/maybe-Bun-sql libraries. */
|
|
@@ -11,7 +11,7 @@ type QueryRunner = (sql: string) => Promise<any[]>;
|
|
|
11
11
|
* This lets us avoid cyclic issues with some INSERTs having foreign keys to other rows that themselves
|
|
12
12
|
* need to first be INSERTed.
|
|
13
13
|
*/
|
|
14
|
-
declare class SequenceIdAssigner implements IdAssigner {
|
|
14
|
+
export declare class SequenceIdAssigner implements IdAssigner {
|
|
15
15
|
#private;
|
|
16
16
|
constructor(runner: QueryRunner);
|
|
17
17
|
assignNewIds(todos: Record<string, Todo>): Promise<void>;
|
|
@@ -21,7 +21,7 @@ declare class SequenceIdAssigner implements IdAssigner {
|
|
|
21
21
|
*
|
|
22
22
|
* See {@link TestUuidAssigner} for creating stable-ish ids for tests
|
|
23
23
|
*/
|
|
24
|
-
declare class RandomUuidAssigner implements IdAssigner {
|
|
24
|
+
export declare class RandomUuidAssigner implements IdAssigner {
|
|
25
25
|
assignNewIds(todos: Record<string, Todo>): Promise<void>;
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
@@ -40,11 +40,11 @@ declare class RandomUuidAssigner implements IdAssigner {
|
|
|
40
40
|
* 00000000-0000-0000-000b-000000000002
|
|
41
41
|
* ```
|
|
42
42
|
*/
|
|
43
|
-
declare class TestUuidAssigner implements IdAssigner {
|
|
43
|
+
export declare class TestUuidAssigner implements IdAssigner {
|
|
44
44
|
private nextId;
|
|
45
45
|
assignNewIds(todos: Record<string, Todo>): Promise<void>;
|
|
46
46
|
reset(): void;
|
|
47
47
|
}
|
|
48
48
|
//#endregion
|
|
49
|
-
export {
|
|
49
|
+
export {};
|
|
50
50
|
//# sourceMappingURL=IdAssigner.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdAssigner.d.mts","names":[],"sources":["../../src/drivers/IdAssigner.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"IdAssigner.d.mts","names":[],"sources":["../../src/drivers/IdAssigner.ts"],"mappings":";;iBAMiB;EACf,aAAa,OAAO,eAAe,QAAQ;;;KAIxC,eAAe,gBAAgB;;;;;;;qBAQvB,8BAA8B;;EAGzC,YAAmB,QAAQ;EAIrB,aAAa,OAAO,eAAe,QAAQ;;;;;;;qBA+BtC,8BAA8B;EACnC,aAAa,OAAO,eAAe,QAAQ;;;;;;;;;;;;;;;;;;qBAyBtC,4BAA4B;UAC/B;EAEF,aAAa,OAAO,eAAe,QAAQ;EAcjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdAssigner.js","names":[
|
|
1
|
+
{"version":3,"file":"IdAssigner.js","names":[],"sources":["../../src/drivers/IdAssigner.ts"],"sourcesContent":["import * as crypto from \"crypto\";\n\nimport { getInstanceData } from \"src/BaseEntity.ts\";\nimport type { Todo } from \"src/flush/Todo.ts\";\nimport { keyToTaggedId } from \"src/keys.ts\";\n\nexport interface IdAssigner {\n assignNewIds(todos: Record<string, Todo>): Promise<void>;\n}\n\n/** Super-small/dumb wrapper around maybe-Knex/maybe-postgres.js/maybe-Bun-sql libraries. */\ntype QueryRunner = (sql: string) => Promise<any[]>;\n\n/**\n * Assigns all new entities an id directly from their corresponding sequence generator, instead of via INSERTs.\n *\n * This lets us avoid cyclic issues with some INSERTs having foreign keys to other rows that themselves\n * need to first be INSERTed.\n */\nexport class SequenceIdAssigner implements IdAssigner {\n #runner: QueryRunner;\n\n public constructor(runner: QueryRunner) {\n this.#runner = runner;\n }\n\n async assignNewIds(todos: Record<string, Todo>): Promise<void> {\n const seqStatements: string[] = [];\n Object.values(todos).forEach((todo) => {\n // Even if we have INSERTs, the user may have already assigned ids...\n const needsIds = todo.inserts.filter((e) => e.idMaybe === undefined);\n if (needsIds.length > 0) {\n const sequenceName = `${todo.metadata.tableName}_id_seq`;\n const sql = `select nextval('${sequenceName}') from generate_series(1, ${needsIds.length})`;\n seqStatements.push(sql);\n }\n });\n if (seqStatements.length > 0) {\n // There will be 1 per table; 1 single insert should be fine but we might need to batch for super-large schemas?\n const sql = seqStatements.join(\" UNION ALL \");\n const result = await this.#runner(sql);\n let i = 0;\n Object.values(todos).forEach((todo) => {\n for (const insert of todo.inserts.filter((e) => e.idMaybe === undefined)) {\n // Use todo.metadata so that all subtypes get their base type's tag\n getInstanceData(insert).data[\"id\"] = keyToTaggedId(todo.metadata, result[i++][\"nextval\"]);\n }\n });\n }\n }\n}\n\n/**\n * Creates random UUIDs for uuid-based keys in production environments.\n *\n * See {@link TestUuidAssigner} for creating stable-ish ids for tests\n */\nexport class RandomUuidAssigner implements IdAssigner {\n async assignNewIds(todos: Record<string, Todo>): Promise<void> {\n Object.values(todos).forEach((todo) => {\n for (const insert of todo.inserts) {\n getInstanceData(insert).data[\"id\"] = keyToTaggedId(todo.metadata, crypto.randomUUID());\n }\n });\n }\n}\n\n/**\n * Creates deterministic / stable-ish UUIDs for test suites.\n *\n * We use each entity's tag as the 3rd group of digits, and a per-entity incrementing integer as\n * the 4th group of digits.\n *\n * E.g. a test with two Authors (tag `a`) and three Books (tag `b`) will get these ids:\n *\n * ```\n * 00000000-0000-0000-000a-000000000000\n * 00000000-0000-0000-000a-000000000001\n * 00000000-0000-0000-000b-000000000000\n * 00000000-0000-0000-000b-000000000001\n * 00000000-0000-0000-000b-000000000002\n * ```\n */\nexport class TestUuidAssigner implements IdAssigner {\n private nextId: Record<string, number> = {};\n\n async assignNewIds(todos: Record<string, Todo>): Promise<void> {\n Object.entries(todos).forEach(([, todo]) => {\n if (todo.inserts.length > 0) {\n const tag = todo.metadata.tagName.substring(0, 4).padStart(4, \"0\");\n this.nextId[tag] ??= 0;\n for (const insert of todo.inserts) {\n const id = String(this.nextId[tag]++);\n const uuid = `00000000-0000-0000-${tag}-${id.padStart(12, \"0\")}`;\n getInstanceData(insert).data[\"id\"] = keyToTaggedId(todo.metadata, uuid);\n }\n }\n });\n }\n\n reset() {\n this.nextId = {};\n }\n}\n"],"mappings":";;;;;;;;;;AAmBA,IAAa,qBAAb,MAAsD;CACpD;CAEA,YAAmB,QAAqB;EACtC,KAAK,UAAU;CACjB;CAEA,MAAM,aAAa,OAA4C;EAC7D,MAAM,gBAA0B,CAAC;EACjC,OAAO,OAAO,KAAK,CAAC,CAAC,SAAS,SAAS;GAErC,MAAM,WAAW,KAAK,QAAQ,QAAQ,MAAM,EAAE,YAAY,KAAA,CAAS;GACnE,IAAI,SAAS,SAAS,GAAG;IAEvB,MAAM,MAAM,mBAAmB,GADP,KAAK,SAAS,UAAU,SACJ,6BAA6B,SAAS,OAAO;IACzF,cAAc,KAAK,GAAG;GACxB;EACF,CAAC;EACD,IAAI,cAAc,SAAS,GAAG;GAE5B,MAAM,MAAM,cAAc,KAAK,aAAa;GAC5C,MAAM,SAAS,MAAM,KAAK,QAAQ,GAAG;GACrC,IAAI,IAAI;GACR,OAAO,OAAO,KAAK,CAAC,CAAC,SAAS,SAAS;IACrC,KAAK,MAAM,UAAU,KAAK,QAAQ,QAAQ,MAAM,EAAE,YAAY,KAAA,CAAS,GAErE,gBAAgB,MAAM,CAAC,CAAC,KAAK,QAAQ,cAAc,KAAK,UAAU,OAAO,IAAI,CAAC,UAAU;GAE5F,CAAC;EACH;CACF;AACF;;;;;;AAOA,IAAa,qBAAb,MAAsD;CACpD,MAAM,aAAa,OAA4C;EAC7D,OAAO,OAAO,KAAK,CAAC,CAAC,SAAS,SAAS;GACrC,KAAK,MAAM,UAAU,KAAK,SACxB,gBAAgB,MAAM,CAAC,CAAC,KAAK,QAAQ,cAAc,KAAK,UAAU,OAAO,WAAW,CAAC;EAEzF,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;AAkBA,IAAa,mBAAb,MAAoD;CAClD,SAAyC,CAAC;CAE1C,MAAM,aAAa,OAA4C;EAC7D,OAAO,QAAQ,KAAK,CAAC,CAAC,SAAS,GAAG,UAAU;GAC1C,IAAI,KAAK,QAAQ,SAAS,GAAG;IAC3B,MAAM,MAAM,KAAK,SAAS,QAAQ,UAAU,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;IACjE,KAAK,OAAO,SAAS;IACrB,KAAK,MAAM,UAAU,KAAK,SAAS;KAEjC,MAAM,OAAO,sBAAsB,IAAI,GAD5B,OAAO,KAAK,OAAO,IAAI,EACS,CAAC,CAAC,SAAS,IAAI,GAAG;KAC7D,gBAAgB,MAAM,CAAC,CAAC,KAAK,QAAQ,cAAc,KAAK,UAAU,IAAI;IACxE;GACF;EACF,CAAC;CACH;CAEA,QAAQ;EACN,KAAK,SAAS,CAAC;CACjB;AACF"}
|
|
@@ -4,7 +4,7 @@ import { buildCteSql } from "../queries/find/buildFindQuery.cjs";
|
|
|
4
4
|
import { buildValuesCte } from "../dataloaders/findDataLoader.cjs";
|
|
5
5
|
import { getRuntimeConfig } from "../runtimeConfig.cjs";
|
|
6
6
|
//#region src/drivers/driverApi.d.ts
|
|
7
|
-
declare const driverApi: {
|
|
7
|
+
export declare const driverApi: {
|
|
8
8
|
buildValuesCte: typeof buildValuesCte;
|
|
9
9
|
generateOps: typeof generateOps;
|
|
10
10
|
buildCteSql: typeof buildCteSql;
|
|
@@ -12,11 +12,10 @@ declare const driverApi: {
|
|
|
12
12
|
batched: typeof batched;
|
|
13
13
|
cleanSql: typeof cleanSql;
|
|
14
14
|
};
|
|
15
|
-
type driverApi = {
|
|
15
|
+
export type driverApi = {
|
|
16
16
|
DeleteOp: DeleteOp;
|
|
17
17
|
UpdateOp: UpdateOp;
|
|
18
18
|
InsertOp: InsertOp;
|
|
19
19
|
};
|
|
20
20
|
//#endregion
|
|
21
|
-
export { driverApi };
|
|
22
21
|
//# sourceMappingURL=driverApi.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driverApi.d.cts","names":[],"sources":["../../src/drivers/driverApi.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"driverApi.d.cts","names":[],"sources":["../../src/drivers/driverApi.ts"],"mappings":";;;;;;qBAMa;;;;;;;;YASD;EACV,UAAU;EACV,UAAU;EACV,UAAU"}
|
|
@@ -4,7 +4,7 @@ import { buildCteSql } from "../queries/find/buildFindQuery.mjs";
|
|
|
4
4
|
import { buildValuesCte } from "../dataloaders/findDataLoader.mjs";
|
|
5
5
|
import { getRuntimeConfig } from "../runtimeConfig.mjs";
|
|
6
6
|
//#region src/drivers/driverApi.d.ts
|
|
7
|
-
declare const driverApi: {
|
|
7
|
+
export declare const driverApi: {
|
|
8
8
|
buildValuesCte: typeof buildValuesCte;
|
|
9
9
|
generateOps: typeof generateOps;
|
|
10
10
|
buildCteSql: typeof buildCteSql;
|
|
@@ -12,11 +12,10 @@ declare const driverApi: {
|
|
|
12
12
|
batched: typeof batched;
|
|
13
13
|
cleanSql: typeof cleanSql;
|
|
14
14
|
};
|
|
15
|
-
type driverApi = {
|
|
15
|
+
export type driverApi = {
|
|
16
16
|
DeleteOp: DeleteOp;
|
|
17
17
|
UpdateOp: UpdateOp;
|
|
18
18
|
InsertOp: InsertOp;
|
|
19
19
|
};
|
|
20
20
|
//#endregion
|
|
21
|
-
export { driverApi };
|
|
22
21
|
//# sourceMappingURL=driverApi.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driverApi.d.mts","names":[],"sources":["../../src/drivers/driverApi.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"driverApi.d.mts","names":[],"sources":["../../src/drivers/driverApi.ts"],"mappings":";;;;;;qBAMa;;;;;;;;YASD;EACV,UAAU;EACV,UAAU;EACV,UAAU"}
|
package/build/fields.d.cts
CHANGED
|
@@ -7,11 +7,11 @@ import { Entity } from "./Entity.cjs";
|
|
|
7
7
|
* We skip any typing like `fieldName: keyof T` because this method should only be
|
|
8
8
|
* called by trusted codegen anyway.
|
|
9
9
|
*/
|
|
10
|
-
declare function getField(entity: Entity, fieldName: string): any;
|
|
10
|
+
export declare function getField(entity: Entity, fieldName: string): any;
|
|
11
11
|
/** Returns whether `fieldName` is a field/column on `entity` that can be changed. */
|
|
12
|
-
declare function isChangeableField(entity: Entity, fieldName: string): boolean;
|
|
12
|
+
export declare function isChangeableField(entity: Entity, fieldName: string): boolean;
|
|
13
13
|
/** Returns whether `fieldName` has been set, even if it's undefined, on `entity`. */
|
|
14
|
-
declare function isFieldSet(entity: Entity, fieldName: string): boolean;
|
|
14
|
+
export declare function isFieldSet(entity: Entity, fieldName: string): boolean;
|
|
15
15
|
/**
|
|
16
16
|
* Sets the current value of `fieldName`, this is an internal method that should
|
|
17
17
|
* only be called by the code-generated setters.
|
|
@@ -21,9 +21,8 @@ declare function isFieldSet(entity: Entity, fieldName: string): boolean;
|
|
|
21
21
|
*
|
|
22
22
|
* Returns `true` if the value was changed, or `false` if it was a noop.
|
|
23
23
|
*/
|
|
24
|
-
declare function setField(entity: Entity, fieldName: string, newValue: any): boolean;
|
|
25
|
-
declare function equalArrays(a: any[], b: any[]): boolean;
|
|
26
|
-
declare function equal(a: any, b: any): boolean;
|
|
24
|
+
export declare function setField(entity: Entity, fieldName: string, newValue: any): boolean;
|
|
25
|
+
export declare function equalArrays(a: any[], b: any[]): boolean;
|
|
26
|
+
export declare function equal(a: any, b: any): boolean;
|
|
27
27
|
//#endregion
|
|
28
|
-
export { equal, equalArrays, getField, isChangeableField, isFieldSet, setField };
|
|
29
28
|
//# sourceMappingURL=fields.d.cts.map
|
package/build/fields.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields.d.cts","names":[],"sources":["../src/fields.ts"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"fields.d.cts","names":[],"sources":["../src/fields.ts"],"mappings":";;;;;;;;;wBAegB,SAAS,QAAQ,QAAQ;;wBAoBzB,kBAAkB,QAAQ,QAAQ;;wBAKlC,WAAW,QAAQ,QAAQ;;;;;;;;;;wBAmB3B,SAAS,QAAQ,QAAQ,mBAAmB;wBAmH5C,YAAY,UAAU;wBAMtB,MAAM,QAAQ"}
|
package/build/fields.d.mts
CHANGED
|
@@ -7,11 +7,11 @@ import { Entity } from "./Entity.mjs";
|
|
|
7
7
|
* We skip any typing like `fieldName: keyof T` because this method should only be
|
|
8
8
|
* called by trusted codegen anyway.
|
|
9
9
|
*/
|
|
10
|
-
declare function getField(entity: Entity, fieldName: string): any;
|
|
10
|
+
export declare function getField(entity: Entity, fieldName: string): any;
|
|
11
11
|
/** Returns whether `fieldName` is a field/column on `entity` that can be changed. */
|
|
12
|
-
declare function isChangeableField(entity: Entity, fieldName: string): boolean;
|
|
12
|
+
export declare function isChangeableField(entity: Entity, fieldName: string): boolean;
|
|
13
13
|
/** Returns whether `fieldName` has been set, even if it's undefined, on `entity`. */
|
|
14
|
-
declare function isFieldSet(entity: Entity, fieldName: string): boolean;
|
|
14
|
+
export declare function isFieldSet(entity: Entity, fieldName: string): boolean;
|
|
15
15
|
/**
|
|
16
16
|
* Sets the current value of `fieldName`, this is an internal method that should
|
|
17
17
|
* only be called by the code-generated setters.
|
|
@@ -21,9 +21,8 @@ declare function isFieldSet(entity: Entity, fieldName: string): boolean;
|
|
|
21
21
|
*
|
|
22
22
|
* Returns `true` if the value was changed, or `false` if it was a noop.
|
|
23
23
|
*/
|
|
24
|
-
declare function setField(entity: Entity, fieldName: string, newValue: any): boolean;
|
|
25
|
-
declare function equalArrays(a: any[], b: any[]): boolean;
|
|
26
|
-
declare function equal(a: any, b: any): boolean;
|
|
24
|
+
export declare function setField(entity: Entity, fieldName: string, newValue: any): boolean;
|
|
25
|
+
export declare function equalArrays(a: any[], b: any[]): boolean;
|
|
26
|
+
export declare function equal(a: any, b: any): boolean;
|
|
27
27
|
//#endregion
|
|
28
|
-
export { equal, equalArrays, getField, isChangeableField, isFieldSet, setField };
|
|
29
28
|
//# sourceMappingURL=fields.d.mts.map
|
package/build/fields.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields.d.mts","names":[],"sources":["../src/fields.ts"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"fields.d.mts","names":[],"sources":["../src/fields.ts"],"mappings":";;;;;;;;;wBAegB,SAAS,QAAQ,QAAQ;;wBAoBzB,kBAAkB,QAAQ,QAAQ;;wBAKlC,WAAW,QAAQ,QAAQ;;;;;;;;;;wBAmB3B,SAAS,QAAQ,QAAQ,mBAAmB;wBAmH5C,YAAY,UAAU;wBAMtB,MAAM,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlushLock.cjs","names":["AsyncLocalStorage"
|
|
1
|
+
{"version":3,"file":"FlushLock.cjs","names":["AsyncLocalStorage"],"sources":["../../src/flush/FlushLock.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"async_hooks\";\n\n/** A marker to prevent setter calls during `flush` calls. */\nconst currentFlushSecret = new AsyncLocalStorage<{ flushSecret: number }>();\n\n/**\n * Prevents entities being mutated mid-flush.\n *\n * The `flush` process does a dirty check + SQL flush and generally doesn't want\n * entities to re-dirtied after it's done the initial dirty check. So we'd like\n * to prevent all setter calls while `flush` is running.\n *\n * That said, lifecycle code like hooks actually can make setter calls b/c `flush`\n * invokes them at a specific point in its process.\n *\n * We solve this by using node's `AsyncLocalStorage` to mark certain callbacks (promise\n * handlers) as blessed / invoked-from-`flush`-itself, and they are allowed to call setters,\n * but any external callers (i.e. application code) will be rejected.\n */\nexport class FlushLock {\n #flushSecret: number = 0;\n #isFlushing: boolean = false;\n\n /** This will begin any non-hook restrictions on writing to entities. */\n startLock(): void {\n if (this.#isFlushing) {\n throw new Error(\"Cannot flush while another flush is already in progress\");\n }\n this.#isFlushing = true;\n }\n\n releaseLock(): void {\n this.#isFlushing = false;\n }\n\n /** Any writes that happen from `fn`, despite flush being locked, will be allowed. */\n allowWrites(fn: () => Promise<void>): Promise<void> {\n return currentFlushSecret.run({ flushSecret: this.#flushSecret }, () =>\n fn().then(() => {\n this.#flushSecret += 1;\n }),\n );\n }\n\n /** Blows up if writes are locked, i.e. we're flushing and the caller is not within an `allowWrites` block. */\n checkWritesAllowed(): void {\n if (this.#isFlushing) {\n const { flushSecret } = currentFlushSecret.getStore() || {};\n if (flushSecret === undefined) {\n throw new Error(`Cannot mutate an entity during an em.flush outside of a entity hook or from afterCommit`);\n } else if (flushSecret !== this.#flushSecret) {\n throw new Error(`Attempting to reuse a hook context outside its flush loop`);\n }\n }\n }\n\n get isFlushing(): boolean {\n return this.#isFlushing;\n }\n}\n"],"mappings":";;;AAGA,MAAM,qBAAqB,0BAAIA,EAAAA,CAAAA,kBAA2C;;;;;;;;;;;;;;;AAgB1E,IAAa,YAAb,MAAuB;CACrB,eAAuB;CACvB,cAAuB;;CAGvB,YAAkB;EAChB,IAAI,KAAK,aACP,MAAM,IAAI,MAAM,yDAAyD;EAE3E,KAAK,cAAc;CACrB;CAEA,cAAoB;EAClB,KAAK,cAAc;CACrB;;CAGA,YAAY,IAAwC;EAClD,OAAO,mBAAmB,IAAI,EAAE,aAAa,KAAK,aAAa,SAC7D,GAAG,CAAC,CAAC,WAAW;GACd,KAAK,gBAAgB;EACvB,CAAC,CACH;CACF;;CAGA,qBAA2B;EACzB,IAAI,KAAK,aAAa;GACpB,MAAM,EAAE,gBAAgB,mBAAmB,SAAS,KAAK,CAAC;GAC1D,IAAI,gBAAgB,KAAA,GAClB,MAAM,IAAI,MAAM,yFAAyF;QACpG,IAAI,gBAAgB,KAAK,cAC9B,MAAM,IAAI,MAAM,2DAA2D;EAE/E;CACF;CAEA,IAAI,aAAsB;EACxB,OAAO,KAAK;CACd;AACF"}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* handlers) as blessed / invoked-from-`flush`-itself, and they are allowed to call setters,
|
|
14
14
|
* but any external callers (i.e. application code) will be rejected.
|
|
15
15
|
*/
|
|
16
|
-
declare class FlushLock {
|
|
16
|
+
export declare class FlushLock {
|
|
17
17
|
#private;
|
|
18
18
|
/** This will begin any non-hook restrictions on writing to entities. */
|
|
19
19
|
startLock(): void;
|
|
@@ -25,5 +25,4 @@ declare class FlushLock {
|
|
|
25
25
|
get isFlushing(): boolean;
|
|
26
26
|
}
|
|
27
27
|
//#endregion
|
|
28
|
-
export { FlushLock };
|
|
29
28
|
//# sourceMappingURL=FlushLock.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlushLock.d.cts","names":[],"sources":["../../src/flush/FlushLock.ts"],"mappings":";;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"FlushLock.d.cts","names":[],"sources":["../../src/flush/FlushLock.ts"],"mappings":";;;;;;;;;;;;;;;qBAmBa;;;EAKX;EAOA;;EAKA,YAAY,UAAU,gBAAgB;;EAStC;MAWI"}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* handlers) as blessed / invoked-from-`flush`-itself, and they are allowed to call setters,
|
|
14
14
|
* but any external callers (i.e. application code) will be rejected.
|
|
15
15
|
*/
|
|
16
|
-
declare class FlushLock {
|
|
16
|
+
export declare class FlushLock {
|
|
17
17
|
#private;
|
|
18
18
|
/** This will begin any non-hook restrictions on writing to entities. */
|
|
19
19
|
startLock(): void;
|
|
@@ -25,5 +25,4 @@ declare class FlushLock {
|
|
|
25
25
|
get isFlushing(): boolean;
|
|
26
26
|
}
|
|
27
27
|
//#endregion
|
|
28
|
-
export { FlushLock };
|
|
29
28
|
//# sourceMappingURL=FlushLock.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlushLock.d.mts","names":[],"sources":["../../src/flush/FlushLock.ts"],"mappings":";;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"FlushLock.d.mts","names":[],"sources":["../../src/flush/FlushLock.ts"],"mappings":";;;;;;;;;;;;;;;qBAmBa;;;EAKX;EAOA;;EAKA,YAAY,UAAU,gBAAgB;;EAStC;MAWI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlushLock.js","names":[
|
|
1
|
+
{"version":3,"file":"FlushLock.js","names":[],"sources":["../../src/flush/FlushLock.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"async_hooks\";\n\n/** A marker to prevent setter calls during `flush` calls. */\nconst currentFlushSecret = new AsyncLocalStorage<{ flushSecret: number }>();\n\n/**\n * Prevents entities being mutated mid-flush.\n *\n * The `flush` process does a dirty check + SQL flush and generally doesn't want\n * entities to re-dirtied after it's done the initial dirty check. So we'd like\n * to prevent all setter calls while `flush` is running.\n *\n * That said, lifecycle code like hooks actually can make setter calls b/c `flush`\n * invokes them at a specific point in its process.\n *\n * We solve this by using node's `AsyncLocalStorage` to mark certain callbacks (promise\n * handlers) as blessed / invoked-from-`flush`-itself, and they are allowed to call setters,\n * but any external callers (i.e. application code) will be rejected.\n */\nexport class FlushLock {\n #flushSecret: number = 0;\n #isFlushing: boolean = false;\n\n /** This will begin any non-hook restrictions on writing to entities. */\n startLock(): void {\n if (this.#isFlushing) {\n throw new Error(\"Cannot flush while another flush is already in progress\");\n }\n this.#isFlushing = true;\n }\n\n releaseLock(): void {\n this.#isFlushing = false;\n }\n\n /** Any writes that happen from `fn`, despite flush being locked, will be allowed. */\n allowWrites(fn: () => Promise<void>): Promise<void> {\n return currentFlushSecret.run({ flushSecret: this.#flushSecret }, () =>\n fn().then(() => {\n this.#flushSecret += 1;\n }),\n );\n }\n\n /** Blows up if writes are locked, i.e. we're flushing and the caller is not within an `allowWrites` block. */\n checkWritesAllowed(): void {\n if (this.#isFlushing) {\n const { flushSecret } = currentFlushSecret.getStore() || {};\n if (flushSecret === undefined) {\n throw new Error(`Cannot mutate an entity during an em.flush outside of a entity hook or from afterCommit`);\n } else if (flushSecret !== this.#flushSecret) {\n throw new Error(`Attempting to reuse a hook context outside its flush loop`);\n }\n }\n }\n\n get isFlushing(): boolean {\n return this.#isFlushing;\n }\n}\n"],"mappings":";;;AAGA,MAAM,qBAAqB,IAAI,kBAA2C;;;;;;;;;;;;;;;AAgB1E,IAAa,YAAb,MAAuB;CACrB,eAAuB;CACvB,cAAuB;;CAGvB,YAAkB;EAChB,IAAI,KAAK,aACP,MAAM,IAAI,MAAM,yDAAyD;EAE3E,KAAK,cAAc;CACrB;CAEA,cAAoB;EAClB,KAAK,cAAc;CACrB;;CAGA,YAAY,IAAwC;EAClD,OAAO,mBAAmB,IAAI,EAAE,aAAa,KAAK,aAAa,SAC7D,GAAG,CAAC,CAAC,WAAW;GACd,KAAK,gBAAgB;EACvB,CAAC,CACH;CACF;;CAGA,qBAA2B;EACzB,IAAI,KAAK,aAAa;GACpB,MAAM,EAAE,gBAAgB,mBAAmB,SAAS,KAAK,CAAC;GAC1D,IAAI,gBAAgB,KAAA,GAClB,MAAM,IAAI,MAAM,yFAAyF;QACpG,IAAI,gBAAgB,KAAK,cAC9B,MAAM,IAAI,MAAM,2DAA2D;EAE/E;CACF;CAEA,IAAI,aAAsB;EACxB,OAAO,KAAK;CACd;AACF"}
|