joist-core 2.3.0-next.97 → 2.3.0-next.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/BaseEntity.cjs.map +1 -1
- package/build/BaseEntity.js.map +1 -1
- package/build/Entity.cjs.map +1 -1
- package/build/Entity.js.map +1 -1
- package/build/EntityManager.cjs +45 -46
- package/build/EntityManager.cjs.map +1 -1
- package/build/EntityManager.d.cts +7 -7
- package/build/EntityManager.d.cts.map +1 -1
- package/build/EntityManager.d.mts +7 -7
- package/build/EntityManager.d.mts.map +1 -1
- package/build/EntityManager.js +27 -28
- package/build/EntityManager.js.map +1 -1
- package/build/EntityMetadata.cjs +0 -2
- package/build/EntityMetadata.cjs.map +1 -1
- package/build/EntityMetadata.d.cts +3 -3
- package/build/EntityMetadata.d.mts +3 -3
- package/build/EntityMetadata.js +0 -2
- package/build/EntityMetadata.js.map +1 -1
- package/build/IndexManager.cjs +1 -1
- package/build/IndexManager.cjs.map +1 -1
- package/build/IndexManager.js +1 -1
- package/build/IndexManager.js.map +1 -1
- package/build/InstanceData.cjs.map +1 -1
- package/build/InstanceData.js.map +1 -1
- package/build/PluginManager.cjs +0 -1
- package/build/PluginManager.cjs.map +1 -1
- package/build/PluginManager.d.cts +1 -1
- package/build/PluginManager.d.mts +1 -1
- package/build/PluginManager.js +0 -1
- package/build/PluginManager.js.map +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.cjs +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.cjs.map +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.cts +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.d.mts +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.js +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.js.map +1 -1
- package/build/batchloaders/loadBatchLoader.cjs +3 -4
- package/build/batchloaders/loadBatchLoader.cjs.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.cts +1 -1
- package/build/batchloaders/loadBatchLoader.d.mts +1 -1
- package/build/batchloaders/loadBatchLoader.js +2 -3
- package/build/batchloaders/loadBatchLoader.js.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.cjs +1 -1
- package/build/batchloaders/manyToManyBatchLoader.cjs.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.d.cts +1 -1
- package/build/batchloaders/manyToManyBatchLoader.d.mts +1 -1
- package/build/batchloaders/manyToManyBatchLoader.js +1 -1
- package/build/batchloaders/manyToManyBatchLoader.js.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.cjs +1 -1
- package/build/batchloaders/oneToManyBatchLoader.cjs.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.js +1 -1
- package/build/batchloaders/oneToManyBatchLoader.js.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.cjs +1 -1
- package/build/batchloaders/oneToOneBatchLoader.cjs.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.js +1 -1
- package/build/batchloaders/oneToOneBatchLoader.js.map +1 -1
- package/build/batchloaders/populateBatchLoader.cjs +11 -12
- package/build/batchloaders/populateBatchLoader.cjs.map +1 -1
- package/build/batchloaders/populateBatchLoader.d.cts +1 -1
- package/build/batchloaders/populateBatchLoader.d.mts +1 -1
- package/build/batchloaders/populateBatchLoader.js +7 -8
- package/build/batchloaders/populateBatchLoader.js.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.cjs +2 -2
- package/build/batchloaders/recursiveChildrenBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.js +2 -2
- package/build/batchloaders/recursiveChildrenBatchLoader.js.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.cjs +2 -2
- package/build/batchloaders/recursiveM2mBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.js +2 -2
- package/build/batchloaders/recursiveM2mBatchLoader.js.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.cjs +2 -2
- package/build/batchloaders/recursiveParentsBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.js +2 -2
- package/build/batchloaders/recursiveParentsBatchLoader.js.map +1 -1
- package/build/changes.cjs +2 -3
- package/build/changes.cjs.map +1 -1
- package/build/changes.js +2 -3
- package/build/changes.js.map +1 -1
- package/build/config.cjs +3 -3
- package/build/config.cjs.map +1 -1
- package/build/config.d.cts +2 -2
- package/build/config.d.mts +2 -2
- package/build/config.js +1 -1
- package/build/config.js.map +1 -1
- package/build/configure.cjs +10 -10
- package/build/configure.cjs.map +1 -1
- package/build/configure.js +5 -5
- package/build/configure.js.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.cjs +8 -8
- package/build/dataloaders/fastWhereFilterHash.cjs.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.d.cts.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.d.mts.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.js +3 -3
- package/build/dataloaders/fastWhereFilterHash.js.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.cjs.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.js.map +1 -1
- package/build/dataloaders/findCountDataLoader.cjs +2 -2
- package/build/dataloaders/findCountDataLoader.cjs.map +1 -1
- package/build/dataloaders/findCountDataLoader.js +1 -1
- package/build/dataloaders/findCountDataLoader.js.map +1 -1
- package/build/dataloaders/findDataLoader.cjs +6 -6
- package/build/dataloaders/findDataLoader.cjs.map +1 -1
- package/build/dataloaders/findDataLoader.d.cts +1 -1
- package/build/dataloaders/findDataLoader.d.mts +1 -1
- package/build/dataloaders/findDataLoader.js +3 -3
- package/build/dataloaders/findDataLoader.js.map +1 -1
- package/build/dataloaders/findIdsDataLoader.cjs +3 -3
- package/build/dataloaders/findIdsDataLoader.cjs.map +1 -1
- package/build/dataloaders/findIdsDataLoader.js +2 -2
- package/build/dataloaders/findIdsDataLoader.js.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.cjs +1 -1
- package/build/dataloaders/findOrCreateDataLoader.cjs.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.js +1 -1
- package/build/dataloaders/findOrCreateDataLoader.js.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.cjs +6 -6
- package/build/dataloaders/findPaginatedDataLoader.cjs.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.cts +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.mts +1 -1
- package/build/dataloaders/findPaginatedDataLoader.js +3 -3
- package/build/dataloaders/findPaginatedDataLoader.js.map +1 -1
- package/build/dataloaders/lensDataLoader.cjs +3 -3
- package/build/dataloaders/lensDataLoader.cjs.map +1 -1
- package/build/dataloaders/lensDataLoader.d.cts.map +1 -1
- package/build/dataloaders/lensDataLoader.d.mts.map +1 -1
- package/build/dataloaders/lensDataLoader.js +2 -2
- package/build/dataloaders/lensDataLoader.js.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.cjs +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.cjs.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.js +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.js.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.cjs +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.cjs.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.js +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.js.map +1 -1
- package/build/defaults.cjs +5 -5
- package/build/defaults.cjs.map +1 -1
- package/build/defaults.d.cts +1 -1
- package/build/defaults.d.cts.map +1 -1
- package/build/defaults.d.mts +1 -1
- package/build/defaults.d.mts.map +1 -1
- package/build/defaults.js +4 -4
- package/build/defaults.js.map +1 -1
- package/build/drivers/Driver.cjs +0 -1
- package/build/drivers/Driver.d.cts +1 -1
- package/build/drivers/Driver.d.mts +1 -1
- package/build/drivers/Driver.js +0 -1
- package/build/drivers/EntityWriter.cjs +6 -7
- package/build/drivers/EntityWriter.cjs.map +1 -1
- package/build/drivers/EntityWriter.d.cts +1 -1
- package/build/drivers/EntityWriter.d.mts +1 -1
- package/build/drivers/EntityWriter.js +2 -3
- package/build/drivers/EntityWriter.js.map +1 -1
- package/build/drivers/IdAssigner.cjs +0 -1
- package/build/drivers/IdAssigner.cjs.map +1 -1
- package/build/drivers/IdAssigner.d.cts +1 -1
- package/build/drivers/IdAssigner.d.mts +1 -1
- package/build/drivers/IdAssigner.js +0 -1
- package/build/drivers/IdAssigner.js.map +1 -1
- package/build/drivers/driverApi.cjs +19 -0
- package/build/drivers/driverApi.cjs.map +1 -0
- package/build/drivers/driverApi.d.cts +22 -0
- package/build/drivers/driverApi.d.cts.map +1 -0
- package/build/drivers/driverApi.d.mts +22 -0
- package/build/drivers/driverApi.d.mts.map +1 -0
- package/build/drivers/driverApi.js +18 -0
- package/build/drivers/driverApi.js.map +1 -0
- package/build/fields.cjs +3 -3
- package/build/fields.cjs.map +1 -1
- package/build/fields.js +2 -2
- package/build/fields.js.map +1 -1
- package/build/{FlushLock.cjs → flush/FlushLock.cjs} +1 -1
- package/build/flush/FlushLock.cjs.map +1 -0
- package/build/{FlushLock.d.cts → flush/FlushLock.d.cts} +1 -1
- package/build/flush/FlushLock.d.cts.map +1 -0
- package/build/{FlushLock.d.mts → flush/FlushLock.d.mts} +1 -1
- package/build/flush/FlushLock.d.mts.map +1 -0
- package/build/{FlushLock.js → flush/FlushLock.js} +1 -1
- package/build/flush/FlushLock.js.map +1 -0
- package/build/{JoinRows.cjs → flush/JoinRows.cjs} +5 -8
- package/build/flush/JoinRows.cjs.map +1 -0
- package/build/{JoinRows.d.cts → flush/JoinRows.d.cts} +5 -5
- package/build/flush/JoinRows.d.cts.map +1 -0
- package/build/{JoinRows.d.mts → flush/JoinRows.d.mts} +5 -5
- package/build/flush/JoinRows.d.mts.map +1 -0
- package/build/{JoinRows.js → flush/JoinRows.js} +5 -8
- package/build/flush/JoinRows.js.map +1 -0
- package/build/{PendingChanges.cjs → flush/PendingChanges.cjs} +0 -1
- package/build/{PendingChanges.d.cts → flush/PendingChanges.d.cts} +2 -2
- package/build/flush/PendingChanges.d.cts.map +1 -0
- package/build/{PendingChanges.d.mts → flush/PendingChanges.d.mts} +2 -2
- package/build/flush/PendingChanges.d.mts.map +1 -0
- package/build/flush/PendingChanges.js +1 -0
- package/build/{Todo.cjs → flush/Todo.cjs} +4 -6
- package/build/flush/Todo.cjs.map +1 -0
- package/build/{Todo.d.cts → flush/Todo.d.cts} +3 -3
- package/build/flush/Todo.d.cts.map +1 -0
- package/build/{Todo.d.mts → flush/Todo.d.mts} +3 -3
- package/build/flush/Todo.d.mts.map +1 -0
- package/build/{Todo.js → flush/Todo.js} +4 -6
- package/build/flush/Todo.js.map +1 -0
- package/build/getProperties.cjs.map +1 -1
- package/build/getProperties.js.map +1 -1
- package/build/index.cjs +100 -100
- package/build/index.cjs.map +1 -1
- package/build/index.d.cts +15 -15
- package/build/index.d.mts +15 -15
- package/build/index.js +42 -42
- package/build/index.js.map +1 -1
- package/build/json.cjs +4 -4
- package/build/json.cjs.map +1 -1
- package/build/json.js +3 -3
- package/build/json.js.map +1 -1
- package/build/keys.cjs +1 -1
- package/build/keys.cjs.map +1 -1
- package/build/keys.js +1 -1
- package/build/keys.js.map +1 -1
- package/build/{HintTree.cjs → loading/HintTree.cjs} +2 -5
- package/build/loading/HintTree.cjs.map +1 -0
- package/build/{HintTree.d.cts → loading/HintTree.d.cts} +3 -3
- package/build/loading/HintTree.d.cts.map +1 -0
- package/build/{HintTree.d.mts → loading/HintTree.d.mts} +3 -3
- package/build/loading/HintTree.d.mts.map +1 -0
- package/build/{HintTree.js → loading/HintTree.js} +2 -5
- package/build/loading/HintTree.js.map +1 -0
- package/build/{IsLoadedCache.cjs → loading/IsLoadedCache.cjs} +2 -3
- package/build/loading/IsLoadedCache.cjs.map +1 -0
- package/build/{IsLoadedCache.d.cts → loading/IsLoadedCache.d.cts} +2 -2
- package/build/loading/IsLoadedCache.d.cts.map +1 -0
- package/build/{IsLoadedCache.d.mts → loading/IsLoadedCache.d.mts} +2 -2
- package/build/loading/IsLoadedCache.d.mts.map +1 -0
- package/build/{IsLoadedCache.js → loading/IsLoadedCache.js} +2 -3
- package/build/{IsLoadedCache.cjs.map → loading/IsLoadedCache.js.map} +1 -1
- package/build/{loadHints.cjs → loading/loadHints.cjs} +6 -11
- package/build/loading/loadHints.cjs.map +1 -0
- package/build/{loadHints.d.cts → loading/loadHints.d.cts} +14 -14
- package/build/loading/loadHints.d.cts.map +1 -0
- package/build/{loadHints.d.mts → loading/loadHints.d.mts} +14 -14
- package/build/loading/loadHints.d.mts.map +1 -0
- package/build/{loadHints.js → loading/loadHints.js} +3 -8
- package/build/loading/loadHints.js.map +1 -0
- package/build/{loadLens.cjs → loading/loadLens.cjs} +8 -9
- package/build/loading/loadLens.cjs.map +1 -0
- package/build/{loadLens.d.cts → loading/loadLens.d.cts} +3 -3
- package/build/loading/loadLens.d.cts.map +1 -0
- package/build/{loadLens.d.mts → loading/loadLens.d.mts} +3 -3
- package/build/loading/loadLens.d.mts.map +1 -0
- package/build/{loadLens.js → loading/loadLens.js} +8 -9
- package/build/loading/loadLens.js.map +1 -0
- package/build/{withLoaded.cjs → loading/withLoaded.cjs} +12 -13
- package/build/loading/withLoaded.cjs.map +1 -0
- package/build/{withLoaded.d.cts → loading/withLoaded.d.cts} +9 -9
- package/build/loading/withLoaded.d.cts.map +1 -0
- package/build/{withLoaded.d.mts → loading/withLoaded.d.mts} +9 -9
- package/build/loading/withLoaded.d.mts.map +1 -0
- package/build/{withLoaded.js → loading/withLoaded.js} +10 -11
- package/build/loading/withLoaded.js.map +1 -0
- package/build/logging/FactoryLogger.cjs.map +1 -1
- package/build/logging/FactoryLogger.d.cts.map +1 -1
- package/build/logging/FactoryLogger.d.mts.map +1 -1
- package/build/logging/FactoryLogger.js.map +1 -1
- package/build/logging/FieldLogger.cjs.map +1 -1
- package/build/logging/FieldLogger.d.cts.map +1 -1
- package/build/logging/FieldLogger.d.mts.map +1 -1
- package/build/logging/FieldLogger.js.map +1 -1
- package/build/logging/ReactionLogger.cjs +0 -2
- package/build/logging/ReactionLogger.cjs.map +1 -1
- package/build/logging/ReactionLogger.d.cts +2 -2
- package/build/logging/ReactionLogger.d.cts.map +1 -1
- package/build/logging/ReactionLogger.d.mts +2 -2
- package/build/logging/ReactionLogger.d.mts.map +1 -1
- package/build/logging/ReactionLogger.js +0 -2
- package/build/logging/ReactionLogger.js.map +1 -1
- package/build/newEntity.cjs.map +1 -1
- package/build/newEntity.js.map +1 -1
- package/build/newTestInstance.cjs +3 -3
- package/build/newTestInstance.cjs.map +1 -1
- package/build/newTestInstance.d.cts +1 -1
- package/build/newTestInstance.d.cts.map +1 -1
- package/build/newTestInstance.d.mts +1 -1
- package/build/newTestInstance.d.mts.map +1 -1
- package/build/newTestInstance.js +2 -2
- package/build/newTestInstance.js.map +1 -1
- package/build/normalizeHints.cjs +0 -2
- package/build/normalizeHints.cjs.map +1 -1
- package/build/normalizeHints.d.cts +2 -2
- package/build/normalizeHints.d.mts +2 -2
- package/build/normalizeHints.js +0 -2
- package/build/normalizeHints.js.map +1 -1
- package/build/nowUTC.cjs +2 -2
- package/build/nowUTC.cjs.map +1 -1
- package/build/nowUTC.d.cts +1 -1
- package/build/nowUTC.d.mts +1 -1
- package/build/nowUTC.js +1 -1
- package/build/nowUTC.js.map +1 -1
- package/build/plugins/ImmutableEntitiesPlugin.cjs.map +1 -1
- package/build/plugins/ImmutableEntitiesPlugin.js.map +1 -1
- package/build/plugins/PreloadPlugin.cjs +0 -2
- package/build/plugins/PreloadPlugin.d.cts +2 -2
- package/build/plugins/PreloadPlugin.d.mts +2 -2
- package/build/plugins/PreloadPlugin.js +0 -2
- package/build/preloading/JsonAggregatePreloader.cjs +1 -4
- package/build/preloading/JsonAggregatePreloader.cjs.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.cts +2 -2
- package/build/preloading/JsonAggregatePreloader.d.cts.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.mts +2 -2
- package/build/preloading/JsonAggregatePreloader.d.mts.map +1 -1
- package/build/preloading/JsonAggregatePreloader.js +1 -4
- package/build/preloading/JsonAggregatePreloader.js.map +1 -1
- package/build/preloading/canPreload.cjs.map +1 -1
- package/build/preloading/canPreload.js.map +1 -1
- package/build/preloading/partitionHint.cjs +2 -3
- package/build/preloading/partitionHint.cjs.map +1 -1
- package/build/preloading/partitionHint.d.cts +1 -1
- package/build/preloading/partitionHint.d.mts +1 -1
- package/build/preloading/partitionHint.js +2 -3
- package/build/preloading/partitionHint.js.map +1 -1
- package/build/queries/ConditionBuilder.cjs.map +1 -1
- package/build/queries/ConditionBuilder.d.cts +1 -1
- package/build/queries/ConditionBuilder.d.mts +1 -1
- package/build/queries/ConditionBuilder.js.map +1 -1
- package/build/queries/conditions.cjs.map +1 -1
- package/build/queries/conditions.js.map +1 -1
- package/build/queries/entityQueryUtils.cjs.map +1 -1
- package/build/queries/entityQueryUtils.js.map +1 -1
- package/build/queries/find/Aliases.cjs +1 -1
- package/build/queries/find/Aliases.cjs.map +1 -1
- package/build/queries/find/Aliases.d.cts.map +1 -1
- package/build/queries/find/Aliases.d.mts.map +1 -1
- package/build/queries/find/Aliases.js +1 -1
- package/build/queries/find/Aliases.js.map +1 -1
- package/build/queries/find/DeferredAlias.cjs.map +1 -1
- package/build/queries/find/DeferredAlias.js.map +1 -1
- package/build/queries/find/EntityFilter.cjs.map +1 -1
- package/build/queries/find/EntityFilter.js.map +1 -1
- package/build/queries/find/EntityGraphQLFilter.cjs.map +1 -1
- package/build/queries/find/EntityGraphQLFilter.js.map +1 -1
- package/build/queries/find/QueryParser.cjs +2 -2
- package/build/queries/find/QueryParser.cjs.map +1 -1
- package/build/queries/find/QueryParser.collectionJoins.cjs.map +1 -1
- package/build/queries/find/QueryParser.collectionJoins.js.map +1 -1
- package/build/queries/find/QueryParser.d.cts.map +1 -1
- package/build/queries/find/QueryParser.d.mts.map +1 -1
- package/build/queries/find/QueryParser.js +2 -2
- package/build/queries/find/QueryParser.js.map +1 -1
- package/build/queries/find/QueryParser.pruning.cjs.map +1 -1
- package/build/queries/find/QueryParser.pruning.js.map +1 -1
- package/build/queries/find/QueryVisitor.cjs.map +1 -1
- package/build/queries/find/QueryVisitor.js.map +1 -1
- package/build/queries/find/buildFindQuery.cjs.map +1 -1
- package/build/queries/find/buildFindQuery.js.map +1 -1
- package/build/queries/find/scopes.cjs.map +1 -1
- package/build/queries/find/scopes.d.cts +1 -1
- package/build/queries/find/scopes.d.mts +1 -1
- package/build/queries/find/scopes.js.map +1 -1
- package/build/queries/parsedConditions.cjs.map +1 -1
- package/build/queries/parsedConditions.js.map +1 -1
- package/build/queries/renderConditions.cjs.map +1 -1
- package/build/queries/renderConditions.js.map +1 -1
- package/build/queries/skipCondition.cjs.map +1 -1
- package/build/queries/skipCondition.js.map +1 -1
- package/build/queries/sql/AliasAssigner.cjs.map +1 -1
- package/build/queries/sql/AliasAssigner.js.map +1 -1
- package/build/queries/sql/Expr.cjs +2 -2
- package/build/queries/sql/Expr.cjs.map +1 -1
- package/build/queries/sql/Expr.d.cts +1 -1
- package/build/queries/sql/Expr.d.mts +1 -1
- package/build/queries/sql/Expr.js +1 -1
- package/build/queries/sql/Expr.js.map +1 -1
- package/build/queries/sql/Tables.cjs +1 -1
- package/build/queries/sql/Tables.cjs.map +1 -1
- package/build/queries/sql/Tables.d.cts.map +1 -1
- package/build/queries/sql/Tables.d.mts.map +1 -1
- package/build/queries/sql/Tables.js +1 -1
- package/build/queries/sql/Tables.js.map +1 -1
- package/build/queries/sql/execute.cjs +1 -1
- package/build/queries/sql/execute.cjs.map +1 -1
- package/build/queries/sql/execute.js +1 -1
- package/build/queries/sql/execute.js.map +1 -1
- package/build/queries/sql/expressions/arrayAgg.cjs.map +1 -1
- package/build/queries/sql/expressions/arrayAgg.js.map +1 -1
- package/build/queries/sql/expressions/case.cjs.map +1 -1
- package/build/queries/sql/expressions/case.js.map +1 -1
- package/build/queries/sql/expressions/coalesce.cjs.map +1 -1
- package/build/queries/sql/expressions/coalesce.js.map +1 -1
- package/build/queries/sql/expressions/codecs.cjs +2 -2
- package/build/queries/sql/expressions/codecs.cjs.map +1 -1
- package/build/queries/sql/expressions/codecs.js +1 -1
- package/build/queries/sql/expressions/codecs.js.map +1 -1
- package/build/queries/sql/expressions/expression.cjs.map +1 -1
- package/build/queries/sql/expressions/expression.d.cts.map +1 -1
- package/build/queries/sql/expressions/expression.d.mts.map +1 -1
- package/build/queries/sql/expressions/expression.js.map +1 -1
- package/build/queries/sql/expressions/greatest.cjs.map +1 -1
- package/build/queries/sql/expressions/greatest.js.map +1 -1
- package/build/queries/sql/expressions/least.cjs.map +1 -1
- package/build/queries/sql/expressions/least.js.map +1 -1
- package/build/queries/sql/expressions/nullIf.cjs.map +1 -1
- package/build/queries/sql/expressions/nullIf.js.map +1 -1
- package/build/queries/sql/expressions/parseExpression.cjs.map +1 -1
- package/build/queries/sql/expressions/parseExpression.js.map +1 -1
- package/build/queries/sql/expressions/types.d.cts.map +1 -1
- package/build/queries/sql/expressions/types.d.mts.map +1 -1
- package/build/queries/sql/query.cjs +1 -1
- package/build/queries/sql/query.cjs.map +1 -1
- package/build/queries/sql/query.d.cts +1 -1
- package/build/queries/sql/query.d.mts +1 -1
- package/build/queries/sql/query.js +1 -1
- package/build/queries/sql/query.js.map +1 -1
- package/build/{unnest.cjs → queries/unnest.cjs} +1 -2
- package/build/queries/unnest.cjs.map +1 -0
- package/build/{unnest.d.cts → queries/unnest.d.cts} +3 -3
- package/build/queries/unnest.d.cts.map +1 -0
- package/build/{unnest.d.mts → queries/unnest.d.mts} +3 -3
- package/build/queries/unnest.d.mts.map +1 -0
- package/build/{unnest.js → queries/unnest.js} +1 -2
- package/build/queries/unnest.js.map +1 -0
- package/build/queries/valueFilters.cjs.map +1 -1
- package/build/queries/valueFilters.d.cts +1 -1
- package/build/queries/valueFilters.d.cts.map +1 -1
- package/build/queries/valueFilters.d.mts +1 -1
- package/build/queries/valueFilters.d.mts.map +1 -1
- package/build/queries/valueFilters.js.map +1 -1
- package/build/{ReactionsManager.cjs → reactivity/ReactionsManager.cjs} +8 -10
- package/build/reactivity/ReactionsManager.cjs.map +1 -0
- package/build/{ReactionsManager.d.cts → reactivity/ReactionsManager.d.cts} +5 -6
- package/build/reactivity/ReactionsManager.d.cts.map +1 -0
- package/build/{ReactionsManager.d.mts → reactivity/ReactionsManager.d.mts} +5 -6
- package/build/reactivity/ReactionsManager.d.mts.map +1 -0
- package/build/{ReactionsManager.js → reactivity/ReactionsManager.js} +6 -8
- package/build/reactivity/ReactionsManager.js.map +1 -0
- package/build/{reactiveHints.cjs → reactivity/reactiveHints.cjs} +12 -16
- package/build/reactivity/reactiveHints.cjs.map +1 -0
- package/build/{reactiveHints.d.cts → reactivity/reactiveHints.d.cts} +17 -17
- package/build/reactivity/reactiveHints.d.cts.map +1 -0
- package/build/{reactiveHints.d.mts → reactivity/reactiveHints.d.mts} +17 -17
- package/build/reactivity/reactiveHints.d.mts.map +1 -0
- package/build/{reactiveHints.js → reactivity/reactiveHints.js} +12 -16
- package/build/reactivity/reactiveHints.js.map +1 -0
- package/build/relations/AbstractRelationImpl.cjs.map +1 -1
- package/build/relations/AbstractRelationImpl.js.map +1 -1
- package/build/relations/AsyncProperty.cjs.map +1 -1
- package/build/relations/AsyncProperty.js.map +1 -1
- package/build/relations/AsyncReactiveField.cjs +6 -6
- package/build/relations/AsyncReactiveField.cjs.map +1 -1
- package/build/relations/AsyncReactiveField.d.cts +1 -1
- package/build/relations/AsyncReactiveField.d.mts +1 -1
- package/build/relations/AsyncReactiveField.js +4 -4
- package/build/relations/AsyncReactiveField.js.map +1 -1
- package/build/relations/Collection.cjs +1 -1
- package/build/relations/Collection.cjs.map +1 -1
- package/build/relations/Collection.js +1 -1
- package/build/relations/Collection.js.map +1 -1
- package/build/relations/CustomCollection.cjs.map +1 -1
- package/build/relations/CustomCollection.d.cts +1 -1
- package/build/relations/CustomCollection.d.mts +1 -1
- package/build/relations/CustomCollection.js.map +1 -1
- package/build/relations/CustomReference.cjs +1 -1
- package/build/relations/CustomReference.cjs.map +1 -1
- package/build/relations/CustomReference.d.cts +1 -1
- package/build/relations/CustomReference.d.mts +1 -1
- package/build/relations/CustomReference.js +1 -1
- package/build/relations/CustomReference.js.map +1 -1
- package/build/relations/EnumCollection.cjs.map +1 -1
- package/build/relations/EnumCollection.d.cts +1 -1
- package/build/relations/EnumCollection.d.mts +1 -1
- package/build/relations/EnumCollection.js.map +1 -1
- package/build/relations/LazyField.cjs +4 -4
- package/build/relations/LazyField.cjs.map +1 -1
- package/build/relations/LazyField.js +4 -4
- package/build/relations/LazyField.js.map +1 -1
- package/build/relations/ManyToManyCollection.cjs +3 -3
- package/build/relations/ManyToManyCollection.cjs.map +1 -1
- package/build/relations/ManyToManyCollection.js +3 -3
- package/build/relations/ManyToManyCollection.js.map +1 -1
- package/build/relations/ManyToManyLargeCollection.cjs +3 -3
- package/build/relations/ManyToManyLargeCollection.cjs.map +1 -1
- package/build/relations/ManyToManyLargeCollection.js +3 -3
- package/build/relations/ManyToManyLargeCollection.js.map +1 -1
- package/build/relations/ManyToOneReference.cjs +4 -4
- package/build/relations/ManyToOneReference.cjs.map +1 -1
- package/build/relations/ManyToOneReference.js +4 -4
- package/build/relations/ManyToOneReference.js.map +1 -1
- package/build/relations/OneToManyCollection.cjs +1 -2
- package/build/relations/OneToManyCollection.cjs.map +1 -1
- package/build/relations/OneToManyCollection.d.cts +1 -1
- package/build/relations/OneToManyCollection.d.mts +1 -1
- package/build/relations/OneToManyCollection.js +1 -2
- package/build/relations/OneToManyCollection.js.map +1 -1
- package/build/relations/OneToManyLargeCollection.cjs +1 -1
- package/build/relations/OneToManyLargeCollection.cjs.map +1 -1
- package/build/relations/OneToManyLargeCollection.js +1 -1
- package/build/relations/OneToManyLargeCollection.js.map +1 -1
- package/build/relations/OneToOneReference.cjs +5 -5
- package/build/relations/OneToOneReference.cjs.map +1 -1
- package/build/relations/OneToOneReference.js +5 -5
- package/build/relations/OneToOneReference.js.map +1 -1
- package/build/relations/PolymorphicReference.cjs +3 -3
- package/build/relations/PolymorphicReference.cjs.map +1 -1
- package/build/relations/PolymorphicReference.js +3 -3
- package/build/relations/PolymorphicReference.js.map +1 -1
- package/build/relations/ReactiveField.cjs +5 -6
- package/build/relations/ReactiveField.cjs.map +1 -1
- package/build/relations/ReactiveField.d.cts +2 -2
- package/build/relations/ReactiveField.d.mts +2 -2
- package/build/relations/ReactiveField.js +3 -4
- package/build/relations/ReactiveField.js.map +1 -1
- package/build/relations/ReactiveGetter.cjs +0 -1
- package/build/relations/ReactiveGetter.cjs.map +1 -1
- package/build/relations/ReactiveGetter.d.cts +1 -1
- package/build/relations/ReactiveGetter.d.mts +1 -1
- package/build/relations/ReactiveGetter.js +0 -1
- package/build/relations/ReactiveGetter.js.map +1 -1
- package/build/relations/ReactiveManyToMany.cjs +5 -6
- package/build/relations/ReactiveManyToMany.cjs.map +1 -1
- package/build/relations/ReactiveManyToMany.d.cts +2 -2
- package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
- package/build/relations/ReactiveManyToMany.d.mts +2 -2
- package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
- package/build/relations/ReactiveManyToMany.js +3 -4
- package/build/relations/ReactiveManyToMany.js.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.cjs +1 -3
- package/build/relations/ReactiveManyToManyOtherSide.cjs.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.d.cts +2 -2
- package/build/relations/ReactiveManyToManyOtherSide.d.mts +2 -2
- package/build/relations/ReactiveManyToManyOtherSide.js +1 -3
- package/build/relations/ReactiveManyToManyOtherSide.js.map +1 -1
- package/build/relations/ReactiveReference.cjs +8 -9
- package/build/relations/ReactiveReference.cjs.map +1 -1
- package/build/relations/ReactiveReference.d.cts +2 -2
- package/build/relations/ReactiveReference.d.cts.map +1 -1
- package/build/relations/ReactiveReference.d.mts +2 -2
- package/build/relations/ReactiveReference.d.mts.map +1 -1
- package/build/relations/ReactiveReference.js +6 -7
- package/build/relations/ReactiveReference.js.map +1 -1
- package/build/relations/ReadOnlyCollection.cjs.map +1 -1
- package/build/relations/ReadOnlyCollection.js.map +1 -1
- package/build/relations/RecursiveCollection.cjs +3 -4
- package/build/relations/RecursiveCollection.cjs.map +1 -1
- package/build/relations/RecursiveCollection.d.cts +1 -1
- package/build/relations/RecursiveCollection.d.mts +1 -1
- package/build/relations/RecursiveCollection.js +3 -4
- package/build/relations/RecursiveCollection.js.map +1 -1
- package/build/relations/RecursiveCycleError.cjs.map +1 -1
- package/build/relations/RecursiveCycleError.js.map +1 -1
- package/build/relations/Reference.cjs +1 -1
- package/build/relations/Reference.cjs.map +1 -1
- package/build/relations/Reference.js +1 -1
- package/build/relations/Reference.js.map +1 -1
- package/build/relations/Relation.cjs.map +1 -1
- package/build/relations/Relation.js.map +1 -1
- package/build/relations/hasAsyncMethod.cjs +2 -2
- package/build/relations/hasAsyncMethod.cjs.map +1 -1
- package/build/relations/hasAsyncMethod.d.cts +1 -1
- package/build/relations/hasAsyncMethod.d.mts +1 -1
- package/build/relations/hasAsyncMethod.js +1 -1
- package/build/relations/hasAsyncMethod.js.map +1 -1
- package/build/relations/hasManyDerived.cjs +3 -3
- package/build/relations/hasManyDerived.cjs.map +1 -1
- package/build/relations/hasManyDerived.d.cts +1 -1
- package/build/relations/hasManyDerived.d.mts +1 -1
- package/build/relations/hasManyDerived.js +2 -2
- package/build/relations/hasManyDerived.js.map +1 -1
- package/build/relations/hasManyThrough.cjs +6 -6
- package/build/relations/hasManyThrough.cjs.map +1 -1
- package/build/relations/hasManyThrough.d.cts +1 -1
- package/build/relations/hasManyThrough.d.mts +1 -1
- package/build/relations/hasManyThrough.js +2 -2
- package/build/relations/hasManyThrough.js.map +1 -1
- package/build/relations/hasOneDerived.cjs +3 -3
- package/build/relations/hasOneDerived.cjs.map +1 -1
- package/build/relations/hasOneDerived.d.cts +1 -1
- package/build/relations/hasOneDerived.d.mts +1 -1
- package/build/relations/hasOneDerived.js +2 -2
- package/build/relations/hasOneDerived.js.map +1 -1
- package/build/relations/hasOneThrough.cjs +7 -7
- package/build/relations/hasOneThrough.cjs.map +1 -1
- package/build/relations/hasOneThrough.d.cts +1 -1
- package/build/relations/hasOneThrough.d.mts +1 -1
- package/build/relations/hasOneThrough.js +2 -2
- package/build/relations/hasOneThrough.js.map +1 -1
- package/build/relations/hasProperty.cjs +4 -4
- package/build/relations/hasProperty.cjs.map +1 -1
- package/build/relations/hasProperty.d.cts +2 -2
- package/build/relations/hasProperty.d.mts +2 -2
- package/build/relations/hasProperty.js +2 -2
- package/build/relations/hasProperty.js.map +1 -1
- package/build/relations/index.cjs +10 -10
- package/build/relations/index.js +10 -10
- package/build/relations/isCascadeDelete.cjs.map +1 -1
- package/build/relations/isCascadeDelete.js.map +1 -1
- package/build/resurrection.cjs.map +1 -1
- package/build/resurrection.js.map +1 -1
- package/build/rules.cjs +3 -4
- package/build/rules.cjs.map +1 -1
- package/build/rules.d.cts +1 -1
- package/build/rules.d.mts +1 -1
- package/build/rules.js +3 -4
- package/build/rules.js.map +1 -1
- package/build/runtimeConfig.cjs.map +1 -1
- package/build/runtimeConfig.js.map +1 -1
- package/build/{TypeInfo.cjs → serde/TypeInfo.cjs} +1 -1
- package/build/serde/TypeInfo.cjs.map +1 -0
- package/build/{TypeInfo.d.cts → serde/TypeInfo.d.cts} +2 -2
- package/build/serde/TypeInfo.d.cts.map +1 -0
- package/build/{TypeInfo.d.mts → serde/TypeInfo.d.mts} +2 -2
- package/build/serde/TypeInfo.d.mts.map +1 -0
- package/build/{TypeInfo.js → serde/TypeInfo.js} +1 -1
- package/build/serde/TypeInfo.js.map +1 -0
- package/build/{columns.cjs → serde/columns.cjs} +1 -1
- package/build/serde/columns.cjs.map +1 -0
- package/build/{columns.d.cts → serde/columns.d.cts} +2 -2
- package/build/serde/columns.d.cts.map +1 -0
- package/build/{columns.d.mts → serde/columns.d.mts} +2 -2
- package/build/serde/columns.d.mts.map +1 -0
- package/build/{columns.js → serde/columns.js} +1 -1
- package/build/serde/columns.js.map +1 -0
- package/build/{fieldSerde.cjs → serde/fieldSerde.cjs} +6 -6
- package/build/serde/fieldSerde.cjs.map +1 -0
- package/build/{fieldSerde.d.cts → serde/fieldSerde.d.cts} +5 -5
- package/build/serde/fieldSerde.d.cts.map +1 -0
- package/build/{fieldSerde.d.mts → serde/fieldSerde.d.mts} +5 -5
- package/build/serde/fieldSerde.d.mts.map +1 -0
- package/build/{fieldSerde.js → serde/fieldSerde.js} +6 -6
- package/build/serde/fieldSerde.js.map +1 -0
- package/build/{serde.cjs → serde/serde.cjs} +25 -26
- package/build/serde/serde.cjs.map +1 -0
- package/build/{serde.d.cts → serde/serde.d.cts} +1 -1
- package/build/serde/serde.d.cts.map +1 -0
- package/build/{serde.d.mts → serde/serde.d.mts} +1 -1
- package/build/serde/serde.d.mts.map +1 -0
- package/build/{serde.js → serde/serde.js} +4 -5
- package/build/serde/serde.js.map +1 -0
- package/build/{temporal.cjs → serde/temporal.cjs} +1 -1
- package/build/serde/temporal.cjs.map +1 -0
- package/build/{temporal.d.cts → serde/temporal.d.cts} +1 -1
- package/build/serde/temporal.d.cts.map +1 -0
- package/build/{temporal.d.mts → serde/temporal.d.mts} +1 -1
- package/build/serde/temporal.d.mts.map +1 -0
- package/build/{temporal.js → serde/temporal.js} +1 -1
- package/build/serde/temporal.js.map +1 -0
- package/build/{temporalMappers.cjs → serde/temporalMappers.cjs} +4 -5
- package/build/serde/temporalMappers.cjs.map +1 -0
- package/build/{temporalMappers.d.cts → serde/temporalMappers.d.cts} +1 -1
- package/build/serde/temporalMappers.d.cts.map +1 -0
- package/build/{temporalMappers.d.mts → serde/temporalMappers.d.mts} +1 -1
- package/build/serde/temporalMappers.d.mts.map +1 -0
- package/build/{temporalMappers.js → serde/temporalMappers.js} +2 -3
- package/build/serde/temporalMappers.js.map +1 -0
- package/build/upsert.cjs +1 -1
- package/build/upsert.cjs.map +1 -1
- package/build/upsert.d.cts.map +1 -1
- package/build/upsert.d.mts.map +1 -1
- package/build/upsert.js +1 -1
- package/build/upsert.js.map +1 -1
- package/build/utils.cjs +0 -1
- package/build/utils.cjs.map +1 -1
- package/build/utils.d.cts +1 -1
- package/build/utils.d.mts +1 -1
- package/build/utils.js +0 -1
- package/build/utils.js.map +1 -1
- package/package.json +2 -2
- package/build/FlushLock.cjs.map +0 -1
- package/build/FlushLock.d.cts.map +0 -1
- package/build/FlushLock.d.mts.map +0 -1
- package/build/FlushLock.js.map +0 -1
- package/build/HintTree.cjs.map +0 -1
- package/build/HintTree.d.cts.map +0 -1
- package/build/HintTree.d.mts.map +0 -1
- package/build/HintTree.js.map +0 -1
- package/build/IsLoadedCache.d.cts.map +0 -1
- package/build/IsLoadedCache.d.mts.map +0 -1
- package/build/IsLoadedCache.js.map +0 -1
- package/build/JoinRows.cjs.map +0 -1
- package/build/JoinRows.d.cts.map +0 -1
- package/build/JoinRows.d.mts.map +0 -1
- package/build/JoinRows.js.map +0 -1
- package/build/PendingChanges.d.cts.map +0 -1
- package/build/PendingChanges.d.mts.map +0 -1
- package/build/PendingChanges.js +0 -2
- package/build/ReactionsManager.cjs.map +0 -1
- package/build/ReactionsManager.d.cts.map +0 -1
- package/build/ReactionsManager.d.mts.map +0 -1
- package/build/ReactionsManager.js.map +0 -1
- package/build/Todo.cjs.map +0 -1
- package/build/Todo.d.cts.map +0 -1
- package/build/Todo.d.mts.map +0 -1
- package/build/Todo.js.map +0 -1
- package/build/TypeInfo.cjs.map +0 -1
- package/build/TypeInfo.d.cts.map +0 -1
- package/build/TypeInfo.d.mts.map +0 -1
- package/build/TypeInfo.js.map +0 -1
- package/build/columns.cjs.map +0 -1
- package/build/columns.d.cts.map +0 -1
- package/build/columns.d.mts.map +0 -1
- package/build/columns.js.map +0 -1
- package/build/driverApi.cjs +0 -18
- package/build/driverApi.cjs.map +0 -1
- package/build/driverApi.d.cts +0 -22
- package/build/driverApi.d.cts.map +0 -1
- package/build/driverApi.d.mts +0 -22
- package/build/driverApi.d.mts.map +0 -1
- package/build/driverApi.js +0 -18
- package/build/driverApi.js.map +0 -1
- package/build/fieldSerde.cjs.map +0 -1
- package/build/fieldSerde.d.cts.map +0 -1
- package/build/fieldSerde.d.mts.map +0 -1
- package/build/fieldSerde.js.map +0 -1
- package/build/loadHints.cjs.map +0 -1
- package/build/loadHints.d.cts.map +0 -1
- package/build/loadHints.d.mts.map +0 -1
- package/build/loadHints.js.map +0 -1
- package/build/loadLens.cjs.map +0 -1
- package/build/loadLens.d.cts.map +0 -1
- package/build/loadLens.d.mts.map +0 -1
- package/build/loadLens.js.map +0 -1
- package/build/reactiveHints.cjs.map +0 -1
- package/build/reactiveHints.d.cts.map +0 -1
- package/build/reactiveHints.d.mts.map +0 -1
- package/build/reactiveHints.js.map +0 -1
- package/build/serde.cjs.map +0 -1
- package/build/serde.d.cts.map +0 -1
- package/build/serde.d.mts.map +0 -1
- package/build/serde.js.map +0 -1
- package/build/temporal.cjs.map +0 -1
- package/build/temporal.d.cts.map +0 -1
- package/build/temporal.d.mts.map +0 -1
- package/build/temporal.js.map +0 -1
- package/build/temporalMappers.cjs.map +0 -1
- package/build/temporalMappers.d.cts.map +0 -1
- package/build/temporalMappers.d.mts.map +0 -1
- package/build/temporalMappers.js.map +0 -1
- package/build/unnest.cjs.map +0 -1
- package/build/unnest.d.cts.map +0 -1
- package/build/unnest.d.mts.map +0 -1
- package/build/unnest.js.map +0 -1
- package/build/withLoaded.cjs.map +0 -1
- package/build/withLoaded.d.cts.map +0 -1
- package/build/withLoaded.d.mts.map +0 -1
- package/build/withLoaded.js.map +0 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { TypeInfo } from "./TypeInfo.cjs";
|
|
2
2
|
import { ScalarCodec } from "./serde.cjs";
|
|
3
3
|
import { Column } from "./columns.cjs";
|
|
4
|
-
import { InsertFixup } from "
|
|
5
|
-
import { RowData } from "
|
|
6
|
-
import { EntityMetadata, Field, PolymorphicField, PolymorphicFieldComponent, SerdeField } from "
|
|
7
|
-
import { Entity } from "
|
|
8
|
-
//#region src/fieldSerde.d.ts
|
|
4
|
+
import { InsertFixup } from "../drivers/EntityWriter.cjs";
|
|
5
|
+
import { RowData } from "../RowData.cjs";
|
|
6
|
+
import { EntityMetadata, Field, PolymorphicField, PolymorphicFieldComponent, SerdeField } from "../EntityMetadata.cjs";
|
|
7
|
+
import { Entity } from "../Entity.cjs";
|
|
8
|
+
//#region src/serde/fieldSerde.d.ts
|
|
9
9
|
declare function hasSerde(field: Field): field is SerdeField;
|
|
10
10
|
/** Entity hydration and flush bindings; a polymorphic relationship spans several physical columns. */
|
|
11
11
|
interface FieldSerde {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldSerde.d.cts","names":[],"sources":["../../src/serde/fieldSerde.ts"],"mappings":";;;;;;;;iBAkBgB,SAAS,OAAO,QAAQ,SAAS;;UAKhC;EACf,SAAS;;EAET,QAAQ,SAAS,SAAS;;UAGX,eAAe,WAAW;EACzC,WAAW,KAAK,OAAO;EACvB,QAAQ;;;cAIG;WAEA;WACA,QAAQ;EAFnB,YACW,mBACA,QAAQ;MAEf,SAFe;MAKf;MAGA;MAGA;MAGA;MAGA,qBAAU;MAGV;MAGA;MAGA;MAGA;MAGA;MAGA;MAGA;MAGA,cAxBU;EA2Bd,QAAQ;EAGR,aAAa;EAGb,UAAU;EAGV,eAAe;;EAKf,QAAQ,WAAW,QAAQ,QAAQ,mBAAmB,QAAQ;;EAkB9D,SAAS;;;cAME,yBAAyB,uBAAuB;WAClD,SAAS;;EAElB,QAAQ,SAAS,SAAS;EAG1B,WAAW,KAAK;;;cAML,+BAA+B;WAG/B;WAFF,SAAS;EAClB,YACW,mBACT,YAAY;;EAKd,QAAQ,SAAS,SAAS;;;iBAcZ,iBACd,mBACA,mBACA,YAAY,8BACX;;cAaU,yBAAyB;WAEzB,QAAQ;WACR;mBACQ;EAHnB,YACW,QAAQ,QACR,wBACQ,gBAAe;MAE9B;MAGA,uBAAuB;;;cAMvB,+BAA+B;mBAGhB;mBACA;EAHnB,YACE,mBACiB,WAAW,2BACX,YAAY;MAI3B,uBAAa;;EAKjB,aAAa;EAqBb,QAAQ;EAGR,SAAS"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { TypeInfo } from "./TypeInfo.mjs";
|
|
2
2
|
import { ScalarCodec } from "./serde.mjs";
|
|
3
3
|
import { Column } from "./columns.mjs";
|
|
4
|
-
import { InsertFixup } from "
|
|
5
|
-
import { RowData } from "
|
|
6
|
-
import { EntityMetadata, Field, PolymorphicField, PolymorphicFieldComponent, SerdeField } from "
|
|
7
|
-
import { Entity } from "
|
|
8
|
-
//#region src/fieldSerde.d.ts
|
|
4
|
+
import { InsertFixup } from "../drivers/EntityWriter.mjs";
|
|
5
|
+
import { RowData } from "../RowData.mjs";
|
|
6
|
+
import { EntityMetadata, Field, PolymorphicField, PolymorphicFieldComponent, SerdeField } from "../EntityMetadata.mjs";
|
|
7
|
+
import { Entity } from "../Entity.mjs";
|
|
8
|
+
//#region src/serde/fieldSerde.d.ts
|
|
9
9
|
declare function hasSerde(field: Field): field is SerdeField;
|
|
10
10
|
/** Entity hydration and flush bindings; a polymorphic relationship spans several physical columns. */
|
|
11
11
|
interface FieldSerde {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldSerde.d.mts","names":[],"sources":["../../src/serde/fieldSerde.ts"],"mappings":";;;;;;;;iBAkBgB,SAAS,OAAO,QAAQ,SAAS;;UAKhC;EACf,SAAS;;EAET,QAAQ,SAAS,SAAS;;UAGX,eAAe,WAAW;EACzC,WAAW,KAAK,OAAO;EACvB,QAAQ;;;cAIG;WAEA;WACA,QAAQ;EAFnB,YACW,mBACA,QAAQ;MAEf,SAFe;MAKf;MAGA;MAGA;MAGA;MAGA,qBAAU;MAGV;MAGA;MAGA;MAGA;MAGA;MAGA;MAGA;MAGA,cAxBU;EA2Bd,QAAQ;EAGR,aAAa;EAGb,UAAU;EAGV,eAAe;;EAKf,QAAQ,WAAW,QAAQ,QAAQ,mBAAmB,QAAQ;;EAkB9D,SAAS;;;cAME,yBAAyB,uBAAuB;WAClD,SAAS;;EAElB,QAAQ,SAAS,SAAS;EAG1B,WAAW,KAAK;;;cAML,+BAA+B;WAG/B;WAFF,SAAS;EAClB,YACW,mBACT,YAAY;;EAKd,QAAQ,SAAS,SAAS;;;iBAcZ,iBACd,mBACA,mBACA,YAAY,8BACX;;cAaU,yBAAyB;WAEzB,QAAQ;WACR;mBACQ;EAHnB,YACW,QAAQ,QACR,wBACQ,gBAAe;MAE9B;MAGA,uBAAuB;;;cAMvB,+BAA+B;mBAGhB;mBACA;EAHnB,YACE,mBACiB,WAAW,2BACX,YAAY;MAI3B,uBAAa;;EAKjB,aAAa;EAqBb,QAAQ;EAGR,SAAS"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { getConstructorFromTaggedId } from "
|
|
4
|
-
import { getBaseMeta, getMetadata } from "
|
|
5
|
-
import { isEntity } from "
|
|
6
|
-
//#region src/fieldSerde.ts
|
|
1
|
+
import { maybeResolveReferenceToId } from "../keys.js";
|
|
2
|
+
import { groupBy } from "../utils.js";
|
|
3
|
+
import { getConstructorFromTaggedId } from "../configure.js";
|
|
4
|
+
import { getBaseMeta, getMetadata } from "../EntityMetadata.js";
|
|
5
|
+
import { isEntity } from "../Entity.js";
|
|
6
|
+
//#region src/serde/fieldSerde.ts
|
|
7
7
|
function hasSerde(field) {
|
|
8
8
|
return !!field.serde;
|
|
9
9
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldSerde.js","names":[],"sources":["../../src/serde/fieldSerde.ts"],"sourcesContent":["import { getConstructorFromTaggedId } from \"src/configure.ts\";\nimport type { InsertFixup } from \"src/drivers/EntityWriter.ts\";\nimport { type Entity, isEntity } from \"src/Entity.ts\";\nimport {\n type EntityMetadata,\n type Field,\n type PolymorphicField,\n type PolymorphicFieldComponent,\n type SerdeField,\n getBaseMeta,\n getMetadata,\n} from \"src/EntityMetadata.ts\";\nimport { maybeResolveReferenceToId } from \"src/keys.ts\";\nimport type { RowData } from \"src/RowData.ts\";\nimport type { Column } from \"src/serde/columns.ts\";\nimport type { TimestampCodec } from \"src/serde/serde.ts\";\nimport { groupBy } from \"src/utils.ts\";\n\nexport function hasSerde(field: Field): field is SerdeField {\n return !!field.serde;\n}\n\n/** Entity hydration and flush bindings; a polymorphic relationship spans several physical columns. */\nexport interface FieldSerde {\n columns: FieldColumn[];\n /** Decode one domain value from accessed cells; callers own entity assignment and caching. */\n fromRow(rowData: RowData, rowIndex: number): unknown;\n}\n\nexport interface TimestampSerde<T> extends FieldSerde {\n mapFromNow(now: Date): T;\n dbValue(data: any): any;\n}\n\n/** Binds a physical column to entity data without adding a second codec or storage declaration. */\nexport class FieldColumn {\n constructor(\n readonly fieldName: string,\n readonly column: Column,\n ) {}\n get codec() {\n return this.column.codec;\n }\n get insertOptional() {\n return this.column.insertOptional;\n }\n get writable() {\n return this.column.writable;\n }\n get insert() {\n return this.column.insert;\n }\n get update() {\n return this.column.update;\n }\n get idMetadata() {\n return this.column.idMetadata;\n }\n get columnName(): string {\n return this.column.columnName;\n }\n get dbType(): string {\n return this.column.dbType;\n }\n get isArray(): boolean {\n return this.column.isArray;\n }\n get isNullableArray(): boolean {\n return this.column.isNullableArray;\n }\n get sqlNullable(): boolean {\n return this.column.sqlNullable;\n }\n get hasDefault(): boolean {\n return this.column.hasDefault;\n }\n get isGenerated(): boolean {\n return this.column.isGenerated;\n }\n get outputType() {\n return this.column.outputType;\n }\n mapToDb(value: any): any {\n return this.column.mapToDb(value);\n }\n mapToDbValue(value: unknown): unknown {\n return this.column.mapToDbValue(value);\n }\n mapFromDb(value: unknown): unknown {\n return this.column.mapFromDb(value);\n }\n mapFromJsonAgg(value: any): any {\n return this.column.mapFromJsonAgg(value);\n }\n\n /** Defers FK writes whose new target must be inserted after this entity. */\n dbValue(data: any, entity: Entity, tableName: string, fixups: InsertFixup[] | undefined): any {\n const value = data[this.fieldName];\n if (\n this.column.idMetadata &&\n fixups &&\n isEntity(value) &&\n value.isNewEntity &&\n getMetadata(value).nonDeferredFkOrder &&\n getMetadata(entity).nonDeferredFkOrder &&\n getMetadata(value).nonDeferredFkOrder! >= getMetadata(entity).nonDeferredFkOrder!\n ) {\n fixups.push({ entity, tableName, column: this, value: this.mapToDbValue(maybeResolveReferenceToId(value)) });\n return null;\n }\n return this.mapToDbValue(value);\n }\n\n /** Reconstruct the driver's row representation, which can differ from write bindings for Date and JSON. */\n rowValue(data: any): any {\n return this.column.codec.mapToRow(data[this.fieldName]);\n }\n}\n\n/** Binds one entity field to its physical column. */\nexport class SimpleFieldSerde extends FieldColumn implements FieldSerde {\n readonly columns: FieldColumn[] = [this];\n /** Decode this field's physical column without changing entity data. */\n fromRow(rowData: RowData, rowIndex: number): unknown {\n return this.column.mapFromDb(rowData.get(rowIndex, this.column.columnName));\n }\n mapFromNow(now: Date): unknown {\n return (this.column.codec as TimestampCodec<unknown>).mapFromNow(now);\n }\n}\n\n/** A polymorphic field selects exactly one component while each physical column retains a scalar ID codec. */\nexport class PolymorphicKeySerde implements FieldSerde {\n readonly columns: PolymorphicFieldColumn[];\n constructor(\n readonly fieldName: string,\n components: PolymorphicFieldComponent[],\n ) {\n this.columns = components.map((component) => new PolymorphicFieldColumn(fieldName, component, components));\n }\n /** Select the first truthy component whose decoded ID is not nullish. */\n fromRow(rowData: RowData, rowIndex: number): unknown {\n let decoded: unknown;\n for (const column of this.columns) {\n const value = rowData.get(rowIndex, column.columnName);\n if (value) {\n decoded = column.mapFromDb(value);\n if (decoded != null) return decoded;\n }\n }\n return decoded;\n }\n}\n\n/** Shares domain components between relationship traversal and entity write selection. */\nexport function polymorphicField(\n fieldName: string,\n required: boolean,\n components: PolymorphicFieldComponent[],\n): PolymorphicField {\n return {\n kind: \"poly\",\n fieldName,\n fieldIdName: `${fieldName}Id`,\n required,\n components,\n serde: new PolymorphicKeySerde(fieldName, components),\n immutable: false,\n };\n}\n\n/** A domain relationship component references storage and only overrides a specialized domain target. */\nexport class PolyComponent implements PolymorphicFieldComponent {\n constructor(\n readonly column: Column,\n readonly otherFieldName: string,\n private readonly target?: () => EntityMetadata,\n ) {}\n get columnName(): string {\n return this.column.columnName;\n }\n get otherMetadata(): () => EntityMetadata {\n return this.target ?? this.column.idMetadata!;\n }\n}\n\n/** Selects a relationship component for entity writes only; direct SQL writes use its scalar column codec. */\nclass PolymorphicFieldColumn extends FieldColumn {\n constructor(\n fieldName: string,\n private readonly component: PolymorphicFieldComponent,\n private readonly components: PolymorphicFieldComponent[],\n ) {\n super(fieldName, component.column);\n }\n get otherMetadata() {\n return this.component.otherMetadata;\n }\n\n /** Preserve exact subtype selection when multiple components share a base type. */\n mapToDbValue(value: unknown): unknown {\n const id = maybeResolveReferenceToId(value as Parameters<typeof maybeResolveReferenceToId>[0]);\n const cstr = isEntity(value) ? getMetadata(value).cstr : id ? getConstructorFromTaggedId(id) : undefined;\n // If our poly has multiple components from the same base type, i.e.\n // `parent_small_publisher_id` and `parent_large_publisher_id`, then we\n // need slightly different logic...\n const hasMultipleComponentsWithSameBaseType = [\n ...groupBy(this.components, (component) => getBaseMeta(component.otherMetadata()).type).values(),\n ].some((group) => group.length > 1);\n const otherMeta = this.otherMetadata();\n // We'll have multiple columns, i.e. [parent_author_id, parent_book_id], and each column\n // will only return a value if the `id` matches its type, i.e. `parent_author_id=a:1` will\n // return 1, but `parent_book_id` will return null.\n const applies = hasMultipleComponentsWithSameBaseType\n ? cstr === otherMeta.cstr\n : cstr === otherMeta.cstr ||\n cstr === getBaseMeta(otherMeta).cstr ||\n otherMeta.subTypes.some((subTypeMeta) => cstr === subTypeMeta.cstr);\n return applies ? this.column.mapToDbValue(id) : undefined;\n }\n // Polymorphic writes historically do not schedule non-deferred FK fixups.\n dbValue(data: any): any {\n return this.mapToDbValue(data[this.fieldName]);\n }\n rowValue(data: any): any {\n return this.dbValue(data);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const require_runtimeConfig = require("
|
|
6
|
-
const
|
|
7
|
-
require("
|
|
8
|
-
|
|
9
|
-
//#region src/serde.ts
|
|
2
|
+
const require_serde_temporal = require("./temporal.cjs");
|
|
3
|
+
const require_keys = require("../keys.cjs");
|
|
4
|
+
const require_serde_TypeInfo = require("./TypeInfo.cjs");
|
|
5
|
+
const require_runtimeConfig = require("../runtimeConfig.cjs");
|
|
6
|
+
const require_serde_temporalMappers = require("./temporalMappers.cjs");
|
|
7
|
+
const require_EntityManager = require("../EntityManager.cjs");
|
|
8
|
+
//#region src/serde/serde.ts
|
|
10
9
|
const runtimeRequire = (0, require("node:module").createRequire)(require("url").pathToFileURL(__filename).href);
|
|
11
10
|
var CustomSerdeAdapter = class CustomSerdeAdapter {
|
|
12
11
|
dbType;
|
|
@@ -20,7 +19,7 @@ var CustomSerdeAdapter = class CustomSerdeAdapter {
|
|
|
20
19
|
/** Only known adapters share their mapper's identity and elementwise array conversion. */
|
|
21
20
|
get outputType() {
|
|
22
21
|
if (this.isArray !== this.dbType.endsWith("[]") || this.constructor !== CustomSerdeAdapter && this.constructor !== PlainDateSerde && this.constructor !== PlainTimeSerde && this.constructor !== PlainDateTimeSerde && this.constructor !== ZonedDateTimeSerde) return;
|
|
23
|
-
const dbType =
|
|
22
|
+
const dbType = require_serde_TypeInfo.canonicalDbType(this.dbType);
|
|
24
23
|
const elementType = this.isArray ? dbType.slice(0, -2) : dbType;
|
|
25
24
|
const outputType = {
|
|
26
25
|
dbType: elementType,
|
|
@@ -28,7 +27,7 @@ var CustomSerdeAdapter = class CustomSerdeAdapter {
|
|
|
28
27
|
arrayElementSafe: elementType !== "numeric"
|
|
29
28
|
};
|
|
30
29
|
if (!this.isArray) return outputType;
|
|
31
|
-
return
|
|
30
|
+
return require_serde_TypeInfo.arrayOutputType(outputType) || [
|
|
32
31
|
"date",
|
|
33
32
|
"time",
|
|
34
33
|
"timestamp",
|
|
@@ -74,7 +73,7 @@ var PrimitiveSerde = class PrimitiveSerde {
|
|
|
74
73
|
/** Exact-class checks prevent an unknown subclass's overridden converters from sharing this codec. */
|
|
75
74
|
get outputType() {
|
|
76
75
|
if (this.constructor !== PrimitiveSerde) return void 0;
|
|
77
|
-
const dbType =
|
|
76
|
+
const dbType = require_serde_TypeInfo.canonicalDbType(this.dbType);
|
|
78
77
|
const elementType = dbType.endsWith("[]") ? dbType.slice(0, -2) : dbType;
|
|
79
78
|
if (this.isArray !== dbType.endsWith("[]")) return void 0;
|
|
80
79
|
const outputType = {
|
|
@@ -82,7 +81,7 @@ var PrimitiveSerde = class PrimitiveSerde {
|
|
|
82
81
|
domain: primitiveOutputDomain(elementType),
|
|
83
82
|
arrayElementSafe: elementType !== "numeric"
|
|
84
83
|
};
|
|
85
|
-
return this.isArray ?
|
|
84
|
+
return this.isArray ? require_serde_TypeInfo.arrayOutputType(outputType) : outputType;
|
|
86
85
|
}
|
|
87
86
|
/** Primitive writes share their scalar/filter conversion, including subclass overrides. */
|
|
88
87
|
mapToDbValue(value) {
|
|
@@ -106,7 +105,7 @@ var DateSerde = class DateSerde extends PrimitiveSerde {
|
|
|
106
105
|
/** Date bindings use ISO strings; mapToDb does not support physical Date arrays. */
|
|
107
106
|
get outputType() {
|
|
108
107
|
return this.constructor === DateSerde && !this.isArray && !this.dbType.endsWith("[]") ? {
|
|
109
|
-
dbType:
|
|
108
|
+
dbType: require_serde_TypeInfo.canonicalDbType(this.dbType),
|
|
110
109
|
domain: DateSerde
|
|
111
110
|
} : void 0;
|
|
112
111
|
}
|
|
@@ -135,33 +134,33 @@ var DateSerde = class DateSerde extends PrimitiveSerde {
|
|
|
135
134
|
/** Converts `DATE`s `Temporal.PlainDate`s. */
|
|
136
135
|
var PlainDateSerde = class extends CustomSerdeAdapter {
|
|
137
136
|
constructor(dbType, isArray = false) {
|
|
138
|
-
super(dbType,
|
|
137
|
+
super(dbType, require_serde_temporalMappers.plainDateMapper, isArray);
|
|
139
138
|
}
|
|
140
139
|
};
|
|
141
140
|
/** Converts `TIME`s to `Temporal.PlainTime`s. */
|
|
142
141
|
var PlainTimeSerde = class extends CustomSerdeAdapter {
|
|
143
142
|
constructor(dbType, isArray = false) {
|
|
144
|
-
super(dbType,
|
|
143
|
+
super(dbType, require_serde_temporalMappers.plainTimeMapper, isArray);
|
|
145
144
|
}
|
|
146
145
|
};
|
|
147
146
|
/** Converts `TIMESTAMP`s to `Temporal.PlainDateTime`s. */
|
|
148
147
|
var PlainDateTimeSerde = class extends CustomSerdeAdapter {
|
|
149
148
|
constructor(dbType, isArray = false) {
|
|
150
|
-
super(dbType,
|
|
149
|
+
super(dbType, require_serde_temporalMappers.plainDateTimeMapper, isArray);
|
|
151
150
|
}
|
|
152
151
|
mapFromNow(now) {
|
|
153
152
|
const { timeZone } = require_runtimeConfig.getRuntimeConfig().temporal;
|
|
154
|
-
return
|
|
153
|
+
return require_serde_temporal.requireTemporal().toTemporalInstant.call(now).toZonedDateTimeISO(timeZone).toPlainDateTime();
|
|
155
154
|
}
|
|
156
155
|
};
|
|
157
156
|
/** Converts `TIMESTAMP WITH TIME ZONE`s to `Temporal.ZonedDateTime`s. */
|
|
158
157
|
var ZonedDateTimeSerde = class extends CustomSerdeAdapter {
|
|
159
158
|
constructor(dbType, isArray = false) {
|
|
160
|
-
super(dbType,
|
|
159
|
+
super(dbType, require_serde_temporalMappers.zonedDateTimeMapper, isArray);
|
|
161
160
|
}
|
|
162
161
|
mapFromNow(now) {
|
|
163
162
|
const { timeZone } = require_runtimeConfig.getRuntimeConfig().temporal;
|
|
164
|
-
return
|
|
163
|
+
return require_serde_temporal.requireTemporal().toTemporalInstant.call(now).toZonedDateTimeISO(timeZone);
|
|
165
164
|
}
|
|
166
165
|
};
|
|
167
166
|
var BigIntSerde = class BigIntSerde {
|
|
@@ -179,7 +178,7 @@ var BigIntSerde = class BigIntSerde {
|
|
|
179
178
|
domain: BigIntSerde,
|
|
180
179
|
arrayElementSafe: true
|
|
181
180
|
};
|
|
182
|
-
return this.isArray ?
|
|
181
|
+
return this.isArray ? require_serde_TypeInfo.arrayOutputType(elementType) : elementType;
|
|
183
182
|
}
|
|
184
183
|
/** Drivers accept native bigint values without conversion. */
|
|
185
184
|
mapToDbValue(value) {
|
|
@@ -229,7 +228,7 @@ var DecimalToNumberSerde = class DecimalToNumberSerde {
|
|
|
229
228
|
domain: Number,
|
|
230
229
|
arrayElementSafe: true
|
|
231
230
|
};
|
|
232
|
-
return this.isArray ?
|
|
231
|
+
return this.isArray ? require_serde_TypeInfo.arrayOutputType(elementType) : elementType;
|
|
233
232
|
}
|
|
234
233
|
/** Drivers accept decimal numbers without conversion. */
|
|
235
234
|
mapToDbValue(value) {
|
|
@@ -270,7 +269,7 @@ var KeySerde = class KeySerde {
|
|
|
270
269
|
/** PKs and FKs share a tag and SQL representation; the alias supplies the exact target idMeta. */
|
|
271
270
|
get outputType() {
|
|
272
271
|
return this.constructor === KeySerde && !this.isArray ? {
|
|
273
|
-
dbType:
|
|
272
|
+
dbType: require_serde_TypeInfo.canonicalDbType(this.dbType),
|
|
274
273
|
domain: `key:${this.meta.tagName}`,
|
|
275
274
|
arrayElementSafe: true
|
|
276
275
|
} : void 0;
|
|
@@ -305,7 +304,7 @@ var EnumFieldSerde = class EnumFieldSerde {
|
|
|
305
304
|
/** Separate fields of the same generated enum share its code/id mapping. */
|
|
306
305
|
get outputType() {
|
|
307
306
|
return this.constructor === EnumFieldSerde && !this.isArray ? {
|
|
308
|
-
dbType:
|
|
307
|
+
dbType: require_serde_TypeInfo.canonicalDbType(this.dbType),
|
|
309
308
|
domain: this.enumObject,
|
|
310
309
|
arrayElementSafe: true
|
|
311
310
|
} : void 0;
|
|
@@ -368,7 +367,7 @@ var SuperstructSerde = class SuperstructSerde {
|
|
|
368
367
|
/** JSON schemas describe a jsonb value, even when that value is a JSON array. */
|
|
369
368
|
get outputType() {
|
|
370
369
|
return this.constructor === SuperstructSerde && !this.isArray ? {
|
|
371
|
-
dbType:
|
|
370
|
+
dbType: require_serde_TypeInfo.canonicalDbType(this.dbType),
|
|
372
371
|
domain: this.superstruct,
|
|
373
372
|
arrayElementSafe: true
|
|
374
373
|
} : void 0;
|
|
@@ -400,7 +399,7 @@ var JsonSerde = class JsonSerde {
|
|
|
400
399
|
/** Unvalidated JSON uses its own encoder, not a primitive or schema-specific codec. */
|
|
401
400
|
get outputType() {
|
|
402
401
|
return this.constructor === JsonSerde && !this.isArray ? {
|
|
403
|
-
dbType:
|
|
402
|
+
dbType: require_serde_TypeInfo.canonicalDbType(this.dbType),
|
|
404
403
|
domain: JsonSerde,
|
|
405
404
|
arrayElementSafe: true
|
|
406
405
|
} : void 0;
|
|
@@ -435,7 +434,7 @@ var ZodSerde = class ZodSerde {
|
|
|
435
434
|
/** Parsing and transformations are compatible only for the same schema object. */
|
|
436
435
|
get outputType() {
|
|
437
436
|
return this.constructor === ZodSerde && !this.isArray ? {
|
|
438
|
-
dbType:
|
|
437
|
+
dbType: require_serde_TypeInfo.canonicalDbType(this.dbType),
|
|
439
438
|
domain: this.zodSchema,
|
|
440
439
|
arrayElementSafe: true
|
|
441
440
|
} : void 0;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serde.cjs","names":["createRequire","canonicalDbType","arrayOutputType","plainDateMapper","plainTimeMapper","plainDateTimeMapper","getRuntimeConfig","requireTemporal","zonedDateTimeMapper","keyToNumber","maybeResolveReferenceToId","keyToTaggedId","isDefined"],"sources":["../../src/serde/serde.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\n\nimport { isDefined } from \"src/EntityManager.ts\";\nimport { keyToNumber, keyToTaggedId, maybeResolveReferenceToId } from \"src/keys.ts\";\nimport { getRuntimeConfig } from \"src/runtimeConfig.ts\";\nimport { type Temporal, requireTemporal } from \"src/serde/temporal.ts\";\nimport {\n plainDateMapper,\n plainDateTimeMapper,\n plainTimeMapper,\n zonedDateTimeMapper,\n} from \"src/serde/temporalMappers.ts\";\nimport { type TypeInfo, arrayOutputType, canonicalDbType } from \"src/serde/TypeInfo.ts\";\n\nconst runtimeRequire = createRequire(import.meta.url);\n\n/** Scalar conversion only: no field names, entity hydration, or FK fixups. */\nexport interface ScalarCodec {\n dbType: string;\n isArray: boolean;\n /** Compatibility evidence for scalar conversion, absent for unknown codecs. */\n readonly outputType?: TypeInfo;\n /** Encodes a domain value for a filter, i.e. an em.find WHERE parameter. */\n mapToDb(value: any): any;\n /**\n * Encodes a domain value for an INSERT or UPDATE binding.\n *\n * Callers must handle omission, SQL NULL, and SQL expressions before encoding. JSON null and\n * codec defaults can differ from SQL NULL. Direct mutations must validate reference targets\n * and reject new or unflushed entities before encoding.\n */\n mapToDbValue?(value: unknown): unknown;\n /** Converts a driver value to its domain value, including the codec's null/default handling. */\n mapFromDb(value: unknown): unknown;\n /**\n * Converts a json_agg cell to a driver-row value, not a domain value.\n *\n * Lazy field hydration subsequently calls mapFromDb. I.e. Date codecs reconstruct a Date\n * from the JSON string, while Temporal codecs retain the driver's string representation.\n */\n mapFromJsonAgg(value: any): any;\n /** Reconstructs a driver value from a domain value, not a SQL binding. */\n mapToRow(value: any): any;\n}\n\n/** Converts the ORM clock to the timestamp's domain representation. */\nexport interface TimestampCodec<T> extends ScalarCodec {\n mapFromNow(now: Date): T;\n}\n\n/**\n * Provides a simplified, public API for mapping between db/domain values.\n *\n * Joist's internal `FieldSerde` API is admittedly a little crufty, and so this\n * API is intended to be a simpler, more user-friendly way to define custom types.\n */\nexport interface CustomSerde<DomainType, DbType> {\n toDb(value: DomainType): DbType;\n fromDb(value: DbType): DomainType;\n}\n\nexport class CustomSerdeAdapter implements ScalarCodec {\n isArray: boolean = false;\n\n constructor(\n public dbType: string,\n private mapper: CustomSerde<any, any>,\n isArray?: boolean,\n ) {\n if (isArray !== undefined) this.isArray = isArray;\n }\n\n /** Only known adapters share their mapper's identity and elementwise array conversion. */\n get outputType(): TypeInfo | undefined {\n if (\n this.isArray !== this.dbType.endsWith(\"[]\") ||\n (this.constructor !== CustomSerdeAdapter &&\n this.constructor !== PlainDateSerde &&\n this.constructor !== PlainTimeSerde &&\n this.constructor !== PlainDateTimeSerde &&\n this.constructor !== ZonedDateTimeSerde)\n ) {\n return undefined;\n }\n const dbType = canonicalDbType(this.dbType);\n // A numeric mapper may require scalar text; classic pg decodes numeric[] elements as numbers.\n const elementType = this.isArray ? dbType.slice(0, -2) : dbType;\n const outputType = { dbType: elementType, domain: this.mapper, arrayElementSafe: elementType !== \"numeric\" };\n if (!this.isArray) return outputType;\n // Physical arrays pass null elements to the mapper, unlike scalar arrayAgg; keep their domains distinct.\n return arrayOutputType(outputType) || [\"date\", \"time\", \"timestamp\", \"timestamptz\"].includes(elementType)\n ? { dbType, domain: this.mapper }\n : undefined;\n }\n\n /** Encodes each physical array element once. */\n mapToDbValue(value: unknown): unknown {\n return value !== undefined\n ? this.isArray\n ? (value as readonly unknown[]).map((element) => this.mapper.toDb(element))\n : this.mapper.toDb(value)\n : undefined;\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any): any {\n return value === null\n ? value\n : this.isArray\n ? value.map((element: unknown) => this.mapper.toDb(element))\n : this.mapper.toDb(value);\n }\n\n /** Converts a driver value with the custom mapper, including array elements. */\n mapFromDb(value: unknown): unknown {\n const dbValue = maybeNullToUndefined(value);\n return dbValue !== undefined\n ? this.isArray\n ? dbValue.map((value: unknown) => this.mapper.fromDb(value))\n : this.mapper.fromDb(dbValue)\n : undefined;\n }\n\n mapFromJsonAgg(value: any): any {\n // Assume the database JSON value matches the ResultSet value\n return value;\n // return value === null\n // ? value\n // : this.isArray\n // ? value.map((value: any) => this.mapper.fromDb(value))\n // : this.mapper.fromDb(value);\n }\n}\n\n/**\n * Supports `string`, `int`, etc., as well as `string[]`, `int[]`, etc.\n *\n * This is not generally meant for subclassing, because it assumes things like\n * `string[]`s can be mapped 1:1. See `CustomSerdeAdapter` a good base class\n * that will handle converting individual elements.\n */\nexport class PrimitiveSerde implements ScalarCodec {\n constructor(\n public dbType: string,\n public isArray = false,\n ) {}\n\n /** Exact-class checks prevent an unknown subclass's overridden converters from sharing this codec. */\n get outputType(): TypeInfo | undefined {\n if (this.constructor !== PrimitiveSerde) return undefined;\n const dbType = canonicalDbType(this.dbType);\n const elementType = dbType.endsWith(\"[]\") ? dbType.slice(0, -2) : dbType;\n if (this.isArray !== dbType.endsWith(\"[]\")) return undefined;\n const outputType = {\n dbType: elementType,\n domain: primitiveOutputDomain(elementType),\n arrayElementSafe: elementType !== \"numeric\",\n };\n return this.isArray ? arrayOutputType(outputType) : outputType;\n }\n\n /** Primitive writes share their scalar/filter conversion, including subclass overrides. */\n mapToDbValue(value: unknown): unknown {\n return this.mapToDb(value);\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n return value;\n }\n\n /** Keeps driver values as-is, with SQL NULL represented as an unset entity field. */\n mapFromDb(value: unknown): unknown {\n return maybeNullToUndefined(value);\n }\n\n mapFromJsonAgg(value: any): any {\n return value;\n }\n}\n\nexport class DateSerde extends PrimitiveSerde implements TimestampCodec<Date> {\n /** Date bindings use ISO strings; mapToDb does not support physical Date arrays. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === DateSerde && !this.isArray && !this.dbType.endsWith(\"[]\")\n ? { dbType: canonicalDbType(this.dbType), domain: DateSerde }\n : undefined;\n }\n\n /** Accept the caller's date as-is. */\n mapFromNow(now: Date): Date {\n return now;\n }\n\n mapFromJsonAgg(value: any): any {\n if (value === null) return value;\n return new Date(value);\n }\n\n /**\n * Returns the `Date` a driver hands back on a read, and not `mapToDb`'s ISO string.\n *\n * Otherwise callers that round-trip a row through `rowValue` and back through `fromRow` (i.e.\n * `RunPlugin` mirroring writes into the test em) turn every date into a string, because our\n * `mapFromDb` returns the row value as-is.\n */\n mapToRow(value: any): any {\n return value;\n }\n\n mapToDb(value: Date) {\n // bun.sql needs this, node-pg does it out of the box\n return value?.toISOString();\n }\n}\n\n/** Converts `DATE`s `Temporal.PlainDate`s. */\nexport class PlainDateSerde extends CustomSerdeAdapter {\n constructor(dbType: string, isArray = false) {\n super(dbType, plainDateMapper, isArray);\n }\n}\n\n/** Converts `TIME`s to `Temporal.PlainTime`s. */\nexport class PlainTimeSerde extends CustomSerdeAdapter {\n constructor(dbType: string, isArray = false) {\n super(dbType, plainTimeMapper, isArray);\n }\n}\n\n/** Converts `TIMESTAMP`s to `Temporal.PlainDateTime`s. */\nexport class PlainDateTimeSerde extends CustomSerdeAdapter implements TimestampCodec<Temporal.PlainDateTime> {\n constructor(dbType: string, isArray = false) {\n super(dbType, plainDateTimeMapper, isArray);\n }\n\n mapFromNow(now: Date): Temporal.PlainDateTime {\n const { timeZone } = getRuntimeConfig().temporal as any;\n return requireTemporal().toTemporalInstant.call(now).toZonedDateTimeISO(timeZone).toPlainDateTime();\n }\n}\n\n/** Converts `TIMESTAMP WITH TIME ZONE`s to `Temporal.ZonedDateTime`s. */\nexport class ZonedDateTimeSerde extends CustomSerdeAdapter implements TimestampCodec<Temporal.ZonedDateTime> {\n constructor(dbType: string, isArray = false) {\n super(dbType, zonedDateTimeMapper, isArray);\n }\n\n mapFromNow(now: Date): Temporal.ZonedDateTime {\n const { timeZone } = getRuntimeConfig().temporal as any;\n return requireTemporal().toTemporalInstant.call(now).toZonedDateTimeISO(timeZone);\n }\n}\n\nexport class BigIntSerde implements ScalarCodec {\n dbType: string;\n\n constructor(public isArray = false) {\n this.dbType = isArray ? \"bigint[]\" : \"bigint\";\n }\n\n /** BigInt conversion is distinct from both the driver's int8 value and Number aggregates. */\n get outputType(): TypeInfo | undefined {\n if (this.constructor !== BigIntSerde) return undefined;\n const elementType = { dbType: \"int8\", domain: BigIntSerde, arrayElementSafe: true };\n return this.isArray ? arrayOutputType(elementType) : elementType;\n }\n\n /** Drivers accept native bigint values without conversion. */\n mapToDbValue(value: unknown): unknown {\n if (this.isArray) assertFlatNumericArray(value);\n return value;\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n return value;\n }\n\n /** Converts the driver's bigint representation to the entity value. */\n mapFromDb(value: unknown): unknown {\n const dbValue = maybeNullToUndefined(value);\n if (this.isArray && dbValue !== undefined) {\n assertFlatNumericArray(dbValue);\n return dbValue.map((element: string | bigint | number | null) => (element === null ? null : BigInt(element)));\n }\n return dbValue ? BigInt(dbValue) : dbValue;\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : this.isArray ? this.mapFromDb(value) : BigInt(value);\n }\n}\n\n/**\n * Maps `decimal(...)` database types to the JS `number`.\n *\n * Note that we assume the db values are within the range of the JS `number`;\n * we should eventually sanity check that.\n *\n * Also note that knex/pg accept `number`s as input, so we only need\n * to handle from-database -> to JS translation.\n */\nexport class DecimalToNumberSerde implements ScalarCodec {\n dbType: string;\n\n constructor(public isArray = false) {\n this.dbType = isArray ? \"numeric[]\" : \"decimal\";\n }\n\n /** Numeric aggregates use the same Number conversion and identity binding encoder. */\n get outputType(): TypeInfo | undefined {\n if (this.constructor !== DecimalToNumberSerde) return undefined;\n const elementType = { dbType: \"numeric\", domain: Number, arrayElementSafe: true };\n return this.isArray ? arrayOutputType(elementType) : elementType;\n }\n\n /** Drivers accept decimal numbers without conversion. */\n mapToDbValue(value: unknown): unknown {\n if (this.isArray) assertFlatNumericArray(value);\n return value;\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n return value;\n }\n\n /** Converts a driver decimal value to a JavaScript number. */\n mapFromDb(value: unknown): unknown {\n const dbValue = maybeNullToUndefined(value);\n if (this.isArray && dbValue !== undefined) {\n assertFlatNumericArray(dbValue);\n return dbValue.map((element: string | number | null) => (element === null ? null : Number(element)));\n }\n return dbValue !== undefined ? Number(dbValue) : dbValue;\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : this.isArray ? this.mapFromDb(value) : Number(value);\n }\n}\n\n/** Maps physical integer keys to logical string IDs \"because GraphQL\". */\nexport class KeySerde implements ScalarCodec {\n isArray = false;\n\n private meta: {\n tagName: string;\n idDbType: \"bigint\" | \"int\" | \"uuid\" | \"text\";\n };\n\n constructor(\n tagName: string,\n public dbType: \"bigint\" | \"int\" | \"uuid\" | \"text\",\n ) {\n this.meta = {\n tagName,\n idDbType: dbType,\n };\n }\n\n /** PKs and FKs share a tag and SQL representation; the alias supplies the exact target idMeta. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === KeySerde && !this.isArray\n ? { dbType: canonicalDbType(this.dbType), domain: `key:${this.meta.tagName}`, arrayElementSafe: true }\n : undefined;\n }\n\n /** Resolves references and tagged, untagged, or numeric ids using the column's tag and storage type. */\n mapToDbValue(value: unknown): unknown {\n return keyToNumber(\n this.meta,\n typeof value === \"number\"\n ? value\n : maybeResolveReferenceToId(value as Parameters<typeof maybeResolveReferenceToId>[0]),\n );\n }\n\n mapToRow(value: any): any {\n // we don't have any fixups since we are trying to recreate what comes out of the db, so this is safe\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n // Sometimes the nilIdValue will pass -1 as already a number, but usually this should be a tagged id\n if (value === null || typeof value === \"number\") return value;\n // We go through `maybeResolveReferenceToId` because filters like `in: [a1, a2]` pass entities directly.\n return keyToNumber(this.meta, maybeResolveReferenceToId(value));\n }\n\n /** Converts a physical primary or foreign key to a tagged id. */\n mapFromDb(value: unknown): string | undefined {\n return keyToTaggedId(this.meta, value as string | number);\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\nexport class EnumFieldSerde implements ScalarCodec {\n isArray = false;\n\n constructor(\n public dbType: \"int\" | \"uuid\",\n private enumObject: any,\n ) {}\n\n /** Separate fields of the same generated enum share its code/id mapping. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === EnumFieldSerde && !this.isArray\n ? { dbType: canonicalDbType(this.dbType), domain: this.enumObject, arrayElementSafe: true }\n : undefined;\n }\n\n /** Resolves the enum code to its stored id, leaving an unknown code unset. */\n mapToDbValue(value: unknown): unknown {\n return this.enumObject.findByCode(value)?.id;\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n return this.enumObject.findByCode(value)?.id;\n }\n\n /** Converts a stored enum id to its enum code. */\n mapFromDb(value: unknown): unknown {\n return this.enumObject.findById(value)?.code;\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\nexport class EnumArrayFieldSerde implements ScalarCodec {\n isArray = true;\n\n constructor(\n public dbType: \"int[]\" | \"uuid[]\",\n private enumObject: any,\n ) {}\n\n /** Physical enum arrays reject null elements, unlike scalar enum arrayAgg; leave them unknown. */\n get outputType(): undefined {\n return undefined;\n }\n\n /** Resolves each enum code to its stored id, retaining the entity's empty-array default. */\n mapToDbValue(value: unknown): unknown {\n return (value as readonly unknown[] | null | undefined)?.map((code) => this.enumObject.getByCode(code).id) || [];\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n return !value ? [] : value.map((code: any) => this.enumObject.getByCode(code).id);\n }\n\n /** Converts stored enum ids to codes, defaulting an unset entity field to an empty array. */\n mapFromDb(value: unknown): unknown[] {\n return (value as readonly unknown[] | null | undefined)?.map((id) => this.enumObject.findById(id).code) || [];\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\n/** Similar to SimpleSerde, but applies the superstruct `assert` function when reading values from the db. */\nexport class SuperstructSerde implements ScalarCodec {\n dbType = \"jsonb\";\n isArray = false;\n\n // Use a dynamic require so that downstream projects don't have to depend on superstruct\n // until they want to, i.e. we don't have superstruct in the joist-orm package.json.\n private assert = runtimeRequire(\"superstruct\").assert;\n\n constructor(private superstruct: any) {}\n\n /** JSON schemas describe a jsonb value, even when that value is a JSON array. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === SuperstructSerde && !this.isArray\n ? { dbType: canonicalDbType(this.dbType), domain: this.superstruct, arrayElementSafe: true }\n : undefined;\n }\n\n /** Serializes the domain JSON value without running the read-time schema validation. */\n mapToDbValue(value: unknown): unknown {\n return JSON.stringify(value);\n }\n\n // JSON is returned by postgres already parsed, so we should just be able to return our data directly. Unlike with\n // JsonSerde, we can assume that superstruct would have parsed any complex types in the json correctly so we don't\n // need to do a round trip through JSON.stringify.\n mapToRow(value: any): any {\n return value;\n }\n\n mapToDb(value: any) {\n return JSON.stringify(value);\n }\n\n /** Validates a driver JSON value with the field's Superstruct schema. */\n mapFromDb(value: unknown): unknown {\n const dbValue = maybeNullToUndefined(value);\n if (dbValue) this.assert(dbValue, this.superstruct);\n return dbValue;\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\nexport class JsonSerde implements ScalarCodec {\n dbType = \"jsonb\";\n isArray = false;\n\n constructor() {}\n\n /** Unvalidated JSON uses its own encoder, not a primitive or schema-specific codec. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === JsonSerde && !this.isArray\n ? { dbType: canonicalDbType(this.dbType), domain: JsonSerde, arrayElementSafe: true }\n : undefined;\n }\n\n /** Serializes the whole JSON value, including JSON arrays and custom toJSON methods. */\n mapToDbValue(value: unknown): unknown {\n return JSON.stringify(value);\n }\n\n // JSON is returned by postgres already parsed, so if we are trying to recreate then we need to stringify, then parse.\n // It's necessary to do this instead of just returning the object directly because any complex types in the json need\n // to be stringified to correctly reflect the db value.\n mapToRow(value: any): any {\n const json = JSON.stringify(value);\n return isDefined(json) ? JSON.parse(json) : undefined;\n }\n\n mapToDb(value: any) {\n return JSON.stringify(value);\n }\n\n /** Keeps the driver's parsed JSON value, normalizing SQL NULL for entity fields. */\n mapFromDb(value: unknown): unknown {\n return maybeNullToUndefined(value);\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\n/** Similar to SimpleSerde, but applies the zod's `parse` function when reading values from the db. */\nexport class ZodSerde implements ScalarCodec {\n dbType = \"jsonb\";\n isArray = false;\n\n constructor(private zodSchema: any) {}\n\n /** Parsing and transformations are compatible only for the same schema object. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === ZodSerde && !this.isArray\n ? { dbType: canonicalDbType(this.dbType), domain: this.zodSchema, arrayElementSafe: true }\n : undefined;\n }\n\n /** Serializes the domain JSON value without running the read-time Zod parser or transforms. */\n mapToDbValue(value: unknown): unknown {\n return JSON.stringify(value);\n }\n\n // JSON is returned by postgres already parsed, so we should just be able to return our data directly. Unlike with\n // JsonSerde, we can assume that zod would have parsed any complex types in the json correctly so we don't need to\n // do a round trip through JSON.stringify.\n mapToRow(value: any): any {\n return value;\n }\n\n mapToDb(value: any) {\n return JSON.stringify(value);\n }\n\n /** Parses a driver JSON value with the field's Zod schema. */\n mapFromDb(value: unknown): unknown {\n const dbValue = maybeNullToUndefined(value);\n return dbValue ? this.zodSchema.parse(dbValue) : dbValue;\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\n/** PostgreSQL does not enforce declared array dimensions; reject nested values rather than coercing subarrays. */\nfunction assertFlatNumericArray(value: unknown): void {\n if (Array.isArray(value) && value.some(Array.isArray)) {\n throw new Error(\"Native numeric arrays must be one-dimensional\");\n }\n}\n\n/** Only driver-native numbers agree with Number aggregates; int8/numeric identity values do not. */\nfunction primitiveOutputDomain(dbType: string): unknown {\n switch (dbType) {\n case \"int2\":\n case \"int4\":\n case \"float4\":\n case \"float8\":\n return Number;\n case \"text\":\n case \"varchar\":\n case \"bpchar\":\n return String;\n default:\n return PrimitiveSerde;\n }\n}\n\n/** Normalizes SQL NULL to an unset entity field. */\nfunction maybeNullToUndefined(value: any): any {\n return value === null ? undefined : value;\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Temporal } from "./temporal.cjs";
|
|
2
2
|
import { TypeInfo } from "./TypeInfo.cjs";
|
|
3
|
-
//#region src/serde.d.ts
|
|
3
|
+
//#region src/serde/serde.d.ts
|
|
4
4
|
/** Scalar conversion only: no field names, entity hydration, or FK fixups. */
|
|
5
5
|
interface ScalarCodec {
|
|
6
6
|
dbType: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serde.d.cts","names":[],"sources":["../../src/serde/serde.ts"],"mappings":";;;;UAiBiB;EACf;EACA;;WAES,aAAa;;EAEtB,QAAQ;;;;;;;;EAQR,cAAc;;EAEd,UAAU;;;;;;;EAOV,eAAe;;EAEf,SAAS;;;UAIM,eAAe,WAAW;EACzC,WAAW,KAAK,OAAO;;;;;;;;UASR,YAAY,YAAY;EACvC,KAAK,OAAO,aAAa;EACzB,OAAO,OAAO,SAAS;;cAGZ,8BAA8B;EAIhC;UACC;EAJV;EAEA,YACS,gBACC,QAAQ,uBAChB;;MAME,cAAc;;EAuBlB,aAAa;EAQb,SAAS;EAIT,QAAQ;;EASR,UAAU;EASV,eAAe;;;;;;;;;cAkBJ,0BAA0B;EAE5B;EACA;EAFT,YACS,gBACA;;MAIL,cAAc;;EAclB,aAAa;EAIb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EAIV,eAAe;;cAKJ,kBAAkB,0BAA0B,eAAe;;MAElE,cAAc;;EAOlB,WAAW,KAAK,OAAO;EAIvB,eAAe;;;;;;;;EAYf,SAAS;EAIT,QAAQ,OAAO;;;cAOJ,uBAAuB;EAClC,YAAY,gBAAgB;;;cAMjB,uBAAuB;EAClC,YAAY,gBAAgB;;;cAMjB,2BAA2B,8BAA8B,eAAe,SAAS;EAC5F,YAAY,gBAAgB;EAI5B,WAAW,KAAK,OAAO,SAAS;;;cAOrB,2BAA2B,8BAA8B,eAAe,SAAS;EAC5F,YAAY,gBAAgB;EAI5B,WAAW,KAAK,OAAO,SAAS;;cAMrB,uBAAuB;EAGf;EAFnB;EAEA,YAAmB;;MAKf,cAAc;;EAOlB,aAAa;EAKb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EASV,eAAe;;;;;;;;;;;cAcJ,gCAAgC;EAGxB;EAFnB;EAEA,YAAmB;;MAKf,cAAc;;EAOlB,aAAa;EAKb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EASV,eAAe;;;cAMJ,oBAAoB;EAUtB;EATT;UAEQ;EAKR,YACE,iBACO;;MASL,cAAc;;EAOlB,aAAa;EASb,SAAS;EAKT,QAAQ;;EAQR,UAAU;EAIV,eAAe;;cAKJ,0BAA0B;EAI5B;UACC;EAJV;EAEA,YACS,wBACC;;MAIN,cAAc;;EAOlB,aAAa;EAIb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EAIV,eAAe;;cAKJ,+BAA+B;EAIjC;UACC;EAJV;EAEA,YACS,4BACC;;MAIN;;EAKJ,aAAa;EAIb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EAIV,eAAe;;;cAMJ,4BAA4B;UAQnB;EAPpB;EACA;UAIQ;EAER,YAAoB;;MAGhB,cAAc;;EAOlB,aAAa;EAOb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EAMV,eAAe;;cAKJ,qBAAqB;EAChC;EACA;EAEA;;MAGI,cAAc;;EAOlB,aAAa;EAOb,SAAS;EAKT,QAAQ;;EAKR,UAAU;EAIV,eAAe;;;cAMJ,oBAAoB;UAIX;EAHpB;EACA;EAEA,YAAoB;;MAGhB,cAAc;;EAOlB,aAAa;EAOb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EAKV,eAAe"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Temporal } from "./temporal.mjs";
|
|
2
2
|
import { TypeInfo } from "./TypeInfo.mjs";
|
|
3
|
-
//#region src/serde.d.ts
|
|
3
|
+
//#region src/serde/serde.d.ts
|
|
4
4
|
/** Scalar conversion only: no field names, entity hydration, or FK fixups. */
|
|
5
5
|
interface ScalarCodec {
|
|
6
6
|
dbType: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serde.d.mts","names":[],"sources":["../../src/serde/serde.ts"],"mappings":";;;;UAiBiB;EACf;EACA;;WAES,aAAa;;EAEtB,QAAQ;;;;;;;;EAQR,cAAc;;EAEd,UAAU;;;;;;;EAOV,eAAe;;EAEf,SAAS;;;UAIM,eAAe,WAAW;EACzC,WAAW,KAAK,OAAO;;;;;;;;UASR,YAAY,YAAY;EACvC,KAAK,OAAO,aAAa;EACzB,OAAO,OAAO,SAAS;;cAGZ,8BAA8B;EAIhC;UACC;EAJV;EAEA,YACS,gBACC,QAAQ,uBAChB;;MAME,cAAc;;EAuBlB,aAAa;EAQb,SAAS;EAIT,QAAQ;;EASR,UAAU;EASV,eAAe;;;;;;;;;cAkBJ,0BAA0B;EAE5B;EACA;EAFT,YACS,gBACA;;MAIL,cAAc;;EAclB,aAAa;EAIb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EAIV,eAAe;;cAKJ,kBAAkB,0BAA0B,eAAe;;MAElE,cAAc;;EAOlB,WAAW,KAAK,OAAO;EAIvB,eAAe;;;;;;;;EAYf,SAAS;EAIT,QAAQ,OAAO;;;cAOJ,uBAAuB;EAClC,YAAY,gBAAgB;;;cAMjB,uBAAuB;EAClC,YAAY,gBAAgB;;;cAMjB,2BAA2B,8BAA8B,eAAe,SAAS;EAC5F,YAAY,gBAAgB;EAI5B,WAAW,KAAK,OAAO,SAAS;;;cAOrB,2BAA2B,8BAA8B,eAAe,SAAS;EAC5F,YAAY,gBAAgB;EAI5B,WAAW,KAAK,OAAO,SAAS;;cAMrB,uBAAuB;EAGf;EAFnB;EAEA,YAAmB;;MAKf,cAAc;;EAOlB,aAAa;EAKb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EASV,eAAe;;;;;;;;;;;cAcJ,gCAAgC;EAGxB;EAFnB;EAEA,YAAmB;;MAKf,cAAc;;EAOlB,aAAa;EAKb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EASV,eAAe;;;cAMJ,oBAAoB;EAUtB;EATT;UAEQ;EAKR,YACE,iBACO;;MASL,cAAc;;EAOlB,aAAa;EASb,SAAS;EAKT,QAAQ;;EAQR,UAAU;EAIV,eAAe;;cAKJ,0BAA0B;EAI5B;UACC;EAJV;EAEA,YACS,wBACC;;MAIN,cAAc;;EAOlB,aAAa;EAIb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EAIV,eAAe;;cAKJ,+BAA+B;EAIjC;UACC;EAJV;EAEA,YACS,4BACC;;MAIN;;EAKJ,aAAa;EAIb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EAIV,eAAe;;;cAMJ,4BAA4B;UAQnB;EAPpB;EACA;UAIQ;EAER,YAAoB;;MAGhB,cAAc;;EAOlB,aAAa;EAOb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EAMV,eAAe;;cAKJ,qBAAqB;EAChC;EACA;EAEA;;MAGI,cAAc;;EAOlB,aAAa;EAOb,SAAS;EAKT,QAAQ;;EAKR,UAAU;EAIV,eAAe;;;cAMJ,oBAAoB;UAIX;EAHpB;EACA;EAEA,YAAoB;;MAGhB,cAAc;;EAOlB,aAAa;EAOb,SAAS;EAIT,QAAQ;;EAKR,UAAU;EAKV,eAAe"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { requireTemporal } from "./temporal.js";
|
|
2
|
+
import { keyToNumber, keyToTaggedId, maybeResolveReferenceToId } from "../keys.js";
|
|
2
3
|
import { arrayOutputType, canonicalDbType } from "./TypeInfo.js";
|
|
3
|
-
import {
|
|
4
|
-
import { getRuntimeConfig } from "./runtimeConfig.js";
|
|
4
|
+
import { getRuntimeConfig } from "../runtimeConfig.js";
|
|
5
5
|
import { plainDateMapper, plainDateTimeMapper, plainTimeMapper, zonedDateTimeMapper } from "./temporalMappers.js";
|
|
6
|
-
import "
|
|
7
|
-
import { isDefined } from "./EntityManager.js";
|
|
6
|
+
import { isDefined } from "../EntityManager.js";
|
|
8
7
|
import { createRequire } from "node:module";
|
|
9
|
-
//#region src/serde.ts
|
|
8
|
+
//#region src/serde/serde.ts
|
|
10
9
|
const runtimeRequire = createRequire(import.meta.url);
|
|
11
10
|
var CustomSerdeAdapter = class CustomSerdeAdapter {
|
|
12
11
|
dbType;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serde.js","names":[],"sources":["../../src/serde/serde.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\n\nimport { isDefined } from \"src/EntityManager.ts\";\nimport { keyToNumber, keyToTaggedId, maybeResolveReferenceToId } from \"src/keys.ts\";\nimport { getRuntimeConfig } from \"src/runtimeConfig.ts\";\nimport { type Temporal, requireTemporal } from \"src/serde/temporal.ts\";\nimport {\n plainDateMapper,\n plainDateTimeMapper,\n plainTimeMapper,\n zonedDateTimeMapper,\n} from \"src/serde/temporalMappers.ts\";\nimport { type TypeInfo, arrayOutputType, canonicalDbType } from \"src/serde/TypeInfo.ts\";\n\nconst runtimeRequire = createRequire(import.meta.url);\n\n/** Scalar conversion only: no field names, entity hydration, or FK fixups. */\nexport interface ScalarCodec {\n dbType: string;\n isArray: boolean;\n /** Compatibility evidence for scalar conversion, absent for unknown codecs. */\n readonly outputType?: TypeInfo;\n /** Encodes a domain value for a filter, i.e. an em.find WHERE parameter. */\n mapToDb(value: any): any;\n /**\n * Encodes a domain value for an INSERT or UPDATE binding.\n *\n * Callers must handle omission, SQL NULL, and SQL expressions before encoding. JSON null and\n * codec defaults can differ from SQL NULL. Direct mutations must validate reference targets\n * and reject new or unflushed entities before encoding.\n */\n mapToDbValue?(value: unknown): unknown;\n /** Converts a driver value to its domain value, including the codec's null/default handling. */\n mapFromDb(value: unknown): unknown;\n /**\n * Converts a json_agg cell to a driver-row value, not a domain value.\n *\n * Lazy field hydration subsequently calls mapFromDb. I.e. Date codecs reconstruct a Date\n * from the JSON string, while Temporal codecs retain the driver's string representation.\n */\n mapFromJsonAgg(value: any): any;\n /** Reconstructs a driver value from a domain value, not a SQL binding. */\n mapToRow(value: any): any;\n}\n\n/** Converts the ORM clock to the timestamp's domain representation. */\nexport interface TimestampCodec<T> extends ScalarCodec {\n mapFromNow(now: Date): T;\n}\n\n/**\n * Provides a simplified, public API for mapping between db/domain values.\n *\n * Joist's internal `FieldSerde` API is admittedly a little crufty, and so this\n * API is intended to be a simpler, more user-friendly way to define custom types.\n */\nexport interface CustomSerde<DomainType, DbType> {\n toDb(value: DomainType): DbType;\n fromDb(value: DbType): DomainType;\n}\n\nexport class CustomSerdeAdapter implements ScalarCodec {\n isArray: boolean = false;\n\n constructor(\n public dbType: string,\n private mapper: CustomSerde<any, any>,\n isArray?: boolean,\n ) {\n if (isArray !== undefined) this.isArray = isArray;\n }\n\n /** Only known adapters share their mapper's identity and elementwise array conversion. */\n get outputType(): TypeInfo | undefined {\n if (\n this.isArray !== this.dbType.endsWith(\"[]\") ||\n (this.constructor !== CustomSerdeAdapter &&\n this.constructor !== PlainDateSerde &&\n this.constructor !== PlainTimeSerde &&\n this.constructor !== PlainDateTimeSerde &&\n this.constructor !== ZonedDateTimeSerde)\n ) {\n return undefined;\n }\n const dbType = canonicalDbType(this.dbType);\n // A numeric mapper may require scalar text; classic pg decodes numeric[] elements as numbers.\n const elementType = this.isArray ? dbType.slice(0, -2) : dbType;\n const outputType = { dbType: elementType, domain: this.mapper, arrayElementSafe: elementType !== \"numeric\" };\n if (!this.isArray) return outputType;\n // Physical arrays pass null elements to the mapper, unlike scalar arrayAgg; keep their domains distinct.\n return arrayOutputType(outputType) || [\"date\", \"time\", \"timestamp\", \"timestamptz\"].includes(elementType)\n ? { dbType, domain: this.mapper }\n : undefined;\n }\n\n /** Encodes each physical array element once. */\n mapToDbValue(value: unknown): unknown {\n return value !== undefined\n ? this.isArray\n ? (value as readonly unknown[]).map((element) => this.mapper.toDb(element))\n : this.mapper.toDb(value)\n : undefined;\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any): any {\n return value === null\n ? value\n : this.isArray\n ? value.map((element: unknown) => this.mapper.toDb(element))\n : this.mapper.toDb(value);\n }\n\n /** Converts a driver value with the custom mapper, including array elements. */\n mapFromDb(value: unknown): unknown {\n const dbValue = maybeNullToUndefined(value);\n return dbValue !== undefined\n ? this.isArray\n ? dbValue.map((value: unknown) => this.mapper.fromDb(value))\n : this.mapper.fromDb(dbValue)\n : undefined;\n }\n\n mapFromJsonAgg(value: any): any {\n // Assume the database JSON value matches the ResultSet value\n return value;\n // return value === null\n // ? value\n // : this.isArray\n // ? value.map((value: any) => this.mapper.fromDb(value))\n // : this.mapper.fromDb(value);\n }\n}\n\n/**\n * Supports `string`, `int`, etc., as well as `string[]`, `int[]`, etc.\n *\n * This is not generally meant for subclassing, because it assumes things like\n * `string[]`s can be mapped 1:1. See `CustomSerdeAdapter` a good base class\n * that will handle converting individual elements.\n */\nexport class PrimitiveSerde implements ScalarCodec {\n constructor(\n public dbType: string,\n public isArray = false,\n ) {}\n\n /** Exact-class checks prevent an unknown subclass's overridden converters from sharing this codec. */\n get outputType(): TypeInfo | undefined {\n if (this.constructor !== PrimitiveSerde) return undefined;\n const dbType = canonicalDbType(this.dbType);\n const elementType = dbType.endsWith(\"[]\") ? dbType.slice(0, -2) : dbType;\n if (this.isArray !== dbType.endsWith(\"[]\")) return undefined;\n const outputType = {\n dbType: elementType,\n domain: primitiveOutputDomain(elementType),\n arrayElementSafe: elementType !== \"numeric\",\n };\n return this.isArray ? arrayOutputType(outputType) : outputType;\n }\n\n /** Primitive writes share their scalar/filter conversion, including subclass overrides. */\n mapToDbValue(value: unknown): unknown {\n return this.mapToDb(value);\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n return value;\n }\n\n /** Keeps driver values as-is, with SQL NULL represented as an unset entity field. */\n mapFromDb(value: unknown): unknown {\n return maybeNullToUndefined(value);\n }\n\n mapFromJsonAgg(value: any): any {\n return value;\n }\n}\n\nexport class DateSerde extends PrimitiveSerde implements TimestampCodec<Date> {\n /** Date bindings use ISO strings; mapToDb does not support physical Date arrays. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === DateSerde && !this.isArray && !this.dbType.endsWith(\"[]\")\n ? { dbType: canonicalDbType(this.dbType), domain: DateSerde }\n : undefined;\n }\n\n /** Accept the caller's date as-is. */\n mapFromNow(now: Date): Date {\n return now;\n }\n\n mapFromJsonAgg(value: any): any {\n if (value === null) return value;\n return new Date(value);\n }\n\n /**\n * Returns the `Date` a driver hands back on a read, and not `mapToDb`'s ISO string.\n *\n * Otherwise callers that round-trip a row through `rowValue` and back through `fromRow` (i.e.\n * `RunPlugin` mirroring writes into the test em) turn every date into a string, because our\n * `mapFromDb` returns the row value as-is.\n */\n mapToRow(value: any): any {\n return value;\n }\n\n mapToDb(value: Date) {\n // bun.sql needs this, node-pg does it out of the box\n return value?.toISOString();\n }\n}\n\n/** Converts `DATE`s `Temporal.PlainDate`s. */\nexport class PlainDateSerde extends CustomSerdeAdapter {\n constructor(dbType: string, isArray = false) {\n super(dbType, plainDateMapper, isArray);\n }\n}\n\n/** Converts `TIME`s to `Temporal.PlainTime`s. */\nexport class PlainTimeSerde extends CustomSerdeAdapter {\n constructor(dbType: string, isArray = false) {\n super(dbType, plainTimeMapper, isArray);\n }\n}\n\n/** Converts `TIMESTAMP`s to `Temporal.PlainDateTime`s. */\nexport class PlainDateTimeSerde extends CustomSerdeAdapter implements TimestampCodec<Temporal.PlainDateTime> {\n constructor(dbType: string, isArray = false) {\n super(dbType, plainDateTimeMapper, isArray);\n }\n\n mapFromNow(now: Date): Temporal.PlainDateTime {\n const { timeZone } = getRuntimeConfig().temporal as any;\n return requireTemporal().toTemporalInstant.call(now).toZonedDateTimeISO(timeZone).toPlainDateTime();\n }\n}\n\n/** Converts `TIMESTAMP WITH TIME ZONE`s to `Temporal.ZonedDateTime`s. */\nexport class ZonedDateTimeSerde extends CustomSerdeAdapter implements TimestampCodec<Temporal.ZonedDateTime> {\n constructor(dbType: string, isArray = false) {\n super(dbType, zonedDateTimeMapper, isArray);\n }\n\n mapFromNow(now: Date): Temporal.ZonedDateTime {\n const { timeZone } = getRuntimeConfig().temporal as any;\n return requireTemporal().toTemporalInstant.call(now).toZonedDateTimeISO(timeZone);\n }\n}\n\nexport class BigIntSerde implements ScalarCodec {\n dbType: string;\n\n constructor(public isArray = false) {\n this.dbType = isArray ? \"bigint[]\" : \"bigint\";\n }\n\n /** BigInt conversion is distinct from both the driver's int8 value and Number aggregates. */\n get outputType(): TypeInfo | undefined {\n if (this.constructor !== BigIntSerde) return undefined;\n const elementType = { dbType: \"int8\", domain: BigIntSerde, arrayElementSafe: true };\n return this.isArray ? arrayOutputType(elementType) : elementType;\n }\n\n /** Drivers accept native bigint values without conversion. */\n mapToDbValue(value: unknown): unknown {\n if (this.isArray) assertFlatNumericArray(value);\n return value;\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n return value;\n }\n\n /** Converts the driver's bigint representation to the entity value. */\n mapFromDb(value: unknown): unknown {\n const dbValue = maybeNullToUndefined(value);\n if (this.isArray && dbValue !== undefined) {\n assertFlatNumericArray(dbValue);\n return dbValue.map((element: string | bigint | number | null) => (element === null ? null : BigInt(element)));\n }\n return dbValue ? BigInt(dbValue) : dbValue;\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : this.isArray ? this.mapFromDb(value) : BigInt(value);\n }\n}\n\n/**\n * Maps `decimal(...)` database types to the JS `number`.\n *\n * Note that we assume the db values are within the range of the JS `number`;\n * we should eventually sanity check that.\n *\n * Also note that knex/pg accept `number`s as input, so we only need\n * to handle from-database -> to JS translation.\n */\nexport class DecimalToNumberSerde implements ScalarCodec {\n dbType: string;\n\n constructor(public isArray = false) {\n this.dbType = isArray ? \"numeric[]\" : \"decimal\";\n }\n\n /** Numeric aggregates use the same Number conversion and identity binding encoder. */\n get outputType(): TypeInfo | undefined {\n if (this.constructor !== DecimalToNumberSerde) return undefined;\n const elementType = { dbType: \"numeric\", domain: Number, arrayElementSafe: true };\n return this.isArray ? arrayOutputType(elementType) : elementType;\n }\n\n /** Drivers accept decimal numbers without conversion. */\n mapToDbValue(value: unknown): unknown {\n if (this.isArray) assertFlatNumericArray(value);\n return value;\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n return value;\n }\n\n /** Converts a driver decimal value to a JavaScript number. */\n mapFromDb(value: unknown): unknown {\n const dbValue = maybeNullToUndefined(value);\n if (this.isArray && dbValue !== undefined) {\n assertFlatNumericArray(dbValue);\n return dbValue.map((element: string | number | null) => (element === null ? null : Number(element)));\n }\n return dbValue !== undefined ? Number(dbValue) : dbValue;\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : this.isArray ? this.mapFromDb(value) : Number(value);\n }\n}\n\n/** Maps physical integer keys to logical string IDs \"because GraphQL\". */\nexport class KeySerde implements ScalarCodec {\n isArray = false;\n\n private meta: {\n tagName: string;\n idDbType: \"bigint\" | \"int\" | \"uuid\" | \"text\";\n };\n\n constructor(\n tagName: string,\n public dbType: \"bigint\" | \"int\" | \"uuid\" | \"text\",\n ) {\n this.meta = {\n tagName,\n idDbType: dbType,\n };\n }\n\n /** PKs and FKs share a tag and SQL representation; the alias supplies the exact target idMeta. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === KeySerde && !this.isArray\n ? { dbType: canonicalDbType(this.dbType), domain: `key:${this.meta.tagName}`, arrayElementSafe: true }\n : undefined;\n }\n\n /** Resolves references and tagged, untagged, or numeric ids using the column's tag and storage type. */\n mapToDbValue(value: unknown): unknown {\n return keyToNumber(\n this.meta,\n typeof value === \"number\"\n ? value\n : maybeResolveReferenceToId(value as Parameters<typeof maybeResolveReferenceToId>[0]),\n );\n }\n\n mapToRow(value: any): any {\n // we don't have any fixups since we are trying to recreate what comes out of the db, so this is safe\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n // Sometimes the nilIdValue will pass -1 as already a number, but usually this should be a tagged id\n if (value === null || typeof value === \"number\") return value;\n // We go through `maybeResolveReferenceToId` because filters like `in: [a1, a2]` pass entities directly.\n return keyToNumber(this.meta, maybeResolveReferenceToId(value));\n }\n\n /** Converts a physical primary or foreign key to a tagged id. */\n mapFromDb(value: unknown): string | undefined {\n return keyToTaggedId(this.meta, value as string | number);\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\nexport class EnumFieldSerde implements ScalarCodec {\n isArray = false;\n\n constructor(\n public dbType: \"int\" | \"uuid\",\n private enumObject: any,\n ) {}\n\n /** Separate fields of the same generated enum share its code/id mapping. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === EnumFieldSerde && !this.isArray\n ? { dbType: canonicalDbType(this.dbType), domain: this.enumObject, arrayElementSafe: true }\n : undefined;\n }\n\n /** Resolves the enum code to its stored id, leaving an unknown code unset. */\n mapToDbValue(value: unknown): unknown {\n return this.enumObject.findByCode(value)?.id;\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n return this.enumObject.findByCode(value)?.id;\n }\n\n /** Converts a stored enum id to its enum code. */\n mapFromDb(value: unknown): unknown {\n return this.enumObject.findById(value)?.code;\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\nexport class EnumArrayFieldSerde implements ScalarCodec {\n isArray = true;\n\n constructor(\n public dbType: \"int[]\" | \"uuid[]\",\n private enumObject: any,\n ) {}\n\n /** Physical enum arrays reject null elements, unlike scalar enum arrayAgg; leave them unknown. */\n get outputType(): undefined {\n return undefined;\n }\n\n /** Resolves each enum code to its stored id, retaining the entity's empty-array default. */\n mapToDbValue(value: unknown): unknown {\n return (value as readonly unknown[] | null | undefined)?.map((code) => this.enumObject.getByCode(code).id) || [];\n }\n\n mapToRow(value: any): any {\n return this.mapToDbValue(value);\n }\n\n mapToDb(value: any) {\n return !value ? [] : value.map((code: any) => this.enumObject.getByCode(code).id);\n }\n\n /** Converts stored enum ids to codes, defaulting an unset entity field to an empty array. */\n mapFromDb(value: unknown): unknown[] {\n return (value as readonly unknown[] | null | undefined)?.map((id) => this.enumObject.findById(id).code) || [];\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\n/** Similar to SimpleSerde, but applies the superstruct `assert` function when reading values from the db. */\nexport class SuperstructSerde implements ScalarCodec {\n dbType = \"jsonb\";\n isArray = false;\n\n // Use a dynamic require so that downstream projects don't have to depend on superstruct\n // until they want to, i.e. we don't have superstruct in the joist-orm package.json.\n private assert = runtimeRequire(\"superstruct\").assert;\n\n constructor(private superstruct: any) {}\n\n /** JSON schemas describe a jsonb value, even when that value is a JSON array. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === SuperstructSerde && !this.isArray\n ? { dbType: canonicalDbType(this.dbType), domain: this.superstruct, arrayElementSafe: true }\n : undefined;\n }\n\n /** Serializes the domain JSON value without running the read-time schema validation. */\n mapToDbValue(value: unknown): unknown {\n return JSON.stringify(value);\n }\n\n // JSON is returned by postgres already parsed, so we should just be able to return our data directly. Unlike with\n // JsonSerde, we can assume that superstruct would have parsed any complex types in the json correctly so we don't\n // need to do a round trip through JSON.stringify.\n mapToRow(value: any): any {\n return value;\n }\n\n mapToDb(value: any) {\n return JSON.stringify(value);\n }\n\n /** Validates a driver JSON value with the field's Superstruct schema. */\n mapFromDb(value: unknown): unknown {\n const dbValue = maybeNullToUndefined(value);\n if (dbValue) this.assert(dbValue, this.superstruct);\n return dbValue;\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\nexport class JsonSerde implements ScalarCodec {\n dbType = \"jsonb\";\n isArray = false;\n\n constructor() {}\n\n /** Unvalidated JSON uses its own encoder, not a primitive or schema-specific codec. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === JsonSerde && !this.isArray\n ? { dbType: canonicalDbType(this.dbType), domain: JsonSerde, arrayElementSafe: true }\n : undefined;\n }\n\n /** Serializes the whole JSON value, including JSON arrays and custom toJSON methods. */\n mapToDbValue(value: unknown): unknown {\n return JSON.stringify(value);\n }\n\n // JSON is returned by postgres already parsed, so if we are trying to recreate then we need to stringify, then parse.\n // It's necessary to do this instead of just returning the object directly because any complex types in the json need\n // to be stringified to correctly reflect the db value.\n mapToRow(value: any): any {\n const json = JSON.stringify(value);\n return isDefined(json) ? JSON.parse(json) : undefined;\n }\n\n mapToDb(value: any) {\n return JSON.stringify(value);\n }\n\n /** Keeps the driver's parsed JSON value, normalizing SQL NULL for entity fields. */\n mapFromDb(value: unknown): unknown {\n return maybeNullToUndefined(value);\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\n/** Similar to SimpleSerde, but applies the zod's `parse` function when reading values from the db. */\nexport class ZodSerde implements ScalarCodec {\n dbType = \"jsonb\";\n isArray = false;\n\n constructor(private zodSchema: any) {}\n\n /** Parsing and transformations are compatible only for the same schema object. */\n get outputType(): TypeInfo | undefined {\n return this.constructor === ZodSerde && !this.isArray\n ? { dbType: canonicalDbType(this.dbType), domain: this.zodSchema, arrayElementSafe: true }\n : undefined;\n }\n\n /** Serializes the domain JSON value without running the read-time Zod parser or transforms. */\n mapToDbValue(value: unknown): unknown {\n return JSON.stringify(value);\n }\n\n // JSON is returned by postgres already parsed, so we should just be able to return our data directly. Unlike with\n // JsonSerde, we can assume that zod would have parsed any complex types in the json correctly so we don't need to\n // do a round trip through JSON.stringify.\n mapToRow(value: any): any {\n return value;\n }\n\n mapToDb(value: any) {\n return JSON.stringify(value);\n }\n\n /** Parses a driver JSON value with the field's Zod schema. */\n mapFromDb(value: unknown): unknown {\n const dbValue = maybeNullToUndefined(value);\n return dbValue ? this.zodSchema.parse(dbValue) : dbValue;\n }\n\n mapFromJsonAgg(value: any): any {\n return value === null ? value : value;\n }\n}\n\n/** PostgreSQL does not enforce declared array dimensions; reject nested values rather than coercing subarrays. */\nfunction assertFlatNumericArray(value: unknown): void {\n if (Array.isArray(value) && value.some(Array.isArray)) {\n throw new Error(\"Native numeric arrays must be one-dimensional\");\n }\n}\n\n/** Only driver-native numbers agree with Number aggregates; int8/numeric identity values do not. */\nfunction primitiveOutputDomain(dbType: string): unknown {\n switch (dbType) {\n case \"int2\":\n case \"int4\":\n case \"float4\":\n case \"float8\":\n return Number;\n case \"text\":\n case \"varchar\":\n case \"bpchar\":\n return String;\n default:\n return PrimitiveSerde;\n }\n}\n\n/** Normalizes SQL NULL to an unset entity field. */\nfunction maybeNullToUndefined(value: any): any {\n return value === null ? undefined : value;\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
//#region src/temporal.ts
|
|
2
|
+
//#region src/serde/temporal.ts
|
|
3
3
|
const runtimeRequire = (0, require("node:module").createRequire)(require("url").pathToFileURL(__filename).href);
|
|
4
4
|
let temporal;
|
|
5
5
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.cjs","names":["createRequire"],"sources":["../../src/serde/temporal.ts"],"sourcesContent":["/// <reference types=\"temporal-spec/global\" preserve=\"true\" />\n\nimport { createRequire } from \"node:module\";\n\nconst runtimeRequire = createRequire(import.meta.url);\n\n// Native Temporal and both supported polyfills expose this shape; use the shared spec types instead of duplicating it.\ntype TemporalModule = typeof import(\"temporal-spec\");\nlet temporal: TemporalModule | undefined | false;\n\n/**\n * Lazily exposes Joist's native-first / polyfill-fallback Temporal detection.\n *\n * This is useful while the joist-orm repo itself has both pre-Node 26, and post-Node 26\n * test coverage, b/c our CI test suite needs the same a) codegen output and b) test suites\n * to \"just work\" with either Node 24/25 or Node 26, which means they can't have an explicit\n * import to either `temporal-polyfill` or the `Temporal` global.\n *\n * This is exactly what Joist's internal temporal resolution was already working around, so\n * this just exposes an `import { Temporal } from joist-orm` that lets the codegen & tests\n * reuse the same abstraction.\n */\nexport const Temporal = new Proxy(\n {},\n {\n get(_target, property, receiver) {\n return Reflect.get(requireTemporal().Temporal, property, receiver);\n },\n },\n) as typeof globalThis.Temporal;\n\n/**\n * A type-only `Temporal` namespace that merges with the `const Temporal` above.\n *\n * The `const` is only a value, so using `Temporal.PlainDate` / `Temporal.ZonedDateTime` as a\n * type needs a namespace to resolve against. Node 26 has that as a global, but older Node\n * versions don't, so `temporal-spec/global` supplies the same global namespace as a fallback.\n */\nexport declare namespace Temporal {\n export type Instant = globalThis.Temporal.Instant;\n export type ZonedDateTime = globalThis.Temporal.ZonedDateTime;\n export type PlainDate = globalThis.Temporal.PlainDate;\n export type PlainTime = globalThis.Temporal.PlainTime;\n export type PlainDateTime = globalThis.Temporal.PlainDateTime;\n export type PlainYearMonth = globalThis.Temporal.PlainYearMonth;\n export type PlainMonthDay = globalThis.Temporal.PlainMonthDay;\n export type Duration = globalThis.Temporal.Duration;\n}\n\n/**\n * Conditionally/dynamically requires `temporal-polyfill`.\n *\n * We want to avoid directly importing/requiring `temporal-polyfill` because\n * it will introduce the dependency to all users of Joist.\n */\nexport function maybeRequireTemporal(): TemporalModule | undefined {\n // if we've already failed to find a temporal implementation before, early exit\n if (temporal === false) return undefined;\n // if we already required temporal, just return that\n if (temporal) return temporal;\n // use built in temporal if present\n if (\"Temporal\" in global && \"Intl\" in global) {\n temporal = {\n Temporal: global.Temporal as typeof globalThis.Temporal,\n toTemporalInstant: Date.prototype.toTemporalInstant,\n Intl: global.Intl,\n };\n return temporal;\n }\n // preferentially try to use temporal-polyfill\n try {\n temporal = runtimeRequire(\"temporal-polyfill\");\n return temporal as TemporalModule;\n } catch (e) {}\n // last resort, try to use @js-temporal/polyfill\n try {\n temporal = runtimeRequire(\"@js-temporal/polyfill\");\n return temporal as TemporalModule;\n } catch (e) {}\n // don't try to load temporal again\n temporal = false;\n return undefined;\n}\n\nexport function requireTemporal(): TemporalModule {\n const temporal = maybeRequireTemporal();\n if (!temporal) throw new Error(\"Unable to find a Temporal implementation\");\n return temporal;\n}\n"],"mappings":";;AAIA,MAAM,kBAAA,wBAAiBA,CAAAA,CAAAA,cAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,IAA6B;AAIpD,IAAI;;;;;;;;;;;;;AAcJ,MAAa,WAAW,IAAI,MAC1B,CAAC,GACD,EACE,IAAI,SAAS,UAAU,UAAU;CAC/B,OAAO,QAAQ,IAAI,gBAAgB,CAAC,CAAC,UAAU,UAAU,QAAQ;AACnE,EACF,CACF;;;;;;;AA0BA,SAAgB,uBAAmD;CAEjE,IAAI,aAAa,OAAO,OAAO,KAAA;CAE/B,IAAI,UAAU,OAAO;CAErB,IAAI,cAAc,UAAU,UAAU,QAAQ;EAC5C,WAAW;GACT,UAAU,OAAO;GACjB,mBAAmB,KAAK,UAAU;GAClC,MAAM,OAAO;EACf;EACA,OAAO;CACT;CAEA,IAAI;EACF,WAAW,eAAe,mBAAmB;EAC7C,OAAO;CACT,SAAS,GAAG,CAAC;CAEb,IAAI;EACF,WAAW,eAAe,uBAAuB;EACjD,OAAO;CACT,SAAS,GAAG,CAAC;CAEb,WAAW;AAEb;AAEA,SAAgB,kBAAkC;CAChD,MAAM,WAAW,qBAAqB;CACtC,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,0CAA0C;CACzE,OAAO;AACT"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="temporal-spec/global" preserve="true" />
|
|
2
|
-
//#region src/temporal.d.ts
|
|
2
|
+
//#region src/serde/temporal.d.ts
|
|
3
3
|
type TemporalModule = typeof import("temporal-spec");
|
|
4
4
|
/**
|
|
5
5
|
* Lazily exposes Joist's native-first / polyfill-fallback Temporal detection.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.d.cts","names":[],"sources":["../../src/serde/temporal.ts"],"mappings":";;KAOK;;;;;;;;;;;;;cAeQ,iBAOD,WAAW;;;;;;;;kBASE;OACX,UAAU,WAAW,SAAS;OAC9B,gBAAgB,WAAW,SAAS;OACpC,YAAY,WAAW,SAAS;OAChC,YAAY,WAAW,SAAS;OAChC,gBAAgB,WAAW,SAAS;OACpC,iBAAiB,WAAW,SAAS;OACrC,gBAAgB,WAAW,SAAS;OACpC,WAAW,WAAW,SAAS;;;;;;;;iBAS7B,wBAAwB;iBA6BxB,mBAAmB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="temporal-spec/global" preserve="true" />
|
|
2
|
-
//#region src/temporal.d.ts
|
|
2
|
+
//#region src/serde/temporal.d.ts
|
|
3
3
|
type TemporalModule = typeof import("temporal-spec");
|
|
4
4
|
/**
|
|
5
5
|
* Lazily exposes Joist's native-first / polyfill-fallback Temporal detection.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.d.mts","names":[],"sources":["../../src/serde/temporal.ts"],"mappings":";;KAOK;;;;;;;;;;;;;cAeQ,iBAOD,WAAW;;;;;;;;kBASE;OACX,UAAU,WAAW,SAAS;OAC9B,gBAAgB,WAAW,SAAS;OACpC,YAAY,WAAW,SAAS;OAChC,YAAY,WAAW,SAAS;OAChC,gBAAgB,WAAW,SAAS;OACpC,iBAAiB,WAAW,SAAS;OACrC,gBAAgB,WAAW,SAAS;OACpC,WAAW,WAAW,SAAS;;;;;;;;iBAS7B,wBAAwB;iBA6BxB,mBAAmB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.js","names":[],"sources":["../../src/serde/temporal.ts"],"sourcesContent":["/// <reference types=\"temporal-spec/global\" preserve=\"true\" />\n\nimport { createRequire } from \"node:module\";\n\nconst runtimeRequire = createRequire(import.meta.url);\n\n// Native Temporal and both supported polyfills expose this shape; use the shared spec types instead of duplicating it.\ntype TemporalModule = typeof import(\"temporal-spec\");\nlet temporal: TemporalModule | undefined | false;\n\n/**\n * Lazily exposes Joist's native-first / polyfill-fallback Temporal detection.\n *\n * This is useful while the joist-orm repo itself has both pre-Node 26, and post-Node 26\n * test coverage, b/c our CI test suite needs the same a) codegen output and b) test suites\n * to \"just work\" with either Node 24/25 or Node 26, which means they can't have an explicit\n * import to either `temporal-polyfill` or the `Temporal` global.\n *\n * This is exactly what Joist's internal temporal resolution was already working around, so\n * this just exposes an `import { Temporal } from joist-orm` that lets the codegen & tests\n * reuse the same abstraction.\n */\nexport const Temporal = new Proxy(\n {},\n {\n get(_target, property, receiver) {\n return Reflect.get(requireTemporal().Temporal, property, receiver);\n },\n },\n) as typeof globalThis.Temporal;\n\n/**\n * A type-only `Temporal` namespace that merges with the `const Temporal` above.\n *\n * The `const` is only a value, so using `Temporal.PlainDate` / `Temporal.ZonedDateTime` as a\n * type needs a namespace to resolve against. Node 26 has that as a global, but older Node\n * versions don't, so `temporal-spec/global` supplies the same global namespace as a fallback.\n */\nexport declare namespace Temporal {\n export type Instant = globalThis.Temporal.Instant;\n export type ZonedDateTime = globalThis.Temporal.ZonedDateTime;\n export type PlainDate = globalThis.Temporal.PlainDate;\n export type PlainTime = globalThis.Temporal.PlainTime;\n export type PlainDateTime = globalThis.Temporal.PlainDateTime;\n export type PlainYearMonth = globalThis.Temporal.PlainYearMonth;\n export type PlainMonthDay = globalThis.Temporal.PlainMonthDay;\n export type Duration = globalThis.Temporal.Duration;\n}\n\n/**\n * Conditionally/dynamically requires `temporal-polyfill`.\n *\n * We want to avoid directly importing/requiring `temporal-polyfill` because\n * it will introduce the dependency to all users of Joist.\n */\nexport function maybeRequireTemporal(): TemporalModule | undefined {\n // if we've already failed to find a temporal implementation before, early exit\n if (temporal === false) return undefined;\n // if we already required temporal, just return that\n if (temporal) return temporal;\n // use built in temporal if present\n if (\"Temporal\" in global && \"Intl\" in global) {\n temporal = {\n Temporal: global.Temporal as typeof globalThis.Temporal,\n toTemporalInstant: Date.prototype.toTemporalInstant,\n Intl: global.Intl,\n };\n return temporal;\n }\n // preferentially try to use temporal-polyfill\n try {\n temporal = runtimeRequire(\"temporal-polyfill\");\n return temporal as TemporalModule;\n } catch (e) {}\n // last resort, try to use @js-temporal/polyfill\n try {\n temporal = runtimeRequire(\"@js-temporal/polyfill\");\n return temporal as TemporalModule;\n } catch (e) {}\n // don't try to load temporal again\n temporal = false;\n return undefined;\n}\n\nexport function requireTemporal(): TemporalModule {\n const temporal = maybeRequireTemporal();\n if (!temporal) throw new Error(\"Unable to find a Temporal implementation\");\n return temporal;\n}\n"],"mappings":";;AAIA,MAAM,iBAAiB,cAAc,YAAY,GAAG;AAIpD,IAAI;;;;;;;;;;;;;AAcJ,MAAa,WAAW,IAAI,MAC1B,CAAC,GACD,EACE,IAAI,SAAS,UAAU,UAAU;CAC/B,OAAO,QAAQ,IAAI,gBAAgB,CAAC,CAAC,UAAU,UAAU,QAAQ;AACnE,EACF,CACF;;;;;;;AA0BA,SAAgB,uBAAmD;CAEjE,IAAI,aAAa,OAAO,OAAO,KAAA;CAE/B,IAAI,UAAU,OAAO;CAErB,IAAI,cAAc,UAAU,UAAU,QAAQ;EAC5C,WAAW;GACT,UAAU,OAAO;GACjB,mBAAmB,KAAK,UAAU;GAClC,MAAM,OAAO;EACf;EACA,OAAO;CACT;CAEA,IAAI;EACF,WAAW,eAAe,mBAAmB;EAC7C,OAAO;CACT,SAAS,GAAG,CAAC;CAEb,IAAI;EACF,WAAW,eAAe,uBAAuB;EACjD,OAAO;CACT,SAAS,GAAG,CAAC;CAEb,WAAW;AAEb;AAEA,SAAgB,kBAAkC;CAChD,MAAM,WAAW,qBAAqB;CACtC,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,0CAA0C;CACzE,OAAO;AACT"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const
|
|
3
|
-
const require_utils = require("
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const { Temporal: t } = require_temporal.maybeRequireTemporal() ?? {};
|
|
2
|
+
const require_serde_temporal = require("./temporal.cjs");
|
|
3
|
+
const require_utils = require("../utils.cjs");
|
|
4
|
+
//#region src/serde/temporalMappers.ts
|
|
5
|
+
const { Temporal: t } = require_serde_temporal.maybeRequireTemporal() ?? {};
|
|
7
6
|
const temporalNotAvailable = {
|
|
8
7
|
fromDb: () => require_utils.fail("Temporal not available"),
|
|
9
8
|
toDb: () => require_utils.fail("Temporal not available")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporalMappers.cjs","names":["maybeRequireTemporal","fail"],"sources":["../../src/serde/temporalMappers.ts"],"sourcesContent":["import type { CustomSerde } from \"src/serde/serde.ts\";\nimport { type Temporal, maybeRequireTemporal } from \"src/serde/temporal.ts\";\nimport { fail } from \"src/utils.ts\";\n\nconst { Temporal: t } = maybeRequireTemporal() ?? {};\nconst temporalNotAvailable = {\n fromDb: () => fail(\"Temporal not available\"),\n toDb: () => fail(\"Temporal not available\"),\n};\n\n/**\n * Converts Postgres `DATE` to/from Temporal.PlainDate.\n *\n * `fromDb` accepts either pg's text form (classic/knex text queries, json_agg preloads) or an\n * already-constructed `PlainDate` (lazy binary queries decode wire bytes -> Temporal directly).\n */\nexport const plainDateMapper: CustomSerde<Temporal.PlainDate, string> = t\n ? {\n fromDb: (value: string | Temporal.PlainDate) => (value instanceof t.PlainDate ? value : t.PlainDate.from(value)),\n toDb: (p) => p.toString(),\n }\n : temporalNotAvailable;\n\n/** Converts Postgres `TIME` to/from Temporal.PlainTime; `fromDb` also passes binary-decoded instances through. */\nexport const plainTimeMapper: CustomSerde<Temporal.PlainTime, string> = t\n ? {\n fromDb: (value: string | Temporal.PlainTime) => (value instanceof t.PlainTime ? value : t.PlainTime.from(value)),\n toDb: (pt) => pt.toString(),\n }\n : temporalNotAvailable;\n\n/**\n * Converts Postgres `TIMESTAMP` / `TIMESTAMP WITHOUT TIME ZONE` to/from Temporal.PlainDateTime;\n * `fromDb` also passes binary-decoded instances through.\n */\nexport const plainDateTimeMapper: CustomSerde<Temporal.PlainDateTime, string> = t\n ? {\n // Text values look like `2018-01-01 10:00:00`\n fromDb: (value: string | Temporal.PlainDateTime) =>\n value instanceof t.PlainDateTime ? value : t.PlainDateTime.from(value),\n toDb: (p) => p.toString(),\n }\n : temporalNotAvailable;\n\n/**\n * Converts Postgres `TIMESTAMPTZ`, `TIMESTAMPTZ WITH TIME ZONE` to/from Temporal.ZonedDateTime.\n *\n * Specifically, Postgres uses ISO 8601, which Temporal supports as well, except that PG ouputs a space instead of `T`\n * between the date/time for output.\n *\n * Additionally, `Temporal.ZonedDateTime.from` expects a time zone literal name to be supplied as part of the string,\n * but this is not stored by postgres.\n *\n * As such, we parse the offset and append it to string passed to `from` as the time zone. This means that if we did a\n * round trip of generating a db value then parsing it, then it may not strictly equal the original zdt.\n *\n * Finally, PG stores dates as UTC and converts them to its local time zone for output, so we could get any offset\n * theoretically. If, somehow, we don't get an offset, then we assume UTC.\n */\nexport const zonedDateTimeMapper: CustomSerde<Temporal.ZonedDateTime, string> = t\n ? {\n // Produce a ZDT from a PG output like \"2021-01-01 12:00:00-05:00\"; binary-decoded\n // instances (lazy queries construct ZonedDateTimes directly) pass through\n fromDb: (value: string | Temporal.ZonedDateTime) => {\n if (typeof value !== \"string\") return value;\n const [offset] = value.match(/([+-]\\d{2}(?::?\\d{2})?)$/) ?? [];\n return t.ZonedDateTime.from(`${value}[${!offset || /^\\+00(:?00)?$/.test(offset) ? \"UTC\" : offset}]`);\n },\n // Match a PG `TIMESTAMPTZ` input format, i.e. \"2021-01-01T12:00:00-05:00\"\n toDb: (zdt) => zdt.toString({ timeZoneName: \"never\" }),\n }\n : temporalNotAvailable;\n"],"mappings":";;;;AAIA,MAAM,EAAE,UAAU,MAAMA,uBAAAA,qBAAqB,KAAK,CAAC;AACnD,MAAM,uBAAuB;CAC3B,cAAcC,cAAAA,KAAK,wBAAwB;CAC3C,YAAYA,cAAAA,KAAK,wBAAwB;AAC3C;;;;;;;AAQA,MAAa,kBAA2D,IACpE;CACE,SAAS,UAAwC,iBAAiB,EAAE,YAAY,QAAQ,EAAE,UAAU,KAAK,KAAK;CAC9G,OAAO,MAAM,EAAE,SAAS;AAC1B,IACA;;AAGJ,MAAa,kBAA2D,IACpE;CACE,SAAS,UAAwC,iBAAiB,EAAE,YAAY,QAAQ,EAAE,UAAU,KAAK,KAAK;CAC9G,OAAO,OAAO,GAAG,SAAS;AAC5B,IACA;;;;;AAMJ,MAAa,sBAAmE,IAC5E;CAEE,SAAS,UACP,iBAAiB,EAAE,gBAAgB,QAAQ,EAAE,cAAc,KAAK,KAAK;CACvE,OAAO,MAAM,EAAE,SAAS;AAC1B,IACA;;;;;;;;;;;;;;;;AAiBJ,MAAa,sBAAmE,IAC5E;CAGE,SAAS,UAA2C;EAClD,IAAI,OAAO,UAAU,UAAU,OAAO;EACtC,MAAM,CAAC,UAAU,MAAM,MAAM,0BAA0B,KAAK,CAAC;EAC7D,OAAO,EAAE,cAAc,KAAK,GAAG,MAAM,GAAG,CAAC,UAAU,gBAAgB,KAAK,MAAM,IAAI,QAAQ,OAAO,EAAE;CACrG;CAEA,OAAO,QAAQ,IAAI,SAAS,EAAE,cAAc,QAAQ,CAAC;AACvD,IACA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporalMappers.d.cts","names":[],"sources":["../../src/serde/temporalMappers.ts"],"mappings":";;;;;;;;;cAgBa,iBAAiB,YAAY,SAAS;;cAQtC,iBAAiB,YAAY,SAAS;;;;;cAWtC,qBAAqB,YAAY,SAAS;;;;;;;;;;;;;;;;cAwB1C,qBAAqB,YAAY,SAAS"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporalMappers.d.mts","names":[],"sources":["../../src/serde/temporalMappers.ts"],"mappings":";;;;;;;;;cAgBa,iBAAiB,YAAY,SAAS;;cAQtC,iBAAiB,YAAY,SAAS;;;;;cAWtC,qBAAqB,YAAY,SAAS;;;;;;;;;;;;;;;;cAwB1C,qBAAqB,YAAY,SAAS"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { maybeRequireTemporal } from "./temporal.js";
|
|
2
|
-
import { fail } from "
|
|
3
|
-
|
|
4
|
-
//#region src/temporalMappers.ts
|
|
2
|
+
import { fail } from "../utils.js";
|
|
3
|
+
//#region src/serde/temporalMappers.ts
|
|
5
4
|
const { Temporal: t } = maybeRequireTemporal() ?? {};
|
|
6
5
|
const temporalNotAvailable = {
|
|
7
6
|
fromDb: () => fail("Temporal not available"),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporalMappers.js","names":[],"sources":["../../src/serde/temporalMappers.ts"],"sourcesContent":["import type { CustomSerde } from \"src/serde/serde.ts\";\nimport { type Temporal, maybeRequireTemporal } from \"src/serde/temporal.ts\";\nimport { fail } from \"src/utils.ts\";\n\nconst { Temporal: t } = maybeRequireTemporal() ?? {};\nconst temporalNotAvailable = {\n fromDb: () => fail(\"Temporal not available\"),\n toDb: () => fail(\"Temporal not available\"),\n};\n\n/**\n * Converts Postgres `DATE` to/from Temporal.PlainDate.\n *\n * `fromDb` accepts either pg's text form (classic/knex text queries, json_agg preloads) or an\n * already-constructed `PlainDate` (lazy binary queries decode wire bytes -> Temporal directly).\n */\nexport const plainDateMapper: CustomSerde<Temporal.PlainDate, string> = t\n ? {\n fromDb: (value: string | Temporal.PlainDate) => (value instanceof t.PlainDate ? value : t.PlainDate.from(value)),\n toDb: (p) => p.toString(),\n }\n : temporalNotAvailable;\n\n/** Converts Postgres `TIME` to/from Temporal.PlainTime; `fromDb` also passes binary-decoded instances through. */\nexport const plainTimeMapper: CustomSerde<Temporal.PlainTime, string> = t\n ? {\n fromDb: (value: string | Temporal.PlainTime) => (value instanceof t.PlainTime ? value : t.PlainTime.from(value)),\n toDb: (pt) => pt.toString(),\n }\n : temporalNotAvailable;\n\n/**\n * Converts Postgres `TIMESTAMP` / `TIMESTAMP WITHOUT TIME ZONE` to/from Temporal.PlainDateTime;\n * `fromDb` also passes binary-decoded instances through.\n */\nexport const plainDateTimeMapper: CustomSerde<Temporal.PlainDateTime, string> = t\n ? {\n // Text values look like `2018-01-01 10:00:00`\n fromDb: (value: string | Temporal.PlainDateTime) =>\n value instanceof t.PlainDateTime ? value : t.PlainDateTime.from(value),\n toDb: (p) => p.toString(),\n }\n : temporalNotAvailable;\n\n/**\n * Converts Postgres `TIMESTAMPTZ`, `TIMESTAMPTZ WITH TIME ZONE` to/from Temporal.ZonedDateTime.\n *\n * Specifically, Postgres uses ISO 8601, which Temporal supports as well, except that PG ouputs a space instead of `T`\n * between the date/time for output.\n *\n * Additionally, `Temporal.ZonedDateTime.from` expects a time zone literal name to be supplied as part of the string,\n * but this is not stored by postgres.\n *\n * As such, we parse the offset and append it to string passed to `from` as the time zone. This means that if we did a\n * round trip of generating a db value then parsing it, then it may not strictly equal the original zdt.\n *\n * Finally, PG stores dates as UTC and converts them to its local time zone for output, so we could get any offset\n * theoretically. If, somehow, we don't get an offset, then we assume UTC.\n */\nexport const zonedDateTimeMapper: CustomSerde<Temporal.ZonedDateTime, string> = t\n ? {\n // Produce a ZDT from a PG output like \"2021-01-01 12:00:00-05:00\"; binary-decoded\n // instances (lazy queries construct ZonedDateTimes directly) pass through\n fromDb: (value: string | Temporal.ZonedDateTime) => {\n if (typeof value !== \"string\") return value;\n const [offset] = value.match(/([+-]\\d{2}(?::?\\d{2})?)$/) ?? [];\n return t.ZonedDateTime.from(`${value}[${!offset || /^\\+00(:?00)?$/.test(offset) ? \"UTC\" : offset}]`);\n },\n // Match a PG `TIMESTAMPTZ` input format, i.e. \"2021-01-01T12:00:00-05:00\"\n toDb: (zdt) => zdt.toString({ timeZoneName: \"never\" }),\n }\n : temporalNotAvailable;\n"],"mappings":";;;AAIA,MAAM,EAAE,UAAU,MAAM,qBAAqB,KAAK,CAAC;AACnD,MAAM,uBAAuB;CAC3B,cAAc,KAAK,wBAAwB;CAC3C,YAAY,KAAK,wBAAwB;AAC3C;;;;;;;AAQA,MAAa,kBAA2D,IACpE;CACE,SAAS,UAAwC,iBAAiB,EAAE,YAAY,QAAQ,EAAE,UAAU,KAAK,KAAK;CAC9G,OAAO,MAAM,EAAE,SAAS;AAC1B,IACA;;AAGJ,MAAa,kBAA2D,IACpE;CACE,SAAS,UAAwC,iBAAiB,EAAE,YAAY,QAAQ,EAAE,UAAU,KAAK,KAAK;CAC9G,OAAO,OAAO,GAAG,SAAS;AAC5B,IACA;;;;;AAMJ,MAAa,sBAAmE,IAC5E;CAEE,SAAS,UACP,iBAAiB,EAAE,gBAAgB,QAAQ,EAAE,cAAc,KAAK,KAAK;CACvE,OAAO,MAAM,EAAE,SAAS;AAC1B,IACA;;;;;;;;;;;;;;;;AAiBJ,MAAa,sBAAmE,IAC5E;CAGE,SAAS,UAA2C;EAClD,IAAI,OAAO,UAAU,UAAU,OAAO;EACtC,MAAM,CAAC,UAAU,MAAM,MAAM,0BAA0B,KAAK,CAAC;EAC7D,OAAO,EAAE,cAAc,KAAK,GAAG,MAAM,GAAG,CAAC,UAAU,gBAAgB,KAAK,MAAM,IAAI,QAAQ,OAAO,EAAE;CACrG;CAEA,OAAO,QAAQ,IAAI,SAAS,EAAE,cAAc,QAAQ,CAAC;AACvD,IACA"}
|