joist-core 2.3.0-next.96 → 2.3.0-next.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/EntityManager.cjs +36 -39
- package/build/EntityManager.cjs.map +1 -1
- package/build/EntityManager.d.cts +4 -4
- package/build/EntityManager.d.mts +4 -4
- package/build/EntityManager.js +29 -32
- package/build/EntityManager.js.map +1 -1
- package/build/EntityMetadata.cjs +3 -3
- package/build/EntityMetadata.js +3 -3
- package/build/IndexManager.cjs +1 -1
- package/build/IndexManager.js +1 -1
- package/build/InstanceData.cjs +1 -1
- package/build/InstanceData.js +1 -1
- package/build/JoinRows.cjs +1 -1
- package/build/JoinRows.js +1 -1
- package/build/PluginManager.cjs +0 -1
- package/build/PluginManager.cjs.map +1 -1
- package/build/PluginManager.d.cts +1 -1
- package/build/PluginManager.d.mts +1 -1
- package/build/PluginManager.js +0 -1
- package/build/PluginManager.js.map +1 -1
- package/build/ReactionsManager.cjs +2 -2
- package/build/ReactionsManager.js +2 -2
- package/build/Todo.cjs +1 -1
- package/build/Todo.js +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.cjs +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.js +1 -1
- package/build/batchloaders/loadBatchLoader.cjs +6 -5
- package/build/batchloaders/loadBatchLoader.cjs.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/loadBatchLoader.js +4 -3
- package/build/batchloaders/loadBatchLoader.js.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.cjs +1 -1
- package/build/batchloaders/manyToManyBatchLoader.js +1 -1
- package/build/batchloaders/oneToManyBatchLoader.cjs +3 -3
- package/build/batchloaders/oneToManyBatchLoader.cjs.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.js +2 -2
- package/build/batchloaders/oneToOneBatchLoader.cjs +4 -4
- package/build/batchloaders/oneToOneBatchLoader.cjs.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.js +3 -3
- package/build/batchloaders/populateBatchLoader.cjs +11 -11
- package/build/batchloaders/populateBatchLoader.cjs.map +1 -1
- package/build/batchloaders/populateBatchLoader.js +8 -8
- package/build/batchloaders/recursiveChildrenBatchLoader.cjs +8 -8
- package/build/batchloaders/recursiveChildrenBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.js +5 -5
- package/build/batchloaders/recursiveM2mBatchLoader.cjs +5 -5
- package/build/batchloaders/recursiveM2mBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.js +2 -2
- package/build/batchloaders/recursiveParentsBatchLoader.cjs +8 -8
- package/build/batchloaders/recursiveParentsBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.js +5 -5
- package/build/changes.cjs +4 -4
- package/build/changes.js +4 -4
- package/build/config.cjs +3 -3
- package/build/config.js +3 -3
- package/build/configure.cjs +6 -6
- package/build/configure.js +6 -6
- package/build/dataloaders/fastWhereFilterHash.cjs +3 -3
- package/build/dataloaders/fastWhereFilterHash.cjs.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.js +2 -2
- package/build/dataloaders/fastWhereFilterHash.js.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.cjs +5 -6
- 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 +3 -4
- package/build/dataloaders/findByUniqueDataLoader.js.map +1 -1
- package/build/dataloaders/findCountDataLoader.cjs +10 -13
- package/build/dataloaders/findCountDataLoader.cjs.map +1 -1
- package/build/dataloaders/findCountDataLoader.d.cts +2 -2
- package/build/dataloaders/findCountDataLoader.d.mts +2 -2
- package/build/dataloaders/findCountDataLoader.js +4 -7
- package/build/dataloaders/findCountDataLoader.js.map +1 -1
- package/build/dataloaders/findDataLoader.cjs +15 -19
- package/build/dataloaders/findDataLoader.cjs.map +1 -1
- package/build/dataloaders/findDataLoader.d.cts +2 -2
- package/build/dataloaders/findDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findDataLoader.d.mts +2 -2
- package/build/dataloaders/findDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findDataLoader.js +5 -9
- package/build/dataloaders/findDataLoader.js.map +1 -1
- package/build/dataloaders/findIdsDataLoader.cjs +6 -9
- package/build/dataloaders/findIdsDataLoader.cjs.map +1 -1
- package/build/dataloaders/findIdsDataLoader.d.cts +1 -1
- package/build/dataloaders/findIdsDataLoader.d.mts +1 -1
- package/build/dataloaders/findIdsDataLoader.js +3 -6
- package/build/dataloaders/findIdsDataLoader.js.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.cjs +1 -2
- package/build/dataloaders/findOrCreateDataLoader.cjs.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.js +1 -2
- package/build/dataloaders/findOrCreateDataLoader.js.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.cjs +3 -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 +2 -5
- package/build/dataloaders/findPaginatedDataLoader.js.map +1 -1
- package/build/dataloaders/lensDataLoader.cjs +4 -4
- package/build/dataloaders/lensDataLoader.cjs.map +1 -1
- package/build/dataloaders/lensDataLoader.js +2 -2
- package/build/dataloaders/lensDataLoader.js.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.cjs +1 -4
- package/build/dataloaders/manyToManyFindDataLoader.cjs.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.cts +0 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.mts +0 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.js +1 -4
- package/build/dataloaders/manyToManyFindDataLoader.js.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.cjs +3 -6
- package/build/dataloaders/oneToManyFindDataLoader.cjs.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.cts +0 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.mts +0 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.js +2 -5
- package/build/dataloaders/oneToManyFindDataLoader.js.map +1 -1
- package/build/defaults.cjs +4 -4
- package/build/defaults.js +4 -4
- package/build/driverApi.cjs +4 -5
- package/build/driverApi.cjs.map +1 -1
- package/build/driverApi.d.cts +1 -1
- package/build/driverApi.d.mts +1 -1
- package/build/driverApi.js +2 -2
- package/build/driverApi.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 +2 -2
- package/build/drivers/EntityWriter.js +2 -2
- package/build/drivers/index.cjs +0 -6
- package/build/drivers/index.d.cts +1 -3
- package/build/drivers/index.d.mts +1 -3
- package/build/drivers/index.js +1 -3
- package/build/fieldSerde.cjs +2 -2
- package/build/fieldSerde.js +2 -2
- package/build/fields.cjs +2 -2
- package/build/fields.js +2 -2
- package/build/getProperties.cjs +1 -1
- package/build/getProperties.js +1 -1
- package/build/index.cjs +109 -107
- package/build/index.cjs.map +1 -1
- package/build/index.d.cts +27 -24
- package/build/index.d.cts.map +1 -1
- package/build/index.d.mts +27 -24
- package/build/index.d.mts.map +1 -1
- package/build/index.js +51 -49
- package/build/index.js.map +1 -1
- package/build/json.cjs +3 -3
- package/build/json.js +3 -3
- package/build/keys.cjs +1 -1
- package/build/keys.js +1 -1
- package/build/loadHints.cjs +1 -1
- package/build/loadHints.js +1 -1
- package/build/loadLens.cjs +1 -1
- package/build/loadLens.js +1 -1
- package/build/logging/FactoryLogger.cjs +1 -1
- package/build/logging/FactoryLogger.js +1 -1
- package/build/logging/FieldLogger.cjs +1 -1
- package/build/logging/FieldLogger.js +1 -1
- package/build/logging/ReactionLogger.cjs +1 -1
- package/build/logging/ReactionLogger.js +1 -1
- package/build/newEntity.cjs +1 -1
- package/build/newEntity.js +1 -1
- package/build/newTestInstance.cjs +3 -3
- package/build/newTestInstance.js +3 -3
- package/build/plugins/PreloadPlugin.cjs +1 -2
- package/build/plugins/PreloadPlugin.d.cts +1 -1
- package/build/plugins/PreloadPlugin.d.mts +1 -1
- package/build/plugins/PreloadPlugin.js +1 -2
- package/build/preloading/JsonAggregatePreloader.cjs +31 -31
- package/build/preloading/JsonAggregatePreloader.cjs.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.cts +1 -1
- package/build/preloading/JsonAggregatePreloader.d.mts +1 -1
- package/build/preloading/JsonAggregatePreloader.js +6 -6
- package/build/preloading/JsonAggregatePreloader.js.map +1 -1
- package/build/preloading/partitionHint.cjs +3 -3
- package/build/preloading/partitionHint.js +3 -3
- package/build/{ConditionBuilder.cjs → queries/ConditionBuilder.cjs} +7 -8
- package/build/queries/ConditionBuilder.cjs.map +1 -0
- package/build/{ConditionBuilder.d.cts → queries/ConditionBuilder.d.cts} +3 -3
- package/build/queries/ConditionBuilder.d.cts.map +1 -0
- package/build/{ConditionBuilder.d.mts → queries/ConditionBuilder.d.mts} +3 -3
- package/build/queries/ConditionBuilder.d.mts.map +1 -0
- package/build/{ConditionBuilder.js → queries/ConditionBuilder.js} +4 -5
- package/build/queries/ConditionBuilder.js.map +1 -0
- package/build/{conditions.cjs → queries/conditions.cjs} +1 -2
- package/build/queries/conditions.cjs.map +1 -0
- package/build/{conditions.d.cts → queries/conditions.d.cts} +2 -2
- package/build/queries/conditions.d.cts.map +1 -0
- package/build/{conditions.d.mts → queries/conditions.d.mts} +2 -2
- package/build/queries/conditions.d.mts.map +1 -0
- package/build/{conditions.js → queries/conditions.js} +1 -2
- package/build/queries/conditions.js.map +1 -0
- package/build/queries/entityQueryUtils.cjs +60 -0
- package/build/queries/entityQueryUtils.cjs.map +1 -0
- package/build/queries/entityQueryUtils.d.cts +19 -0
- package/build/queries/entityQueryUtils.d.cts.map +1 -0
- package/build/queries/entityQueryUtils.d.mts +19 -0
- package/build/queries/entityQueryUtils.d.mts.map +1 -0
- package/build/queries/entityQueryUtils.js +56 -0
- package/build/queries/entityQueryUtils.js.map +1 -0
- package/build/{Aliases.cjs → queries/find/Aliases.cjs} +23 -28
- package/build/queries/find/Aliases.cjs.map +1 -0
- package/build/{Aliases.d.cts → queries/find/Aliases.d.cts} +7 -7
- package/build/queries/find/Aliases.d.cts.map +1 -0
- package/build/{Aliases.d.mts → queries/find/Aliases.d.mts} +7 -7
- package/build/queries/find/Aliases.d.mts.map +1 -0
- package/build/{Aliases.js → queries/find/Aliases.js} +7 -12
- package/build/queries/find/Aliases.js.map +1 -0
- package/build/{DeferredAlias.cjs → queries/find/DeferredAlias.cjs} +3 -6
- package/build/queries/find/DeferredAlias.cjs.map +1 -0
- package/build/{DeferredAlias.d.cts → queries/find/DeferredAlias.d.cts} +4 -4
- package/build/queries/find/DeferredAlias.d.cts.map +1 -0
- package/build/{DeferredAlias.d.mts → queries/find/DeferredAlias.d.mts} +4 -4
- package/build/queries/find/DeferredAlias.d.mts.map +1 -0
- package/build/{DeferredAlias.js → queries/find/DeferredAlias.js} +2 -5
- package/build/queries/find/DeferredAlias.js.map +1 -0
- package/build/{EntityFilter.cjs → queries/find/EntityFilter.cjs} +4 -9
- package/build/queries/find/EntityFilter.cjs.map +1 -0
- package/build/{EntityFilter.d.cts → queries/find/EntityFilter.d.cts} +6 -6
- package/build/queries/find/EntityFilter.d.cts.map +1 -0
- package/build/{EntityFilter.d.mts → queries/find/EntityFilter.d.mts} +6 -6
- package/build/queries/find/EntityFilter.d.mts.map +1 -0
- package/build/{EntityFilter.js → queries/find/EntityFilter.js} +1 -6
- package/build/queries/find/EntityFilter.js.map +1 -0
- package/build/{EntityGraphQLFilter.cjs → queries/find/EntityGraphQLFilter.cjs} +1 -5
- package/build/queries/find/EntityGraphQLFilter.cjs.map +1 -0
- package/build/{EntityGraphQLFilter.d.cts → queries/find/EntityGraphQLFilter.d.cts} +3 -3
- package/build/queries/find/EntityGraphQLFilter.d.cts.map +1 -0
- package/build/{EntityGraphQLFilter.d.mts → queries/find/EntityGraphQLFilter.d.mts} +3 -3
- package/build/queries/find/EntityGraphQLFilter.d.mts.map +1 -0
- package/build/{EntityGraphQLFilter.js → queries/find/EntityGraphQLFilter.js} +1 -5
- package/build/queries/find/EntityGraphQLFilter.js.map +1 -0
- package/build/{QueryParser.cjs → queries/find/QueryParser.cjs} +68 -356
- package/build/queries/find/QueryParser.cjs.map +1 -0
- package/build/{QueryParser.collectionJoins.cjs → queries/find/QueryParser.collectionJoins.cjs} +8 -8
- package/build/queries/find/QueryParser.collectionJoins.cjs.map +1 -0
- package/build/{QueryParser.collectionJoins.d.cts → queries/find/QueryParser.collectionJoins.d.cts} +1 -1
- package/build/queries/find/QueryParser.collectionJoins.d.cts.map +1 -0
- package/build/{QueryParser.collectionJoins.d.mts → queries/find/QueryParser.collectionJoins.d.mts} +1 -1
- package/build/queries/find/QueryParser.collectionJoins.d.mts.map +1 -0
- package/build/{QueryParser.collectionJoins.js → queries/find/QueryParser.collectionJoins.js} +2 -2
- package/build/queries/find/QueryParser.collectionJoins.js.map +1 -0
- package/build/{QueryParser.d.cts → queries/find/QueryParser.d.cts} +5 -159
- package/build/queries/find/QueryParser.d.cts.map +1 -0
- package/build/{QueryParser.d.mts → queries/find/QueryParser.d.mts} +5 -159
- package/build/queries/find/QueryParser.d.mts.map +1 -0
- package/build/{QueryParser.js → queries/find/QueryParser.js} +15 -295
- package/build/queries/find/QueryParser.js.map +1 -0
- package/build/{QueryParser.pruning.cjs → queries/find/QueryParser.pruning.cjs} +6 -20
- package/build/queries/find/QueryParser.pruning.cjs.map +1 -0
- package/build/queries/find/QueryParser.pruning.d.cts +8 -0
- package/build/queries/find/QueryParser.pruning.d.cts.map +1 -0
- package/build/queries/find/QueryParser.pruning.d.mts +8 -0
- package/build/queries/find/QueryParser.pruning.d.mts.map +1 -0
- package/build/{QueryParser.pruning.js → queries/find/QueryParser.pruning.js} +4 -17
- package/build/queries/find/QueryParser.pruning.js.map +1 -0
- package/build/{QueryVisitor.cjs → queries/find/QueryVisitor.cjs} +2 -3
- package/build/queries/find/QueryVisitor.cjs.map +1 -0
- package/build/{QueryVisitor.d.cts → queries/find/QueryVisitor.d.cts} +3 -2
- package/build/queries/find/QueryVisitor.d.cts.map +1 -0
- package/build/{QueryVisitor.d.mts → queries/find/QueryVisitor.d.mts} +3 -2
- package/build/queries/find/QueryVisitor.d.mts.map +1 -0
- package/build/{QueryVisitor.js → queries/find/QueryVisitor.js} +2 -3
- package/build/queries/find/QueryVisitor.js.map +1 -0
- package/build/{drivers/buildRawQuery.cjs → queries/find/buildFindQuery.cjs} +14 -15
- package/build/queries/find/buildFindQuery.cjs.map +1 -0
- package/build/{drivers/buildRawQuery.d.cts → queries/find/buildFindQuery.d.cts} +3 -3
- package/build/queries/find/buildFindQuery.d.cts.map +1 -0
- package/build/{drivers/buildRawQuery.d.mts → queries/find/buildFindQuery.d.mts} +3 -3
- package/build/queries/find/buildFindQuery.d.mts.map +1 -0
- package/build/{drivers/buildRawQuery.js → queries/find/buildFindQuery.js} +5 -6
- package/build/queries/find/buildFindQuery.js.map +1 -0
- package/build/{scopes.cjs → queries/find/scopes.cjs} +2 -3
- package/build/queries/find/scopes.cjs.map +1 -0
- package/build/{scopes.d.cts → queries/find/scopes.d.cts} +6 -6
- package/build/queries/find/scopes.d.cts.map +1 -0
- package/build/{scopes.d.mts → queries/find/scopes.d.mts} +6 -6
- package/build/queries/find/scopes.d.mts.map +1 -0
- package/build/{scopes.js → queries/find/scopes.js} +2 -3
- package/build/queries/find/scopes.js.map +1 -0
- package/build/queries/parsedConditions.cjs +21 -0
- package/build/queries/parsedConditions.cjs.map +1 -0
- package/build/queries/parsedConditions.d.cts +127 -0
- package/build/queries/parsedConditions.d.cts.map +1 -0
- package/build/queries/parsedConditions.d.mts +127 -0
- package/build/queries/parsedConditions.d.mts.map +1 -0
- package/build/queries/parsedConditions.js +20 -0
- package/build/queries/parsedConditions.js.map +1 -0
- package/build/{drivers/buildUtils.cjs → queries/renderConditions.cjs} +7 -8
- package/build/queries/renderConditions.cjs.map +1 -0
- package/build/{drivers/buildUtils.d.mts → queries/renderConditions.d.cts} +5 -4
- package/build/queries/renderConditions.d.cts.map +1 -0
- package/build/{drivers/buildUtils.d.cts → queries/renderConditions.d.mts} +5 -4
- package/build/queries/renderConditions.d.mts.map +1 -0
- package/build/{drivers/buildUtils.js → queries/renderConditions.js} +4 -5
- package/build/queries/renderConditions.js.map +1 -0
- package/build/{skipCondition.cjs → queries/skipCondition.cjs} +1 -2
- package/build/queries/skipCondition.cjs.map +1 -0
- package/build/{skipCondition.d.cts → queries/skipCondition.d.cts} +2 -2
- package/build/{skipCondition.d.cts.map → queries/skipCondition.d.cts.map} +1 -1
- package/build/{skipCondition.d.mts → queries/skipCondition.d.mts} +2 -2
- package/build/{skipCondition.d.mts.map → queries/skipCondition.d.mts.map} +1 -1
- package/build/{skipCondition.js → queries/skipCondition.js} +1 -2
- package/build/queries/skipCondition.js.map +1 -0
- package/build/{AliasAssigner.cjs → queries/sql/AliasAssigner.cjs} +2 -3
- package/build/queries/sql/AliasAssigner.cjs.map +1 -0
- package/build/{AliasAssigner.d.cts → queries/sql/AliasAssigner.d.cts} +2 -2
- package/build/queries/sql/AliasAssigner.d.cts.map +1 -0
- package/build/{AliasAssigner.d.mts → queries/sql/AliasAssigner.d.mts} +2 -2
- package/build/queries/sql/AliasAssigner.d.mts.map +1 -0
- package/build/{AliasAssigner.js → queries/sql/AliasAssigner.js} +2 -3
- package/build/queries/sql/AliasAssigner.js.map +1 -0
- package/build/{Expr.cjs → queries/sql/Expr.cjs} +9 -9
- package/build/queries/sql/Expr.cjs.map +1 -0
- package/build/{Expr.d.cts → queries/sql/Expr.d.cts} +4 -4
- package/build/queries/sql/Expr.d.cts.map +1 -0
- package/build/{Expr.d.mts → queries/sql/Expr.d.mts} +4 -4
- package/build/queries/sql/Expr.d.mts.map +1 -0
- package/build/{Expr.js → queries/sql/Expr.js} +4 -4
- package/build/queries/sql/Expr.js.map +1 -0
- package/build/{Tables.cjs → queries/sql/Tables.cjs} +63 -67
- package/build/queries/sql/Tables.cjs.map +1 -0
- package/build/{Tables.d.cts → queries/sql/Tables.d.cts} +6 -7
- package/build/queries/sql/Tables.d.cts.map +1 -0
- package/build/{Tables.d.mts → queries/sql/Tables.d.mts} +6 -7
- package/build/queries/sql/Tables.d.mts.map +1 -0
- package/build/{Tables.js → queries/sql/Tables.js} +9 -13
- package/build/queries/sql/Tables.js.map +1 -0
- package/build/{execute.cjs → queries/sql/execute.cjs} +32 -37
- package/build/queries/sql/execute.cjs.map +1 -0
- package/build/{execute.d.cts → queries/sql/execute.d.cts} +6 -6
- package/build/queries/sql/execute.d.cts.map +1 -0
- package/build/{execute.d.mts → queries/sql/execute.d.mts} +6 -6
- package/build/queries/sql/execute.d.mts.map +1 -0
- package/build/{execute.js → queries/sql/execute.js} +5 -10
- package/build/queries/sql/execute.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/arrayAgg.cjs +12 -12
- package/build/queries/sql/expressions/arrayAgg.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/arrayAgg.d.cts +1 -1
- package/build/queries/sql/expressions/arrayAgg.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/arrayAgg.d.mts +1 -1
- package/build/queries/sql/expressions/arrayAgg.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/arrayAgg.js +1 -1
- package/build/queries/sql/expressions/arrayAgg.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/case.cjs +14 -14
- package/build/queries/sql/expressions/case.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/case.d.cts +1 -1
- package/build/queries/sql/expressions/case.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/case.d.mts +1 -1
- package/build/queries/sql/expressions/case.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/case.js +1 -1
- package/build/queries/sql/expressions/case.js.map +1 -0
- package/build/queries/sql/expressions/coalesce.cjs +25 -0
- package/build/queries/sql/expressions/coalesce.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/coalesce.d.cts +1 -1
- package/build/queries/sql/expressions/coalesce.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/coalesce.d.mts +1 -1
- package/build/queries/sql/expressions/coalesce.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/coalesce.js +1 -1
- package/build/queries/sql/expressions/coalesce.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/codecs.cjs +5 -5
- package/build/queries/sql/expressions/codecs.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/codecs.d.cts +1 -1
- package/build/queries/sql/expressions/codecs.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/codecs.d.mts +1 -1
- package/build/queries/sql/expressions/codecs.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/codecs.js +3 -3
- package/build/queries/sql/expressions/codecs.js.map +1 -0
- package/build/queries/sql/expressions/expression.cjs +102 -0
- package/build/queries/sql/expressions/expression.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/expression.d.cts +1 -1
- package/build/queries/sql/expressions/expression.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/expression.d.mts +1 -1
- package/build/queries/sql/expressions/expression.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/expression.js +2 -2
- package/build/queries/sql/expressions/expression.js.map +1 -0
- package/build/queries/sql/expressions/greatest.cjs +25 -0
- package/build/queries/sql/expressions/greatest.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/greatest.d.cts +1 -1
- package/build/queries/sql/expressions/greatest.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/greatest.d.mts +1 -1
- package/build/queries/sql/expressions/greatest.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/greatest.js +1 -1
- package/build/queries/sql/expressions/greatest.js.map +1 -0
- package/build/queries/sql/expressions/least.cjs +25 -0
- package/build/queries/sql/expressions/least.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/least.d.cts +1 -1
- package/build/queries/sql/expressions/least.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/least.d.mts +1 -1
- package/build/queries/sql/expressions/least.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/least.js +1 -1
- package/build/queries/sql/expressions/least.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/nullIf.cjs +6 -6
- package/build/queries/sql/expressions/nullIf.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/nullIf.d.cts +1 -1
- package/build/queries/sql/expressions/nullIf.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/nullIf.d.mts +1 -1
- package/build/queries/sql/expressions/nullIf.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/nullIf.js +1 -1
- package/build/queries/sql/expressions/nullIf.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/parseExpression.cjs +16 -16
- package/build/queries/sql/expressions/parseExpression.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/parseExpression.d.cts +1 -1
- package/build/queries/sql/expressions/parseExpression.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/parseExpression.d.mts +1 -1
- package/build/queries/sql/expressions/parseExpression.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/parseExpression.js +2 -2
- package/build/queries/sql/expressions/parseExpression.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/types.d.cts +1 -1
- package/build/queries/sql/expressions/types.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/types.d.mts +1 -1
- package/build/queries/sql/expressions/types.d.mts.map +1 -0
- package/build/{keywords.cjs → queries/sql/keywords.cjs} +1 -1
- package/build/queries/sql/keywords.cjs.map +1 -0
- package/build/{keywords.d.cts → queries/sql/keywords.d.cts} +1 -1
- package/build/queries/sql/keywords.d.cts.map +1 -0
- package/build/{keywords.d.mts → queries/sql/keywords.d.mts} +1 -1
- package/build/queries/sql/keywords.d.mts.map +1 -0
- package/build/{keywords.js → queries/sql/keywords.js} +1 -1
- package/build/queries/sql/keywords.js.map +1 -0
- package/build/{query.cjs → queries/sql/query.cjs} +83 -84
- package/build/queries/sql/query.cjs.map +1 -0
- package/build/{query.d.cts → queries/sql/query.d.cts} +7 -7
- package/build/queries/sql/query.d.cts.map +1 -0
- package/build/{query.d.mts → queries/sql/query.d.mts} +7 -7
- package/build/queries/sql/query.d.mts.map +1 -0
- package/build/{query.js → queries/sql/query.js} +11 -12
- package/build/queries/sql/query.js.map +1 -0
- package/build/queries/valueFilters.cjs +248 -0
- package/build/queries/valueFilters.cjs.map +1 -0
- package/build/queries/valueFilters.d.cts +28 -0
- package/build/queries/valueFilters.d.cts.map +1 -0
- package/build/queries/valueFilters.d.mts +28 -0
- package/build/queries/valueFilters.d.mts.map +1 -0
- package/build/queries/valueFilters.js +243 -0
- package/build/queries/valueFilters.js.map +1 -0
- package/build/reactiveHints.cjs +5 -5
- package/build/reactiveHints.js +5 -5
- package/build/relations/AbstractRelationImpl.cjs +0 -5
- package/build/relations/AbstractRelationImpl.cjs.map +1 -1
- package/build/relations/AbstractRelationImpl.d.cts +1 -2
- package/build/relations/AbstractRelationImpl.d.cts.map +1 -1
- package/build/relations/AbstractRelationImpl.d.mts +1 -2
- package/build/relations/AbstractRelationImpl.d.mts.map +1 -1
- package/build/relations/AbstractRelationImpl.js +1 -5
- package/build/relations/AbstractRelationImpl.js.map +1 -1
- package/build/relations/AsyncProperty.cjs +1 -1
- package/build/relations/AsyncProperty.js +1 -1
- package/build/relations/AsyncReactiveField.cjs +3 -3
- package/build/relations/AsyncReactiveField.js +3 -3
- package/build/relations/Collection.cjs +1 -1
- package/build/relations/Collection.js +1 -1
- package/build/relations/CustomCollection.cjs +1 -1
- package/build/relations/CustomCollection.js +1 -1
- package/build/relations/CustomReference.cjs +3 -3
- package/build/relations/CustomReference.js +3 -3
- package/build/relations/EnumCollection.cjs +2 -2
- package/build/relations/EnumCollection.js +2 -2
- package/build/relations/LazyField.cjs +6 -7
- package/build/relations/LazyField.cjs.map +1 -1
- package/build/relations/LazyField.js +5 -6
- package/build/relations/LazyField.js.map +1 -1
- package/build/relations/ManyToManyCollection.cjs +4 -3
- package/build/relations/ManyToManyCollection.cjs.map +1 -1
- package/build/relations/ManyToManyCollection.d.cts.map +1 -1
- package/build/relations/ManyToManyCollection.d.mts.map +1 -1
- package/build/relations/ManyToManyCollection.js +4 -3
- package/build/relations/ManyToManyCollection.js.map +1 -1
- package/build/relations/ManyToManyLargeCollection.cjs +2 -2
- package/build/relations/ManyToManyLargeCollection.js +2 -2
- package/build/relations/ManyToOneReference.cjs +7 -6
- package/build/relations/ManyToOneReference.cjs.map +1 -1
- package/build/relations/ManyToOneReference.d.cts.map +1 -1
- package/build/relations/ManyToOneReference.d.mts.map +1 -1
- package/build/relations/ManyToOneReference.js +7 -6
- package/build/relations/ManyToOneReference.js.map +1 -1
- package/build/relations/OneToManyCollection.cjs +6 -5
- package/build/relations/OneToManyCollection.cjs.map +1 -1
- package/build/relations/OneToManyCollection.d.cts.map +1 -1
- package/build/relations/OneToManyCollection.d.mts.map +1 -1
- package/build/relations/OneToManyCollection.js +4 -3
- package/build/relations/OneToManyCollection.js.map +1 -1
- package/build/relations/OneToManyLargeCollection.cjs +3 -3
- package/build/relations/OneToManyLargeCollection.js +3 -3
- package/build/relations/OneToOneReference.cjs +6 -5
- package/build/relations/OneToOneReference.cjs.map +1 -1
- package/build/relations/OneToOneReference.d.cts.map +1 -1
- package/build/relations/OneToOneReference.d.mts.map +1 -1
- package/build/relations/OneToOneReference.js +6 -5
- package/build/relations/OneToOneReference.js.map +1 -1
- package/build/relations/PolymorphicReference.cjs +7 -6
- package/build/relations/PolymorphicReference.cjs.map +1 -1
- package/build/relations/PolymorphicReference.d.cts.map +1 -1
- package/build/relations/PolymorphicReference.d.mts.map +1 -1
- package/build/relations/PolymorphicReference.js +7 -6
- package/build/relations/PolymorphicReference.js.map +1 -1
- package/build/relations/ReactiveField.cjs +3 -3
- package/build/relations/ReactiveField.js +3 -3
- package/build/relations/ReactiveGetter.cjs +1 -1
- package/build/relations/ReactiveGetter.js +1 -1
- package/build/relations/ReactiveManyToMany.cjs +5 -4
- package/build/relations/ReactiveManyToMany.cjs.map +1 -1
- package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
- package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
- package/build/relations/ReactiveManyToMany.js +5 -4
- package/build/relations/ReactiveManyToMany.js.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.cjs +3 -3
- package/build/relations/ReactiveManyToManyOtherSide.js +3 -3
- package/build/relations/ReactiveReference.cjs +8 -7
- package/build/relations/ReactiveReference.cjs.map +1 -1
- package/build/relations/ReactiveReference.d.cts.map +1 -1
- package/build/relations/ReactiveReference.d.mts.map +1 -1
- package/build/relations/ReactiveReference.js +8 -7
- package/build/relations/ReactiveReference.js.map +1 -1
- package/build/relations/RecursiveCollection.cjs +3 -3
- package/build/relations/RecursiveCollection.js +3 -3
- package/build/relations/Reference.cjs +1 -1
- package/build/relations/Reference.js +1 -1
- package/build/relations/hasAsyncMethod.cjs +1 -1
- package/build/relations/hasAsyncMethod.js +1 -1
- package/build/relations/hasManyDerived.cjs +1 -1
- package/build/relations/hasManyDerived.js +1 -1
- package/build/relations/hasOneDerived.cjs +2 -2
- package/build/relations/hasOneDerived.js +2 -2
- package/build/relations/hasProperty.cjs +2 -2
- package/build/relations/hasProperty.js +2 -2
- package/build/relations/index.cjs +13 -13
- package/build/relations/index.js +13 -13
- package/build/relations/isCascadeDelete.cjs +11 -0
- package/build/relations/isCascadeDelete.cjs.map +1 -0
- package/build/relations/isCascadeDelete.d.cts +7 -0
- package/build/relations/isCascadeDelete.d.cts.map +1 -0
- package/build/relations/isCascadeDelete.d.mts +7 -0
- package/build/relations/isCascadeDelete.d.mts.map +1 -0
- package/build/relations/isCascadeDelete.js +10 -0
- package/build/relations/isCascadeDelete.js.map +1 -0
- package/build/resurrection.cjs +1 -1
- package/build/resurrection.js +1 -1
- package/build/rules.cjs +4 -4
- package/build/rules.js +4 -4
- package/build/serde.cjs +1 -1
- package/build/serde.js +1 -1
- package/build/unnest.cjs +0 -1
- package/build/unnest.cjs.map +1 -1
- package/build/unnest.d.cts +1 -1
- package/build/unnest.d.mts +1 -1
- package/build/unnest.js +0 -1
- package/build/unnest.js.map +1 -1
- package/build/upsert.cjs +3 -3
- package/build/upsert.js +3 -3
- package/build/utils.cjs +1 -2
- 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 +1 -2
- package/build/utils.js.map +1 -1
- package/build/withLoaded.cjs +3 -3
- package/build/withLoaded.js +3 -3
- package/package.json +2 -2
- package/build/AliasAssigner.cjs.map +0 -1
- package/build/AliasAssigner.d.cts.map +0 -1
- package/build/AliasAssigner.d.mts.map +0 -1
- package/build/AliasAssigner.js.map +0 -1
- package/build/Aliases.cjs.map +0 -1
- package/build/Aliases.d.cts.map +0 -1
- package/build/Aliases.d.mts.map +0 -1
- package/build/Aliases.js.map +0 -1
- package/build/ConditionBuilder.cjs.map +0 -1
- package/build/ConditionBuilder.d.cts.map +0 -1
- package/build/ConditionBuilder.d.mts.map +0 -1
- package/build/ConditionBuilder.js.map +0 -1
- package/build/DeferredAlias.cjs.map +0 -1
- package/build/DeferredAlias.d.cts.map +0 -1
- package/build/DeferredAlias.d.mts.map +0 -1
- package/build/DeferredAlias.js.map +0 -1
- package/build/EntityFilter.cjs.map +0 -1
- package/build/EntityFilter.d.cts.map +0 -1
- package/build/EntityFilter.d.mts.map +0 -1
- package/build/EntityFilter.js.map +0 -1
- package/build/EntityGraphQLFilter.cjs.map +0 -1
- package/build/EntityGraphQLFilter.d.cts.map +0 -1
- package/build/EntityGraphQLFilter.d.mts.map +0 -1
- package/build/EntityGraphQLFilter.js.map +0 -1
- package/build/Expr.cjs.map +0 -1
- package/build/Expr.d.cts.map +0 -1
- package/build/Expr.d.mts.map +0 -1
- package/build/Expr.js.map +0 -1
- package/build/QueryParser.cjs.map +0 -1
- package/build/QueryParser.collectionJoins.cjs.map +0 -1
- package/build/QueryParser.collectionJoins.d.cts.map +0 -1
- package/build/QueryParser.collectionJoins.d.mts.map +0 -1
- package/build/QueryParser.collectionJoins.js.map +0 -1
- package/build/QueryParser.d.cts.map +0 -1
- package/build/QueryParser.d.mts.map +0 -1
- package/build/QueryParser.js.map +0 -1
- package/build/QueryParser.pruning.cjs.map +0 -1
- package/build/QueryParser.pruning.d.cts +0 -10
- package/build/QueryParser.pruning.d.cts.map +0 -1
- package/build/QueryParser.pruning.d.mts +0 -10
- package/build/QueryParser.pruning.d.mts.map +0 -1
- package/build/QueryParser.pruning.js.map +0 -1
- package/build/QueryVisitor.cjs.map +0 -1
- package/build/QueryVisitor.d.cts.map +0 -1
- package/build/QueryVisitor.d.mts.map +0 -1
- package/build/QueryVisitor.js.map +0 -1
- package/build/Tables.cjs.map +0 -1
- package/build/Tables.d.cts.map +0 -1
- package/build/Tables.d.mts.map +0 -1
- package/build/Tables.js.map +0 -1
- package/build/conditions.cjs.map +0 -1
- package/build/conditions.d.cts.map +0 -1
- package/build/conditions.d.mts.map +0 -1
- package/build/conditions.js.map +0 -1
- package/build/drivers/buildRawQuery.cjs.map +0 -1
- package/build/drivers/buildRawQuery.d.cts.map +0 -1
- package/build/drivers/buildRawQuery.d.mts.map +0 -1
- package/build/drivers/buildRawQuery.js.map +0 -1
- package/build/drivers/buildUtils.cjs.map +0 -1
- package/build/drivers/buildUtils.d.cts.map +0 -1
- package/build/drivers/buildUtils.d.mts.map +0 -1
- package/build/drivers/buildUtils.js.map +0 -1
- package/build/execute.cjs.map +0 -1
- package/build/execute.d.cts.map +0 -1
- package/build/execute.d.mts.map +0 -1
- package/build/execute.js.map +0 -1
- package/build/expressions/arrayAgg.cjs.map +0 -1
- package/build/expressions/arrayAgg.d.cts.map +0 -1
- package/build/expressions/arrayAgg.d.mts.map +0 -1
- package/build/expressions/arrayAgg.js.map +0 -1
- package/build/expressions/case.cjs.map +0 -1
- package/build/expressions/case.d.cts.map +0 -1
- package/build/expressions/case.d.mts.map +0 -1
- package/build/expressions/case.js.map +0 -1
- package/build/expressions/coalesce.cjs +0 -25
- package/build/expressions/coalesce.cjs.map +0 -1
- package/build/expressions/coalesce.d.cts.map +0 -1
- package/build/expressions/coalesce.d.mts.map +0 -1
- package/build/expressions/coalesce.js.map +0 -1
- package/build/expressions/codecs.cjs.map +0 -1
- package/build/expressions/codecs.d.cts.map +0 -1
- package/build/expressions/codecs.d.mts.map +0 -1
- package/build/expressions/codecs.js.map +0 -1
- package/build/expressions/expression.cjs +0 -102
- package/build/expressions/expression.cjs.map +0 -1
- package/build/expressions/expression.d.cts.map +0 -1
- package/build/expressions/expression.d.mts.map +0 -1
- package/build/expressions/expression.js.map +0 -1
- package/build/expressions/greatest.cjs +0 -25
- package/build/expressions/greatest.cjs.map +0 -1
- package/build/expressions/greatest.d.cts.map +0 -1
- package/build/expressions/greatest.d.mts.map +0 -1
- package/build/expressions/greatest.js.map +0 -1
- package/build/expressions/least.cjs +0 -25
- package/build/expressions/least.cjs.map +0 -1
- package/build/expressions/least.d.cts.map +0 -1
- package/build/expressions/least.d.mts.map +0 -1
- package/build/expressions/least.js.map +0 -1
- package/build/expressions/nullIf.cjs.map +0 -1
- package/build/expressions/nullIf.d.cts.map +0 -1
- package/build/expressions/nullIf.d.mts.map +0 -1
- package/build/expressions/nullIf.js.map +0 -1
- package/build/expressions/parseExpression.cjs.map +0 -1
- package/build/expressions/parseExpression.d.cts.map +0 -1
- package/build/expressions/parseExpression.d.mts.map +0 -1
- package/build/expressions/parseExpression.js.map +0 -1
- package/build/expressions/types.d.cts.map +0 -1
- package/build/expressions/types.d.mts.map +0 -1
- package/build/keywords.cjs.map +0 -1
- package/build/keywords.d.cts.map +0 -1
- package/build/keywords.d.mts.map +0 -1
- package/build/keywords.js.map +0 -1
- package/build/query.cjs.map +0 -1
- package/build/query.d.cts.map +0 -1
- package/build/query.d.mts.map +0 -1
- package/build/query.js.map +0 -1
- package/build/scopes.cjs.map +0 -1
- package/build/scopes.d.cts.map +0 -1
- package/build/scopes.d.mts.map +0 -1
- package/build/scopes.js.map +0 -1
- package/build/skipCondition.cjs.map +0 -1
- package/build/skipCondition.js.map +0 -1
- /package/build/{expressions → queries/sql/expressions}/types.cjs +0 -0
- /package/build/{expressions → queries/sql/expressions}/types.js +0 -0
package/build/Tables.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Tables.d.mts","names":[],"sources":["../src/Tables.ts"],"mappings":"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"}
|
package/build/Tables.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Tables.js","names":[],"sources":["../src/Tables.ts"],"sourcesContent":["import { groupBy } from \"joist-utils\";\n\nimport { type Column } from \"./columns.ts\";\nimport { type SqlCondition } from \"./conditions.ts\";\n// Load-order only: without this, the built cjs/esm module graph evaluates relations/* before their\n// base classes exist (\"Class extends value undefined\"); keep it even though no symbol is imported.\nimport \"./configure.ts\";\nimport { buildValueCondition } from \"./drivers/buildUtils.ts\";\nimport { type Entity, isEntity } from \"./Entity.ts\";\nimport { type IdOf, type MaybeAbstractEntityConstructor, type TaggedId } from \"./EntityManager.ts\";\nimport {\n type EntityMetadata,\n type Field,\n type LargeOneToManyField,\n type ManyToManyField,\n type OneToManyField,\n type OneToOneField,\n type PolymorphicField,\n type PolymorphicFieldComponent,\n getBaseAndSelfMetas,\n getBaseMeta,\n getBaseSelfAndSubMetas,\n getMetadata,\n} from \"./EntityMetadata.ts\";\nimport {\n BaseExpr,\n type Expr,\n type ExprContext,\n type ExprLike,\n type InnerJoin,\n type LeftJoin,\n type SqlFragment,\n asNode,\n deferredCondition,\n isExpr,\n} from \"./Expr.ts\";\nimport { getConstructorFromTaggedId, maybeResolveReferenceToId } from \"./index.ts\";\nimport { toIdOf } from \"./keys.ts\";\nimport { kqDot } from \"./keywords.ts\";\nimport { type ParsedValueFilter, makeLike, mapToDb, parseEntityFilter, parseValueFilter } from \"./QueryParser.ts\";\nimport { skipCondition } from \"./skipCondition.ts\";\nimport { type TypeInfo } from \"./TypeInfo.ts\";\nimport { type ColumnsOf, type FieldsOf, type FilterOf, type TypeMap, type TypeNameOf } from \"./typeMap.ts\";\nimport { fail } from \"./utils.ts\";\n\n/** Creates physical column expressions and relationship joins for `T`. */\nexport function table<T extends Entity>(cstr: MaybeAbstractEntityConstructor<T>): Table<T>;\n/**\n * Creates a table with an explicit type-level name, i.e. `table(Author, \"m\")` for a self-join.\n *\n * The name is the table's source key in `em.query`: two bare `table(Author)`s share the key `\"Author\"`,\n * so a left-joined mentor would also mark the mentee's columns nullable; a named alias has its own key.\n */\nexport function table<T extends Entity, Name extends string>(\n cstr: MaybeAbstractEntityConstructor<T>,\n name: Name,\n): Table<T, Name>;\nexport function table<T extends Entity>(cstr: MaybeAbstractEntityConstructor<T>, _name?: string): unknown {\n // The name only exists at the type level; the SQL alias is still assigned by the query parser\n return newTableProxy(cstr);\n}\n\n/** Creates multiple physical table handles. */\nexport function tables<T extends readonly MaybeAbstractEntityConstructor<any>[]>(\n ...type: T\n): { [P in keyof T]: T[P] extends MaybeAbstractEntityConstructor<infer E extends Entity> ? Table<E> : never } {\n return type.map((t) => newTableProxy(t)) as any;\n}\n\n/**\n * The runtime management interface plus phantom type information for `em.query`.\n *\n * `__entity` lets `QueryRow` recover `T` for entity mode (you cannot `infer T` back out of a mapped\n * type), and `__name` is the table's source key (see `Expr`).\n */\nexport interface TableBrand<T, Name extends string> extends TableMgmt {\n readonly __entity: T;\n readonly __name: Name;\n}\n\n/**\n * A physical table for `T`: one expression per SQL column, with relationship names as join factories.\n * Selecting the table itself retains entity hydration; selecting columns returns decoded SQL values.\n *\n * Unlike an Alias, a Table is an explicit SQL source, not a place to bind in an em.find relationship\n * tree. I.e. with `a = table(Author)`, `{ from: a }` registers that handle in the query's scope.\n * Its columns already know their physical column and codec, but their SQL name still depends on the\n * query: the same Author handle might be `a` in one query and `a1` in a nested query.\n *\n * Each predicate occurrence renders through ExprContext.aliasFor using the current scope (or an\n * enclosing scope for a correlation). Rendering returns SQL, ordered bindings, and source references\n * together. A comparison records both sides' references; templates and subqueries carry their\n * references too. Join pruning follows these references and join dependencies, rather than guessing\n * which tables a SQL string mentions. It also accounts for select/order/group expressions and keep.\n *\n * I.e. if a joined Author is used only by `a.firstName.eq(name)`, supplying undefined removes that\n * predicate and lets the unused join prune. Both APIs share this undefined-condition pruning rule;\n * they differ in how they get the references: Alias resolves domain conditions against a relationship\n * tree, while Table renders SQL expressions against explicit sources. Neither caches SQL names on\n * the reusable handle or predicate, so one parse cannot overwrite another parse's bindings.\n *\n * `Name` is the table's type-level source key, defaulting to the entity's own type name, so a\n * LEFT-joined SmallPublisher does not make Publisher columns nullable. `table(Author, \"m\")`\n * gives a self-join table its own key.\n */\nexport type Table<T extends Entity, Name extends string = TableNameOf<T>> = TableShape<T, Name> &\n (\"where\" extends keyof TableShape<T, Name>\n ? {}\n : {\n /** Builds an AND condition from local domain fields, without implicit joins. */\n where(filter: TableFilter<T>): SqlCondition;\n });\n\n/** Domain filters for fields stored on this physical table, without relationship traversal. */\nexport type TableFilter<T extends Entity> = {\n [K in LocalFieldNames<T> & keyof FieldsOf<T>]?: FieldsOf<T>[K] extends {\n kind: \"m2o\";\n type: infer U extends Entity;\n nullable: infer N;\n }\n ? TableReferenceFilter<U, N extends undefined ? null : never>\n : FilterOf<T>[K];\n};\n\n/** Generated column ownership excludes CTI base fields and polymorphic components. */\ntype LocalFieldNames<T> = ColumnsOf<T>[keyof ColumnsOf<T>] extends { fieldName: infer F }\n ? Extract<F, keyof FilterOf<T>>\n : never;\n\n/** The owning-reference subset of find filters that only compares a foreign key. */\ntype TableReferenceFilter<T extends Entity, N> =\n | T\n | IdOf<T>\n | readonly (T | IdOf<T>)[]\n | boolean\n | N\n | undefined\n | { ne: T | IdOf<T> | N | undefined };\n\ntype TableShape<T extends Entity, Name extends string> = {\n readonly [tableMgmt]: TableBrand<T, Name>;\n} & {\n [P in keyof ColumnsOf<T>]: P extends \"id\"\n ? EntityColumn<T, never, Name>\n : ColumnsOf<T>[P] extends { entity: infer U extends Entity; nullable: infer N }\n ? ReferenceColumn<U, N extends true ? null : never, Name>\n : ColumnsOf<T>[P] extends { type: infer V; nullable: infer N }\n ? PrimitiveColumn<V, N extends true ? null : never, Name>\n : never;\n} & {\n [\n P in keyof FieldsOf<T> as P extends keyof ColumnsOf<T>\n ? never\n : FieldsOf<T>[P] extends { kind: \"m2o\" | \"poly\" | \"o2m\" | \"lo2m\" | \"m2m\" | \"o2o\" }\n ? P\n : never\n ]: FieldsOf<T>[P] extends { kind: \"m2o\"; type: infer U extends Entity; nullable: infer N }\n ? ReferenceJoin<U, N extends undefined ? null : never, Name>\n : FieldsOf<T>[P] extends { kind: \"poly\"; type: infer U extends Entity; nullable: infer N }\n ? PolyReference<U, N extends undefined ? null : never, Name>\n : FieldsOf<T>[P] extends { kind: \"o2m\" | \"lo2m\" | \"m2m\" | \"o2o\"; type: infer U extends Entity }\n ? CollectionJoin<U>\n : never;\n} & {\n [\n K in keyof TypeMap as TypeMap[K] extends {\n entityType: infer U extends Entity & { __type: { 0: TypeNameOf<T>; 1: string } };\n }\n ? Uncapitalize<TypeNameOf<U> & string>\n : never\n ]: TypeMap[K] extends { entityType: infer U extends Entity } ? SubtypeJoin<U> : never;\n};\n\n/** Keeps explicit base and subtype sources independent, with generic entities untracked. */\ntype TableNameOf<T> = T extends { __type: { 0: string } } ? TypeNameOf<T> & string : string;\n\n/** Provides fluent methods for creating joins through an owning reference relationship. */\nexport interface ReferenceJoin<U extends Entity, N extends null | never, Src extends string = string> {\n /**\n * Required reference joins like `b.author.as(a)` are INNER unless `b` is already a LEFT-joined alias.\n * Nullable references are always LEFT joined.\n */\n as<A extends TableFor<U>>(other: A): [N] extends [never] ? DefaultReferenceJoin<A, Src> : LeftJoin<A>;\n inner<A extends TableFor<U>>(other: A): InnerJoin<A>;\n left<A extends TableFor<U>>(other: A): LeftJoin<A>;\n}\n\n/** The source of a default reference join, used to inherit optional paths within each query. */\nexport const referenceJoinSource: unique symbol = Symbol(\"joist.referenceJoinSource\");\n\n/** A required reference defaults to INNER unless its source was LEFT joined. */\nexport type DefaultReferenceJoin<A, Src extends string> = InnerJoin<A> & {\n readonly [referenceJoinSource]: Src;\n};\n\n/** Any table whose entity is (a subtype of) `U`, i.e. what a relation join factory accepts. */\nexport type TableFor<U> = { readonly [tableMgmt]: TableBrand<U, string> };\n\n/**\n * A collection relation (o2m/o2o/m2m) as a join factory: `a.books.as(b)` returns the same\n * `{ left: b, on: ... }` entry the expanded form writes, with the FK condition built from metadata, so\n * join-list inference, nullability, scope checking, and pruning are unchanged and both forms mix freely.\n *\n * `as` binds the joined alias, the same way em.find's `{ books: { as: b } }` does. The default is LEFT\n * (a collection may be empty, and a LEFT join never filters rows, so pruning it is always safe);\n * `.inner(b)` opts into filtering. An m2m entry carries a hidden second join through the join table,\n * which the parser expands; the pair prunes together.\n */\nexport interface CollectionJoin<U extends Entity> {\n as<A extends TableFor<U>>(other: A): LeftJoin<A>;\n inner<A extends TableFor<U>>(other: A): InnerJoin<A>;\n left<A extends TableFor<U>>(other: A): LeftJoin<A>;\n}\n\n/** A named subtype join, defaulting to LEFT because a root row may belong to another subtype. */\ninterface SubtypeJoin<U extends Entity> extends CollectionJoin<U> {\n <A extends TableFor<U>>(other: A): LeftJoin<A>;\n}\n\n/**\n * A physical FK column expression (`b.authorId` selects/compares the `author_id` FK) plus a join factory\n * (`b.authorId.as(a)` joins). The default join kind follows physical column nullability:\n * a NOT NULL FK is INNER unless its source was LEFT joined, a nullable one is LEFT, and the row type reflects it.\n */\nexport interface ReferenceColumn<U extends Entity, N extends null | never, Src extends string>\n extends EntityColumn<U, N, Src>, ReferenceJoin<U, N, Src> {}\n\n/**\n * A polymorphic reference: condition methods (each resolving the component column from the value), plus\n * a join factory that picks the component from the argument's entity, i.e. `c.parent.as(a)` joins\n * through `parent_author_id`, like an explicit join with `on: c.parent.eq(a.id)`.\n */\nexport interface PolyReference<\n U extends Entity,\n N extends null | never,\n Src extends string = string,\n> extends ReferenceJoin<U, N, Src> {\n eq(value: U | TaggedId | ExprLike<IdOf<U> | null> | null | undefined): SqlCondition;\n ne(value: U | TaggedId | ExprLike<IdOf<U> | null> | null | undefined): SqlCondition;\n in(values: readonly (U | TaggedId)[] | ExprLike<IdOf<U> | null> | undefined): SqlCondition;\n /** Applies an IN condition unless the list is empty or undefined. */\n inNonEmpty(values: readonly (U | TaggedId)[] | undefined): SqlCondition;\n}\n\nexport interface PrimitiveColumn<V, N extends null | never, Src extends string = string> extends Expr<V | N, Src> {\n eq(value: V | ExprLike<V | N> | N | undefined): SqlCondition;\n ne(value: V | ExprLike<V | N> | N | undefined): SqlCondition;\n in(values: readonly (V | null)[] | ExprLike<V | null> | undefined): SqlCondition;\n /** Applies an IN condition unless the list is empty or undefined. */\n inNonEmpty(values: readonly (V | null)[] | undefined): SqlCondition;\n nin(values: readonly (V | null)[] | ExprLike<V | null> | undefined): SqlCondition;\n gt(value: V | ExprLike<V | N> | undefined): SqlCondition;\n gte(value: V | ExprLike<V | N> | undefined): SqlCondition;\n lt(value: V | ExprLike<V | N> | undefined): SqlCondition;\n lte(value: V | ExprLike<V | N> | undefined): SqlCondition;\n like(value: V | undefined): SqlCondition;\n ilike(value: V | undefined): SqlCondition;\n search(value: V | undefined): SqlCondition;\n between(v1: V | undefined, v2: V | undefined): SqlCondition;\n // need to move to ArrayColumn\n // ...added the `string` to support jsonb contains like `WHERE profile @> '{\"age\": 25}'`\n // Ideally this would go in a JsonbColumn\n contains(value: string | V | PrimitiveColumn<V, any> | N | undefined): SqlCondition;\n ncontains(value: string | V | PrimitiveColumn<V, any> | N | undefined): SqlCondition;\n overlaps(value: V | PrimitiveColumn<V, any> | N | undefined): SqlCondition;\n noverlaps(value: V | PrimitiveColumn<V, any> | N | undefined): SqlCondition;\n\n /**\n * Adds a JSON path existence condition, using the `@?` operator.\n *\n * Any values should be embedded directly within the `jsonPath`, because postgres does not\n * support parameterized JSON path expressions. The entire `jsonPath` is treated as a parameter,\n * so this is safe from SQL injection.\n */\n pathExists(jsonPath: string | undefined): SqlCondition;\n\n /**\n * Adds a JSON path predicate condition, using the `@@` operator.\n *\n * Any values should be embedded directly within the `jsonPath`, because postgres does not\n * support parameterized JSON path expressions. The entire `jsonPath` is treated as a parameter,\n * so this is safe from SQL injection.\n */\n pathIsTrue(jsonPath: string | undefined): SqlCondition;\n\n /**\n * Add `exp` to the query, which should include the operator & expression and any\n * bound parameters (but not include the column name).\n *\n * We use knex-style placeholders, i.e. `?` and `\\\\?` to escape question marks, i.e.\n *\n * ```ts\n * a.address.raw(\"@\\\\? ?\", ['$.street ? (@ == \"rr2\")'])`\n * ```\n */\n raw(exp: string, bindings: readonly any[] | undefined): SqlCondition;\n}\n\nexport interface EntityColumn<T, N extends null | never = never, Src extends string = string> extends Expr<\n IdOf<T> | N,\n Src\n> {\n eq(value: T | IdOf<T> | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition;\n ne(value: T | IdOf<T> | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition;\n // Adding `| null` for GraphQL support\n in(value: readonly (T | IdOf<T> | null)[] | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition;\n /** Applies an IN condition unless the list is empty, null, or undefined. */\n inNonEmpty(value: readonly (T | IdOf<T> | null)[] | null | undefined): SqlCondition;\n nin(value: readonly (T | IdOf<T> | null)[] | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition;\n gt(value: IdOf<T> | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition;\n gte(value: IdOf<T> | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition;\n lt(value: IdOf<T> | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition;\n lte(value: IdOf<T> | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition;\n raw(exp: string, bindings: readonly any[] | undefined): SqlCondition;\n}\n\nexport const tableMgmt = Symbol(\"tableMgmt\");\n\nexport function getTableMgmt(table: TableFor<unknown>): TableMgmt {\n return table[tableMgmt];\n}\n\n/** The identity SQL queries bind a table by, plus its original entity metadata. */\nexport interface TableMgmt {\n tableName: string;\n /**\n * The metadata this table was created with, i.e. `table(TaskNew)` keeps `taskNewMeta`.\n *\n * It cannot be re-derived from `tableName`: STI subtypes share their base's table (`Task`, `TaskNew`,\n * and `TaskOld` are all `tasks`), so a `getMetadataForTable(\"tasks\")` lookup can only return the base\n * `Task`, and the alias would lose its subtype identity for explicit subtype joins and entity hydration.\n */\n meta: EntityMetadata;\n}\n\n/** Returns the metadata for the entity that `table` is bound to. */\nexport function getTableMetadata<T extends Entity>(table: TableFor<T>): EntityMetadata<T> {\n const mgmt = table[tableMgmt];\n return mgmt.meta as EntityMetadata<T>;\n}\n\nexport function newTableProxy<T extends Entity>(cstr: MaybeAbstractEntityConstructor<T>): Table<T> {\n const meta = getMetadata(cstr);\n // The identity SQL queries bind to a source, retaining STI subtype metadata.\n const mgmt: TableMgmt = { tableName: meta.tableName, meta };\n const subtypes = new Map(meta.subTypes.map((m) => [m.type[0].toLowerCase() + m.type.slice(1), m]));\n const proxy: any = new Proxy(cstr, {\n /** Create a physical column expression or a relation join factory. */\n get(_, key: PropertyKey): any {\n if (key === tableMgmt) {\n return mgmt;\n }\n if (typeof key !== \"string\") return undefined;\n const descriptor = Object.hasOwn(meta.columns, key) ? meta.columns[key] : undefined;\n if (descriptor) {\n return descriptor.idMetadata && key !== \"id\"\n ? new EntityColumnImpl(meta, descriptor, mgmt)\n : new PrimitiveColumnImpl(meta, descriptor, mgmt);\n }\n const subtype = subtypes.get(key);\n if (subtype) {\n const join = new SubtypeJoinImpl(proxy, subtype);\n return Object.assign(join.as.bind(join), {\n as: join.as.bind(join),\n inner: join.inner.bind(join),\n left: join.left.bind(join),\n });\n }\n const relation = physicalRelation(meta, key);\n if (key === \"where\" && !isRelation(meta.allFields[key])) {\n return (filter: TableFilter<T>) => tableWhere(mgmt, filter);\n }\n const field = relation ?? fail(`No physical field ${key} on ${cstr.name}; join its base table explicitly`);\n switch (field.kind) {\n case \"m2o\":\n return new ReferenceJoinImpl(new EntityColumnImpl(meta, field.serde.columns[0].column, mgmt));\n case \"poly\":\n return new PolyReferenceImpl(meta, mgmt, field);\n case \"o2m\":\n case \"o2o\":\n case \"lo2m\":\n return new OneToManyJoinImpl(proxy, field);\n case \"m2m\":\n return new ManyToManyJoinImpl(proxy, field);\n default:\n throw new Error(`Unsupported table field kind ${field.kind}`);\n }\n },\n\n has(_, key) {\n return (\n key === tableMgmt ||\n (typeof key === \"string\" &&\n (key === \"where\" || Object.hasOwn(meta.columns, key) || !!physicalRelation(meta, key) || subtypes.has(key)))\n );\n },\n });\n return proxy;\n}\n\nexport function isTable(obj: unknown): obj is Table<any, any> {\n // Oddly enough `typeof` will be a function b/c we are proxying the constructors\n return typeof obj === \"function\" && tableMgmt in obj;\n}\n\n/**\n * A physical table column implements `Expr`: it renders as `alias.\"column\"`, decodes result\n * values through the column's shared scalar codec, and inherits aggregate methods from `BaseExpr`.\n */\nclass TableColumn extends BaseExpr {\n public constructor(\n readonly meta: EntityMetadata,\n readonly column: Column,\n readonly mgmt: TableMgmt,\n ) {\n super();\n }\n\n /** Author.id, Book.authorId, and Comment.parentAuthorId use the same Author ID domain. */\n get outputType(): TypeInfo | undefined {\n return this.column.outputType;\n }\n\n get sqlNullable(): boolean | undefined {\n return this.column.sqlNullable;\n }\n\n get sqlSource(): object {\n return this.mgmt;\n }\n\n toSql(ctx: ExprContext): SqlFragment {\n const alias = ctx.aliasFor(this.mgmt);\n return { sql: kqDot(alias, this.column.columnName), bindings: [], refs: [alias] };\n }\n\n /** Decodes result-set values with public PK/FK ids, while hydration keeps internal tagged ids. */\n decode(value: unknown): unknown {\n if (value === null || value === undefined) return value;\n const idMeta = this.idMetadata;\n if (idMeta) return toIdOf(idMeta, this.column.mapFromDb(value) as TaggedId | undefined);\n return this.column.mapFromDb(value);\n }\n\n encode(value: unknown): unknown {\n return this.column.mapToDb(value);\n }\n\n /** Identifies the ID domain of a primary key, FK, or physical polymorphic component. */\n get idMetadata(): EntityMetadata | undefined {\n return this.column.idMetadata?.();\n }\n\n /** Encodes literals when the condition is created and renders with each query's aliases. */\n addCondition(value: ParsedValueFilter<unknown>): SqlCondition {\n const encoded = mapToDb(this.column, value);\n return deferredCondition((ctx) => {\n const left = this.toSql(ctx);\n const [sql, bindings] = buildValueCondition(left.sql, encoded);\n return { sql, bindings: [...left.bindings, ...bindings], refs: left.refs };\n });\n }\n\n /** Renders raw operators against the same quoted column SQL as other expressions. */\n protected addRawCondition(exp: string, bindings: readonly any[]): SqlCondition {\n return deferredCondition((ctx) => {\n const left = this.toSql(ctx);\n return { sql: `${left.sql} ${exp}`, bindings: [...left.bindings, ...bindings], refs: left.refs };\n });\n }\n\n /** Uses column filter conversions for literals and shared comparisons for expressions and null equality. */\n protected compare(op: string, value: unknown): SqlCondition {\n if (value === undefined || isExpr(value) || (value === null && (op === \"=\" || op === \"!=\"))) {\n return super.compare(op, value);\n }\n // Primitive relational comparisons historically bind null through mapToDb.\n const kind = ({ \"=\": \"eq\", \"!=\": \"ne\", \">\": \"gt\", \">=\": \"gte\", \"<\": \"lt\", \"<=\": \"lte\" } as const)[op];\n if (!kind) return fail(`Invalid operator ${op}`);\n return this.addCondition({ kind, value });\n }\n\n /**\n * Compares this column to another expression.\n *\n * Table columns, aggregates, subquery columns, and `sql` templates use the expression context\n * to render their complete SQL.\n * Negated array operators wrap the complete comparison in NOT.\n */\n protected compareToExpr(op: string, value: ExprLike<any>, negate = false): SqlCondition {\n if (negate) {\n return deferredCondition((ctx) => {\n const comparison = ctx.conditionToSql(this.compareToExpr(op, value))!;\n return { ...comparison, sql: `NOT (${comparison.sql})` };\n });\n }\n return super.compare(op, value);\n }\n}\n\nclass PrimitiveColumnImpl<V, N extends null | never> extends TableColumn implements PrimitiveColumn<V, N> {\n between(v1: V | undefined, v2: V | undefined): SqlCondition {\n if (v1 === undefined || v2 === undefined) return skipCondition;\n return this.addCondition({ kind: \"between\", value: [v1, v2] });\n }\n\n like(value: V | undefined): SqlCondition {\n if (value === undefined) return skipCondition;\n return this.addCondition({ kind: \"like\", value });\n }\n\n ilike(value: V | undefined): SqlCondition {\n if (value === undefined) return skipCondition;\n return this.addCondition({ kind: \"ilike\", value });\n }\n\n search(value: V | undefined): SqlCondition {\n // Check !value so that empty strings are pruned\n if (!value) return skipCondition;\n return this.addCondition({ kind: \"ilike\", value: makeLike(value) });\n }\n\n in(values: readonly (V | null)[] | ExprLike<V | null> | undefined): SqlCondition {\n if (values === undefined) return skipCondition;\n if (isExpr(values)) return this.inList(\"IN\", values);\n if (values.includes(null)) {\n const isNull = this.addCondition({ kind: \"is-null\" });\n const hasValue = this.addCondition({ kind: \"in\", value: values.filter((v) => v !== null) });\n return { or: [isNull, hasValue] };\n } else {\n return this.addCondition({ kind: \"in\", value: values as V[] });\n }\n }\n\n /** Applies an IN condition unless the list is empty or undefined. */\n inNonEmpty(values: readonly (V | null)[] | undefined): SqlCondition {\n return values === undefined || values.length === 0 ? skipCondition : this.in(values);\n }\n\n nin(values: readonly (V | null)[] | ExprLike<V | null> | undefined): SqlCondition {\n if (values === undefined) return skipCondition;\n if (isExpr(values)) return this.inList(\"NOT IN\", values);\n return this.addCondition({ kind: \"nin\", value: values.filter((v) => v !== null) as V[] });\n }\n\n // V will already be an array\n contains(v1: string | V | PrimitiveColumn<V, any> | N | undefined): SqlCondition {\n if (v1 === undefined) return skipCondition;\n if (isExpr(v1)) return this.compareToExpr(\"@>\", v1);\n return this.addCondition({ kind: \"contains\", value: v1 as any });\n }\n\n // V will already be an array\n ncontains(v1: string | V | PrimitiveColumn<V, any> | N | undefined): SqlCondition {\n if (v1 === undefined) return skipCondition;\n if (isExpr(v1)) return this.compareToExpr(\"@>\", v1, true);\n return this.addCondition({ kind: \"ncontains\", value: v1 as any });\n }\n\n // V will already be an array\n overlaps(v1: V | PrimitiveColumn<V, any> | N | undefined): SqlCondition {\n if (v1 === undefined) return skipCondition;\n if (isExpr(v1)) return this.compareToExpr(\"&&\", v1);\n return this.addCondition({ kind: \"overlaps\", value: v1 as any });\n }\n\n noverlaps(v1: V | PrimitiveColumn<V, any> | N | undefined): SqlCondition {\n if (v1 === undefined) return skipCondition;\n if (isExpr(v1)) return this.compareToExpr(\"&&\", v1, true);\n return this.addCondition({ kind: \"noverlaps\", value: v1 as any });\n }\n\n pathExists(jsonPath: string | undefined): SqlCondition {\n if (jsonPath === undefined) return skipCondition;\n return this.addCondition({ kind: \"jsonPathExists\", value: jsonPath });\n }\n\n pathIsTrue(jsonPath: string | undefined): SqlCondition {\n if (jsonPath === undefined) return skipCondition;\n return this.addCondition({ kind: \"jsonPathPredicate\", value: jsonPath });\n }\n\n raw(exp: string, bindings: readonly any[] | undefined): SqlCondition {\n if (bindings === undefined) return skipCondition;\n return this.addRawCondition(exp, bindings);\n }\n}\n\nclass EntityColumnImpl<T> extends TableColumn implements EntityColumn<T> {\n in(values: readonly (T | IdOf<T> | null)[] | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition {\n if (values === undefined) {\n return skipCondition;\n } else if (values === null) {\n throw new Error(\"Unsupported\");\n } else if (isExpr(values)) {\n return this.inList(\"IN\", values);\n } else if (values.includes(null)) {\n // Like `PrimitiveColumn.in`, split `[a1, null]` into `IS NULL OR IN (...)`\n const isNull = this.addCondition({ kind: \"is-null\" });\n const hasValue = this.addCondition({ kind: \"in\", value: values.filter((v) => v !== null) as any });\n return { or: [isNull, hasValue] };\n } else {\n return this.addCondition({ kind: \"in\", value: values as any });\n }\n }\n\n /** Applies an IN condition unless the list is empty, null, or undefined. */\n inNonEmpty(values: readonly (T | IdOf<T> | null)[] | null | undefined): SqlCondition {\n return values === null || values === undefined || values.length === 0 ? skipCondition : this.in(values);\n }\n\n nin(values: readonly (T | IdOf<T> | null)[] | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition {\n if (values === undefined) {\n return skipCondition;\n } else if (values === null) {\n throw new Error(\"Unsupported\");\n } else if (isExpr(values)) {\n return this.inList(\"NOT IN\", values);\n } else {\n return this.addCondition({ kind: \"nin\", value: values.filter((v) => v !== null) as any });\n }\n }\n\n gt(value: IdOf<T> | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition {\n return this.compareId(\">\", \"gt\", value);\n }\n\n gte(value: IdOf<T> | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition {\n return this.compareId(\">=\", \"gte\", value);\n }\n\n lt(value: IdOf<T> | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition {\n return this.compareId(\"<\", \"lt\", value);\n }\n\n lte(value: IdOf<T> | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition {\n return this.compareId(\"<=\", \"lte\", value);\n }\n\n raw(exp: string, bindings: readonly any[] | undefined): SqlCondition {\n if (bindings === undefined) return skipCondition;\n return this.addRawCondition(exp, bindings);\n }\n\n /** Joins via this FK, inheriting the source's LEFT join for otherwise required references. */\n as(other: object): object {\n return {\n ...this.joinEntry(this.sqlNullable === false ? \"inner\" : \"left\", other),\n [referenceJoinSource]: this.mgmt,\n };\n }\n\n inner(other: object): object {\n return this.joinEntry(\"inner\", other);\n }\n\n left(other: object): object {\n return this.joinEntry(\"left\", other);\n }\n\n private joinEntry(kind: JoinKind, other: object): object {\n return { [kind]: requireTable(other), on: this.eq(idColumnOf(other)) };\n }\n\n private compareId(op: string, kind: \"gt\" | \"gte\" | \"lt\" | \"lte\", value: unknown): SqlCondition {\n if (value === undefined) return skipCondition;\n if (value === null) throw new Error(\"Unsupported\");\n if (isExpr(value)) return this.compareToExpr(op, value);\n return this.addCondition({ kind, value: value as any });\n }\n}\n\nclass PolyReferenceImpl<T extends Entity> {\n public constructor(\n private meta: EntityMetadata,\n private mgmt: TableMgmt,\n private field: PolymorphicField,\n ) {}\n\n /** Compares to a tagged id, an entity, or another table's id column, which picks the component (`c.parent.eq(a.id)`). */\n eq(value: T | TaggedId | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition {\n return this.addEqOrNe(\"eq\", value);\n }\n\n ne(value: T | TaggedId | ExprLike<IdOf<T> | null> | null | undefined): SqlCondition {\n return this.addEqOrNe(\"ne\", value);\n }\n\n // We required tagged ids for polys\n in(values: readonly (T | TaggedId)[] | ExprLike<IdOf<T> | null> | undefined): SqlCondition {\n if (values === undefined) return skipCondition;\n if (isExpr(values)) return this.inSubquery(values);\n // Split up the ids by constructor\n const idsByConstructor = groupBy(values, (id) => getConstructorFromTaggedId(maybeResolveReferenceToId(id)!).name);\n // Or together `parent_book_id in (1,2,3) OR parent_author_id IN (4,5,6)`\n return {\n or: Object.entries(idsByConstructor).map(([cstrName, ids]) => {\n const comp =\n this.field.components.find((p) => p.otherMetadata().cstr.name === cstrName) ??\n fail(`No component for ${cstrName}`);\n return this.componentColumn(comp).addCondition({ kind: \"in\", value: ids });\n }),\n };\n }\n\n /** Applies an IN condition unless the list is empty or undefined. */\n inNonEmpty(values: readonly (T | TaggedId)[] | undefined): SqlCondition {\n return values === undefined || values.length === 0 ? skipCondition : this.in(values);\n }\n\n /** Joins via this poly's component, inheriting the source's LEFT join when the poly is required. */\n as(other: object): object {\n return { ...this.joinEntry(this.field.required ? \"inner\" : \"left\", other), [referenceJoinSource]: this.mgmt };\n }\n\n inner(other: object): object {\n return this.joinEntry(\"inner\", other);\n }\n\n left(other: object): object {\n return this.joinEntry(\"left\", other);\n }\n\n private joinEntry(kind: JoinKind, other: object): object {\n return { [kind]: requireTable(other), on: this.eq(idColumnOf(other) as any) };\n }\n\n /**\n * i.e. `c.parent.in(query({ from: a, ..., select: a.id }))`: like `eq` against a table column, the\n * subquery's agreed ID domain picks the component, i.e. authors pick `parent_author_id`.\n */\n private inSubquery(values: ExprLike<any>): SqlCondition {\n // Only actual subqueries expose this getter; importing query.ts would create a load-order cycle.\n const selected = asNode(values).subquerySelect;\n const outputType = selected?.outputType;\n let otherMeta = outputType?.idMeta;\n if (!otherMeta) {\n // Ordinary reads can select an unknown key serde. Compounds validate codecs before exposing a select.\n if (!outputType && selected instanceof TableColumn) {\n otherMeta = selected.idMetadata;\n }\n if (!otherMeta) {\n return fail(\n selected instanceof TableColumn\n ? `${this.field.fieldName} \\`in\\` needs an id or FK column, got ${selected.column.columnName}`\n : `${this.field.fieldName} is polymorphic, so \\`in\\` needs a subquery selecting an id or FK column`,\n );\n }\n }\n const comp =\n this.field.components.find((p) => getBaseAndSelfMetas(otherMeta).includes(p.otherMetadata())) ??\n fail(`${this.field.fieldName} has no component for ${otherMeta.type}`);\n return this.componentColumn(comp).in(values);\n }\n\n private addEqOrNe(\n kind: \"eq\" | \"ne\",\n value: T | TaggedId | ExprLike<IdOf<T> | null> | null | undefined,\n ): SqlCondition {\n if (value === undefined) {\n return skipCondition;\n } else if (value instanceof TableColumn) {\n // Joining through the poly, i.e. `c.parent.eq(a.id)`: the other table column's ID domain picks the component\n const otherMeta = value.idMetadata ?? fail(`${this.field.fieldName} needs an id or FK column`);\n const comp =\n this.field.components.find((p) => getBaseAndSelfMetas(otherMeta).includes(p.otherMetadata())) ??\n fail(`${this.field.fieldName} has no component for ${otherMeta.type}`);\n return this.componentColumn(comp)[kind](value);\n } else if (isExpr(value)) {\n return fail(\n `${this.field.fieldName} is polymorphic, so it can only be compared to tagged ids or entity table columns`,\n );\n } else if (value === null) {\n // We can AND each of the components as many conditions\n const value = kind === \"eq\" ? ({ kind: \"is-null\" } as const) : ({ kind: \"not-null\" } as const);\n return {\n and: this.field.components.map((p) => this.componentColumn(p).addCondition(value)),\n };\n } else {\n // If we have a value, we can find the component\n const comp =\n this.field.components.find(\n (p) => p.otherMetadata().cstr === getConstructorFromTaggedId(maybeResolveReferenceToId(value) as string),\n ) || fail(`Could not find component for ${value}`);\n return this.componentColumn(comp)[kind](value);\n }\n }\n\n /** Returns the physical FK expression for one polymorphic target. */\n private componentColumn(comp: PolymorphicFieldComponent): EntityColumnImpl<T> {\n const descriptor = comp.column;\n return new EntityColumnImpl<T>(this.meta, descriptor, this.mgmt);\n }\n}\n\n/**\n * Marks a sugar join entry whose target is a *collection* (o2m/m2m), which filter soft-deletes like\n * em.find's \"collections filter out soft-deletes, but m2o/o2o references still return them\"; see\n * `QueryParser.addSoftDeleteCondition`'s call site. Reference joins and explicit joins are unmarked.\n */\nexport const collectionJoin: unique symbol = Symbol(\"joist.collectionJoin\");\n\n/** Marks a sugar m2m join entry (`a.tags.as(t)`) with its hidden join-table join; `parseQuery` expands it. */\nexport const m2mJoinTable: unique symbol = Symbol(\"joist.m2mJoinTable\");\n\nexport interface M2mJoinTable {\n handle: JoinTableHandle;\n on: SqlCondition;\n}\n\n/** The runtime identity of an m2m join table in a query, i.e. `authors_to_tags`; it has no entity. */\nexport class JoinTableHandle {\n constructor(readonly joinTableName: string) {}\n}\n\ntype JoinKind = \"inner\" | \"left\";\n\n/**\n * The `as`/`inner`/`left` join factory for collection relations, i.e. `a.books.as(b)` joins with the\n * relation's default kind (LEFT: a collection may be empty) and `.inner`/`.left` override. m2o/poly\n * relations implement the same three methods on their join factories. Physical FKs such as\n * `b.author_id` are expressions that also expose a join factory.\n */\nabstract class CollectionJoinImpl {\n as(other: object): object {\n return this.joinEntry(\"left\", requireTable(other));\n }\n\n inner(other: object): object {\n return this.joinEntry(\"inner\", requireTable(other));\n }\n\n left(other: object): object {\n return this.joinEntry(\"left\", requireTable(other));\n }\n\n protected abstract joinEntry(kind: JoinKind, other: TableFor<Entity>): object;\n}\n\n/** Joins a named subtype explicitly; only STI subtype sugar adds a discriminator to its ON. */\nclass SubtypeJoinImpl extends CollectionJoinImpl {\n constructor(\n private proxy: TableFor<Entity>,\n private subtype: EntityMetadata,\n ) {\n super();\n }\n\n protected joinEntry(kind: JoinKind, other: TableFor<Entity>): object {\n if (getTableMetadata(other) !== this.subtype) {\n return fail(`Expected table(${this.subtype.type}) for the explicit subtype join`);\n }\n const on = idColumnOf(this.proxy).eq(idColumnOf(other));\n if (this.subtype.inheritanceType !== \"sti\" || this.subtype.stiDiscriminatorValue === undefined) {\n return { [kind]: other, on };\n }\n const base = this.subtype.baseTypes.find((m) => m.stiDiscriminatorField !== undefined)!;\n const columnName = base.fields[base.stiDiscriminatorField!].serde!.columns[0].columnName;\n // Discriminator values are database enum ids, not domain enum values to pass through the field codec.\n const discriminator = deferredCondition((ctx) => {\n const alias = ctx.aliasFor(other[tableMgmt]);\n return {\n sql: `${kqDot(alias, columnName)} = ?`,\n bindings: [this.subtype.stiDiscriminatorValue],\n refs: [alias],\n };\n });\n return { [kind]: other, on: { and: [on, discriminator] } };\n }\n}\n\n/** An o2m/lo2m/o2o relation: the ON is the other side's FK (an m2o or a poly component) back to our id. */\nclass OneToManyJoinImpl extends CollectionJoinImpl {\n constructor(\n private proxy: any,\n private field: OneToManyField | LargeOneToManyField | OneToOneField,\n ) {\n super();\n }\n\n protected joinEntry(kind: JoinKind, other: TableFor<Entity>): object {\n const { field } = this;\n const otherMeta = getTableMetadata(other);\n const descriptor = Object.values(otherMeta.columns).find((column) => column.columnName === field.otherColumnName);\n if (!descriptor) {\n return fail(\n `Cannot join ${getTableMetadata(this.proxy).type}.${field.fieldName} to ${otherMeta.type}: ` +\n `${field.otherColumnName} is not physically present on ${otherMeta.tableName}; join the base table explicitly`,\n );\n }\n const column = new EntityColumnImpl(otherMeta, descriptor, other[tableMgmt]);\n const on = column.eq(this.proxy.id);\n // Collections (o2m/lo2m) filter soft-deletes like em.find; o2o references resolve them\n const filtered = field.kind === \"o2m\" ? field.softDeletes !== \"include\" : field.kind === \"lo2m\";\n return { [kind]: other, on, [collectionJoin]: filtered };\n }\n}\n\n/**\n * An m2m relation, i.e. `a.tags.as(t)`.\n *\n * The entry's own ON is `t.id = att.tag_id`, and the hidden `[m2mJoinTable]` half is\n * `att.author_id = a.id`; only the target's ON references the join table, so reference pruning keeps\n * or drops the pair together. Both are deferred conditions: the join table has no entity metadata, so\n * its alias only exists once the parser registers it.\n */\nclass ManyToManyJoinImpl extends CollectionJoinImpl {\n constructor(\n private proxy: any,\n private field: ManyToManyField,\n ) {\n super();\n }\n\n protected joinEntry(kind: JoinKind, other: TableFor<Entity>): object {\n const { joinTableName, columnNames } = this.field;\n const [ourColumn, otherColumn] = columnNames;\n const jt = new JoinTableHandle(joinTableName);\n const ourId = idColumnOf(this.proxy);\n const otherId = idColumnOf(other);\n const jtOn = deferredCondition((ctx) => {\n const jtAlias = ctx.aliasFor(jt);\n const id = ourId.toSql(ctx);\n return { sql: `${kqDot(jtAlias, ourColumn)} = ${id.sql}`, bindings: id.bindings, refs: id.refs };\n });\n const on = deferredCondition((ctx) => {\n const jtAlias = ctx.aliasFor(jt);\n const id = otherId.toSql(ctx);\n return { sql: `${id.sql} = ${kqDot(jtAlias, otherColumn)}`, bindings: id.bindings, refs: [...id.refs, jtAlias] };\n });\n const filtered = this.field.softDeletes !== \"include\";\n return {\n [kind]: other,\n on,\n [collectionJoin]: filtered,\n [m2mJoinTable]: { handle: jt, on: jtOn } satisfies M2mJoinTable,\n };\n }\n}\n\n/** Fails fast when a join factory is passed something other than a table. */\nfunction requireTable(other: object): TableFor<Entity> {\n if (!isTable(other)) return fail(`Expected a table to join, got ${other}`);\n return other;\n}\n\n/** The id column of a joined table, for building sugar ON conditions. */\nfunction idColumnOf(other: object): TableColumn {\n return (other as any).id;\n}\n\n/** Keeps relation names join-only; physical FK columns retain expression methods. */\nclass ReferenceJoinImpl {\n constructor(private column: EntityColumnImpl<unknown>) {}\n\n as(other: object): object {\n return this.column.as(other);\n }\n\n inner(other: object): object {\n return this.column.inner(other);\n }\n\n left(other: object): object {\n return this.column.left(other);\n }\n}\n\n/** Identifies domain relationship keys exposed alongside physical columns. */\nfunction isRelation(field: Field | undefined): boolean {\n return field !== undefined && [\"m2o\", \"poly\", \"o2m\", \"lo2m\", \"m2m\", \"o2o\"].includes(field.kind);\n}\n\n/** Resolves relationship sugar only from domain fields owned by this physical table. */\nfunction physicalRelation(meta: EntityMetadata, key: string): Field | undefined {\n const owners = [meta, ...getBaseSelfAndSubMetas(getBaseMeta(meta))];\n const owner = owners.find((owner) => owner.tableName === meta.tableName && Object.hasOwn(owner.fields, key));\n const field = owner?.fields[key];\n if (!isRelation(field)) return undefined;\n // I.e. TaskNew.copiedFrom uses Task's original FK domain, not its specialized TaskNew target.\n if (field?.kind === \"m2o\" || field?.kind === \"poly\") {\n if (!field.serde.columns.every((binding) => Object.values(meta.columns).includes(binding.column))) return undefined;\n return field.kind === \"poly\"\n ? {\n ...field,\n components: field.components.map((component) => ({\n column: component.column,\n columnName: component.columnName,\n otherFieldName: component.otherFieldName,\n otherMetadata: component.column.idMetadata!,\n })),\n }\n : field;\n }\n return field;\n}\n\n/**\n * Maps local domain fields to table-bound conditions, encoding each leaf once.\n * I.e. Author.firstName uses the first_name column but resolves its alias in each query scope.\n * Collections, polymorphic references, and inherited nonlocal fields require explicit expressions.\n */\nfunction tableWhere(mgmt: TableMgmt, filter: object): SqlCondition {\n const { meta } = mgmt;\n const conditions: SqlCondition[] = [];\n if (!filter || typeof filter !== \"object\" || Array.isArray(filter)) {\n throw new Error(`Expected a domain field filter for ${meta.type}`);\n }\n for (const [key, value] of Object.entries(filter)) {\n // CTI allFields.id points at the base key; the subtype has its own physical key.\n const field = key === \"id\" ? meta.fields.id : Object.hasOwn(meta.allFields, key) ? meta.allFields[key] : undefined;\n if (\n !field ||\n ![\"primaryKey\", \"primitive\", \"enum\", \"m2o\"].includes(field.kind) ||\n !field.serde ||\n field.serde.columns.length !== 1 ||\n !field.serde.columns.every((binding) => Object.values(meta.columns).includes(binding.column))\n ) {\n throw new Error(`Unsupported table filter field ${meta.type}.${key}; use an explicit join`);\n }\n const column = new TableColumn(meta, field.serde.columns[0].column, mgmt);\n let leaves: ParsedValueFilter<unknown>[];\n if (field.kind === \"m2o\") {\n if (!isTableReferenceFilter(value)) {\n throw new Error(`Unsupported table reference filter ${meta.type}.${key}; use an entity or ID`);\n }\n const parsed = parseEntityFilter(field.otherMetadata(), value);\n if (parsed?.kind === \"join\") {\n throw new Error(`Unsupported table reference filter ${meta.type}.${key}; use an entity or ID`);\n }\n leaves = parsed ? [parsed] : [];\n } else {\n leaves = parseValueFilter(value);\n }\n for (const leaf of leaves) {\n if (leaf.kind === \"between\" && leaf.value.some((v) => v === undefined)) {\n if (leaf.value[0] !== undefined) conditions.push(column.addCondition({ kind: \"gte\", value: leaf.value[0] }));\n if (leaf.value[1] !== undefined) conditions.push(column.addCondition({ kind: \"lte\", value: leaf.value[1] }));\n } else if (leaf.kind === \"in\" && !column.column.isArray && leaf.value.includes(null)) {\n conditions.push({\n or: [\n column.addCondition({ kind: \"is-null\" }),\n column.addCondition({ kind: \"in\", value: leaf.value.filter((v) => v !== null) }),\n ],\n });\n } else {\n conditions.push(column.addCondition(leaf));\n }\n }\n }\n return conditions.length === 0 ? skipCondition : { and: conditions };\n}\n\n/** Rejects nested relations, scopes, and aliases before parsing owning-reference values. */\nfunction isTableReferenceFilter(value: unknown): boolean {\n if (value == null || typeof value === \"boolean\" || isTableReferenceValue(value)) return true;\n if (Array.isArray(value)) return value.every(isTableReferenceValue);\n if (typeof value === \"object\" && Object.keys(value).length === 1 && Object.hasOwn(value, \"ne\")) {\n const excluded = (value as { ne: unknown }).ne;\n return excluded == null || isTableReferenceValue(excluded);\n }\n return false;\n}\n\n/** Recognizes an entity or public ID without accepting another filter object. */\nfunction isTableReferenceValue(value: unknown): boolean {\n return typeof value === \"string\" || typeof value === \"number\" || isEntity(value);\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAyDA,SAAgB,MAAwB,MAAyC,OAAyB;CAExG,OAAO,cAAc,IAAI;AAC3B;;AAGA,SAAgB,OACd,GAAG,MACyG;CAC5G,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC,CAAC;AACzC;;AAyHA,MAAa,sBAAqC,OAAO,2BAA2B;AAgIpF,MAAa,YAAY,OAAO,WAAW;AAE3C,SAAgB,aAAa,OAAqC;CAChE,OAAO,MAAM;AACf;;AAgBA,SAAgB,iBAAmC,OAAuC;CAExF,OADa,MAAM,UACR,CAAC;AACd;AAEA,SAAgB,cAAgC,MAAmD;CACjG,MAAM,OAAO,YAAY,IAAI;CAE7B,MAAM,OAAkB;EAAE,WAAW,KAAK;EAAW;CAAK;CAC1D,MAAM,WAAW,IAAI,IAAI,KAAK,SAAS,KAAK,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,YAAY,IAAI,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;CACjG,MAAM,QAAa,IAAI,MAAM,MAAM;;EAEjC,IAAI,GAAG,KAAuB;GAC5B,IAAI,QAAQ,WACV,OAAO;GAET,IAAI,OAAO,QAAQ,UAAU,OAAO,KAAA;GACpC,MAAM,aAAa,OAAO,OAAO,KAAK,SAAS,GAAG,IAAI,KAAK,QAAQ,OAAO,KAAA;GAC1E,IAAI,YACF,OAAO,WAAW,cAAc,QAAQ,OACpC,IAAI,iBAAiB,MAAM,YAAY,IAAI,IAC3C,IAAI,oBAAoB,MAAM,YAAY,IAAI;GAEpD,MAAM,UAAU,SAAS,IAAI,GAAG;GAChC,IAAI,SAAS;IACX,MAAM,OAAO,IAAI,gBAAgB,OAAO,OAAO;IAC/C,OAAO,OAAO,OAAO,KAAK,GAAG,KAAK,IAAI,GAAG;KACvC,IAAI,KAAK,GAAG,KAAK,IAAI;KACrB,OAAO,KAAK,MAAM,KAAK,IAAI;KAC3B,MAAM,KAAK,KAAK,KAAK,IAAI;IAC3B,CAAC;GACH;GACA,MAAM,WAAW,iBAAiB,MAAM,GAAG;GAC3C,IAAI,QAAQ,WAAW,CAAC,WAAW,KAAK,UAAU,IAAI,GACpD,QAAQ,WAA2B,WAAW,MAAM,MAAM;GAE5D,MAAM,QAAQ,YAAY,KAAK,qBAAqB,IAAI,MAAM,KAAK,KAAK,iCAAiC;GACzG,QAAQ,MAAM,MAAd;IACE,KAAK,OACH,OAAO,IAAI,kBAAkB,IAAI,iBAAiB,MAAM,MAAM,MAAM,QAAQ,EAAE,CAAC,QAAQ,IAAI,CAAC;IAC9F,KAAK,QACH,OAAO,IAAI,kBAAkB,MAAM,MAAM,KAAK;IAChD,KAAK;IACL,KAAK;IACL,KAAK,QACH,OAAO,IAAI,kBAAkB,OAAO,KAAK;IAC3C,KAAK,OACH,OAAO,IAAI,mBAAmB,OAAO,KAAK;IAC5C,SACE,MAAM,IAAI,MAAM,gCAAgC,MAAM,MAAM;GAChE;EACF;EAEA,IAAI,GAAG,KAAK;GACV,OACE,QAAQ,aACP,OAAO,QAAQ,aACb,QAAQ,WAAW,OAAO,OAAO,KAAK,SAAS,GAAG,KAAK,CAAC,CAAC,iBAAiB,MAAM,GAAG,KAAK,SAAS,IAAI,GAAG;EAE/G;CACF,CAAC;CACD,OAAO;AACT;AAEA,SAAgB,QAAQ,KAAsC;CAE5D,OAAO,OAAO,QAAQ,cAAc,aAAa;AACnD;;;;;AAMA,IAAM,cAAN,cAA0B,SAAS;CAEtB;CACA;CACA;CAHX,YACE,MACA,QACA,MACA;EACA,MAAM;EAJG,KAAA,OAAA;EACA,KAAA,SAAA;EACA,KAAA,OAAA;CAGX;;CAGA,IAAI,aAAmC;EACrC,OAAO,KAAK,OAAO;CACrB;CAEA,IAAI,cAAmC;EACrC,OAAO,KAAK,OAAO;CACrB;CAEA,IAAI,YAAoB;EACtB,OAAO,KAAK;CACd;CAEA,MAAM,KAA+B;EACnC,MAAM,QAAQ,IAAI,SAAS,KAAK,IAAI;EACpC,OAAO;GAAE,KAAK,MAAM,OAAO,KAAK,OAAO,UAAU;GAAG,UAAU,CAAC;GAAG,MAAM,CAAC,KAAK;EAAE;CAClF;;CAGA,OAAO,OAAyB;EAC9B,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAW,OAAO;EAClD,MAAM,SAAS,KAAK;EACpB,IAAI,QAAQ,OAAO,OAAO,QAAQ,KAAK,OAAO,UAAU,KAAK,CAAyB;EACtF,OAAO,KAAK,OAAO,UAAU,KAAK;CACpC;CAEA,OAAO,OAAyB;EAC9B,OAAO,KAAK,OAAO,QAAQ,KAAK;CAClC;;CAGA,IAAI,aAAyC;EAC3C,OAAO,KAAK,OAAO,aAAa;CAClC;;CAGA,aAAa,OAAiD;EAC5D,MAAM,UAAU,QAAQ,KAAK,QAAQ,KAAK;EAC1C,OAAO,mBAAmB,QAAQ;GAChC,MAAM,OAAO,KAAK,MAAM,GAAG;GAC3B,MAAM,CAAC,KAAK,YAAY,oBAAoB,KAAK,KAAK,OAAO;GAC7D,OAAO;IAAE;IAAK,UAAU,CAAC,GAAG,KAAK,UAAU,GAAG,QAAQ;IAAG,MAAM,KAAK;GAAK;EAC3E,CAAC;CACH;;CAGA,gBAA0B,KAAa,UAAwC;EAC7E,OAAO,mBAAmB,QAAQ;GAChC,MAAM,OAAO,KAAK,MAAM,GAAG;GAC3B,OAAO;IAAE,KAAK,GAAG,KAAK,IAAI,GAAG;IAAO,UAAU,CAAC,GAAG,KAAK,UAAU,GAAG,QAAQ;IAAG,MAAM,KAAK;GAAK;EACjG,CAAC;CACH;;CAGA,QAAkB,IAAY,OAA8B;EAC1D,IAAI,UAAU,KAAA,KAAa,OAAO,KAAK,KAAM,UAAU,SAAS,OAAO,OAAO,OAAO,OACnF,OAAO,MAAM,QAAQ,IAAI,KAAK;EAGhC,MAAM,OAAQ;GAAE,KAAK;GAAM,MAAM;GAAM,KAAK;GAAM,MAAM;GAAO,KAAK;GAAM,MAAM;EAAM,EAAY;EAClG,IAAI,CAAC,MAAM,OAAO,KAAK,oBAAoB,IAAI;EAC/C,OAAO,KAAK,aAAa;GAAE;GAAM;EAAM,CAAC;CAC1C;;;;;;;;CASA,cAAwB,IAAY,OAAsB,SAAS,OAAqB;EACtF,IAAI,QACF,OAAO,mBAAmB,QAAQ;GAChC,MAAM,aAAa,IAAI,eAAe,KAAK,cAAc,IAAI,KAAK,CAAC;GACnE,OAAO;IAAE,GAAG;IAAY,KAAK,QAAQ,WAAW,IAAI;GAAG;EACzD,CAAC;EAEH,OAAO,MAAM,QAAQ,IAAI,KAAK;CAChC;AACF;AAEA,IAAM,sBAAN,cAA6D,YAA6C;CACxG,QAAQ,IAAmB,IAAiC;EAC1D,IAAI,OAAO,KAAA,KAAa,OAAO,KAAA,GAAW,OAAO;EACjD,OAAO,KAAK,aAAa;GAAE,MAAM;GAAW,OAAO,CAAC,IAAI,EAAE;EAAE,CAAC;CAC/D;CAEA,KAAK,OAAoC;EACvC,IAAI,UAAU,KAAA,GAAW,OAAO;EAChC,OAAO,KAAK,aAAa;GAAE,MAAM;GAAQ;EAAM,CAAC;CAClD;CAEA,MAAM,OAAoC;EACxC,IAAI,UAAU,KAAA,GAAW,OAAO;EAChC,OAAO,KAAK,aAAa;GAAE,MAAM;GAAS;EAAM,CAAC;CACnD;CAEA,OAAO,OAAoC;EAEzC,IAAI,CAAC,OAAO,OAAO;EACnB,OAAO,KAAK,aAAa;GAAE,MAAM;GAAS,OAAO,SAAS,KAAK;EAAE,CAAC;CACpE;CAEA,GAAG,QAA8E;EAC/E,IAAI,WAAW,KAAA,GAAW,OAAO;EACjC,IAAI,OAAO,MAAM,GAAG,OAAO,KAAK,OAAO,MAAM,MAAM;EACnD,IAAI,OAAO,SAAS,IAAI,GAGtB,OAAO,EAAE,IAAI,CAFE,KAAK,aAAa,EAAE,MAAM,UAAU,CAEhC,GADF,KAAK,aAAa;GAAE,MAAM;GAAM,OAAO,OAAO,QAAQ,MAAM,MAAM,IAAI;EAAE,CAC5D,CAAC,EAAE;OAEhC,OAAO,KAAK,aAAa;GAAE,MAAM;GAAM,OAAO;EAAc,CAAC;CAEjE;;CAGA,WAAW,QAAyD;EAClE,OAAO,WAAW,KAAA,KAAa,OAAO,WAAW,IAAI,gBAAgB,KAAK,GAAG,MAAM;CACrF;CAEA,IAAI,QAA8E;EAChF,IAAI,WAAW,KAAA,GAAW,OAAO;EACjC,IAAI,OAAO,MAAM,GAAG,OAAO,KAAK,OAAO,UAAU,MAAM;EACvD,OAAO,KAAK,aAAa;GAAE,MAAM;GAAO,OAAO,OAAO,QAAQ,MAAM,MAAM,IAAI;EAAS,CAAC;CAC1F;CAGA,SAAS,IAAwE;EAC/E,IAAI,OAAO,KAAA,GAAW,OAAO;EAC7B,IAAI,OAAO,EAAE,GAAG,OAAO,KAAK,cAAc,MAAM,EAAE;EAClD,OAAO,KAAK,aAAa;GAAE,MAAM;GAAY,OAAO;EAAU,CAAC;CACjE;CAGA,UAAU,IAAwE;EAChF,IAAI,OAAO,KAAA,GAAW,OAAO;EAC7B,IAAI,OAAO,EAAE,GAAG,OAAO,KAAK,cAAc,MAAM,IAAI,IAAI;EACxD,OAAO,KAAK,aAAa;GAAE,MAAM;GAAa,OAAO;EAAU,CAAC;CAClE;CAGA,SAAS,IAA+D;EACtE,IAAI,OAAO,KAAA,GAAW,OAAO;EAC7B,IAAI,OAAO,EAAE,GAAG,OAAO,KAAK,cAAc,MAAM,EAAE;EAClD,OAAO,KAAK,aAAa;GAAE,MAAM;GAAY,OAAO;EAAU,CAAC;CACjE;CAEA,UAAU,IAA+D;EACvE,IAAI,OAAO,KAAA,GAAW,OAAO;EAC7B,IAAI,OAAO,EAAE,GAAG,OAAO,KAAK,cAAc,MAAM,IAAI,IAAI;EACxD,OAAO,KAAK,aAAa;GAAE,MAAM;GAAa,OAAO;EAAU,CAAC;CAClE;CAEA,WAAW,UAA4C;EACrD,IAAI,aAAa,KAAA,GAAW,OAAO;EACnC,OAAO,KAAK,aAAa;GAAE,MAAM;GAAkB,OAAO;EAAS,CAAC;CACtE;CAEA,WAAW,UAA4C;EACrD,IAAI,aAAa,KAAA,GAAW,OAAO;EACnC,OAAO,KAAK,aAAa;GAAE,MAAM;GAAqB,OAAO;EAAS,CAAC;CACzE;CAEA,IAAI,KAAa,UAAoD;EACnE,IAAI,aAAa,KAAA,GAAW,OAAO;EACnC,OAAO,KAAK,gBAAgB,KAAK,QAAQ;CAC3C;AACF;AAEA,IAAM,mBAAN,cAAkC,YAAuC;CACvE,GAAG,QAAqG;EACtG,IAAI,WAAW,KAAA,GACb,OAAO;OACF,IAAI,WAAW,MACpB,MAAM,IAAI,MAAM,aAAa;OACxB,IAAI,OAAO,MAAM,GACtB,OAAO,KAAK,OAAO,MAAM,MAAM;OAC1B,IAAI,OAAO,SAAS,IAAI,GAI7B,OAAO,EAAE,IAAI,CAFE,KAAK,aAAa,EAAE,MAAM,UAAU,CAEhC,GADF,KAAK,aAAa;GAAE,MAAM;GAAM,OAAO,OAAO,QAAQ,MAAM,MAAM,IAAI;EAAS,CACnE,CAAC,EAAE;OAEhC,OAAO,KAAK,aAAa;GAAE,MAAM;GAAM,OAAO;EAAc,CAAC;CAEjE;;CAGA,WAAW,QAA0E;EACnF,OAAO,WAAW,QAAQ,WAAW,KAAA,KAAa,OAAO,WAAW,IAAI,gBAAgB,KAAK,GAAG,MAAM;CACxG;CAEA,IAAI,QAAqG;EACvG,IAAI,WAAW,KAAA,GACb,OAAO;OACF,IAAI,WAAW,MACpB,MAAM,IAAI,MAAM,aAAa;OACxB,IAAI,OAAO,MAAM,GACtB,OAAO,KAAK,OAAO,UAAU,MAAM;OAEnC,OAAO,KAAK,aAAa;GAAE,MAAM;GAAO,OAAO,OAAO,QAAQ,MAAM,MAAM,IAAI;EAAS,CAAC;CAE5F;CAEA,GAAG,OAA4E;EAC7E,OAAO,KAAK,UAAU,KAAK,MAAM,KAAK;CACxC;CAEA,IAAI,OAA4E;EAC9E,OAAO,KAAK,UAAU,MAAM,OAAO,KAAK;CAC1C;CAEA,GAAG,OAA4E;EAC7E,OAAO,KAAK,UAAU,KAAK,MAAM,KAAK;CACxC;CAEA,IAAI,OAA4E;EAC9E,OAAO,KAAK,UAAU,MAAM,OAAO,KAAK;CAC1C;CAEA,IAAI,KAAa,UAAoD;EACnE,IAAI,aAAa,KAAA,GAAW,OAAO;EACnC,OAAO,KAAK,gBAAgB,KAAK,QAAQ;CAC3C;;CAGA,GAAG,OAAuB;EACxB,OAAO;GACL,GAAG,KAAK,UAAU,KAAK,gBAAgB,QAAQ,UAAU,QAAQ,KAAK;IACrE,sBAAsB,KAAK;EAC9B;CACF;CAEA,MAAM,OAAuB;EAC3B,OAAO,KAAK,UAAU,SAAS,KAAK;CACtC;CAEA,KAAK,OAAuB;EAC1B,OAAO,KAAK,UAAU,QAAQ,KAAK;CACrC;CAEA,UAAkB,MAAgB,OAAuB;EACvD,OAAO;IAAG,OAAO,aAAa,KAAK;GAAG,IAAI,KAAK,GAAG,WAAW,KAAK,CAAC;EAAE;CACvE;CAEA,UAAkB,IAAY,MAAmC,OAA8B;EAC7F,IAAI,UAAU,KAAA,GAAW,OAAO;EAChC,IAAI,UAAU,MAAM,MAAM,IAAI,MAAM,aAAa;EACjD,IAAI,OAAO,KAAK,GAAG,OAAO,KAAK,cAAc,IAAI,KAAK;EACtD,OAAO,KAAK,aAAa;GAAE;GAAa;EAAa,CAAC;CACxD;AACF;AAEA,IAAM,oBAAN,MAA0C;CAE9B;CACA;CACA;CAHV,YACE,MACA,MACA,OACA;EAHQ,KAAA,OAAA;EACA,KAAA,OAAA;EACA,KAAA,QAAA;CACP;;CAGH,GAAG,OAAiF;EAClF,OAAO,KAAK,UAAU,MAAM,KAAK;CACnC;CAEA,GAAG,OAAiF;EAClF,OAAO,KAAK,UAAU,MAAM,KAAK;CACnC;CAGA,GAAG,QAAwF;EACzF,IAAI,WAAW,KAAA,GAAW,OAAO;EACjC,IAAI,OAAO,MAAM,GAAG,OAAO,KAAK,WAAW,MAAM;EAEjD,MAAM,mBAAmB,QAAQ,SAAS,OAAO,2BAA2B,0BAA0B,EAAE,CAAE,CAAC,CAAC,IAAI;EAEhH,OAAO,EACL,IAAI,OAAO,QAAQ,gBAAgB,CAAC,CAAC,KAAK,CAAC,UAAU,SAAS;GAC5D,MAAM,OACJ,KAAK,MAAM,WAAW,MAAM,MAAM,EAAE,cAAc,CAAC,CAAC,KAAK,SAAS,QAAQ,KAC1E,KAAK,oBAAoB,UAAU;GACrC,OAAO,KAAK,gBAAgB,IAAI,CAAC,CAAC,aAAa;IAAE,MAAM;IAAM,OAAO;GAAI,CAAC;EAC3E,CAAC,EACH;CACF;;CAGA,WAAW,QAA6D;EACtE,OAAO,WAAW,KAAA,KAAa,OAAO,WAAW,IAAI,gBAAgB,KAAK,GAAG,MAAM;CACrF;;CAGA,GAAG,OAAuB;EACxB,OAAO;GAAE,GAAG,KAAK,UAAU,KAAK,MAAM,WAAW,UAAU,QAAQ,KAAK;IAAI,sBAAsB,KAAK;EAAK;CAC9G;CAEA,MAAM,OAAuB;EAC3B,OAAO,KAAK,UAAU,SAAS,KAAK;CACtC;CAEA,KAAK,OAAuB;EAC1B,OAAO,KAAK,UAAU,QAAQ,KAAK;CACrC;CAEA,UAAkB,MAAgB,OAAuB;EACvD,OAAO;IAAG,OAAO,aAAa,KAAK;GAAG,IAAI,KAAK,GAAG,WAAW,KAAK,CAAQ;EAAE;CAC9E;;;;;CAMA,WAAmB,QAAqC;EAEtD,MAAM,WAAW,OAAO,MAAM,CAAC,CAAC;EAChC,MAAM,aAAa,UAAU;EAC7B,IAAI,YAAY,YAAY;EAC5B,IAAI,CAAC,WAAW;GAEd,IAAI,CAAC,cAAc,oBAAoB,aACrC,YAAY,SAAS;GAEvB,IAAI,CAAC,WACH,OAAO,KACL,oBAAoB,cAChB,GAAG,KAAK,MAAM,UAAU,wCAAwC,SAAS,OAAO,eAChF,GAAG,KAAK,MAAM,UAAU,yEAC9B;EAEJ;EACA,MAAM,OACJ,KAAK,MAAM,WAAW,MAAM,MAAM,oBAAoB,SAAS,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,KAC5F,KAAK,GAAG,KAAK,MAAM,UAAU,wBAAwB,UAAU,MAAM;EACvE,OAAO,KAAK,gBAAgB,IAAI,CAAC,CAAC,GAAG,MAAM;CAC7C;CAEA,UACE,MACA,OACc;EACd,IAAI,UAAU,KAAA,GACZ,OAAO;OACF,IAAI,iBAAiB,aAAa;GAEvC,MAAM,YAAY,MAAM,cAAc,KAAK,GAAG,KAAK,MAAM,UAAU,0BAA0B;GAC7F,MAAM,OACJ,KAAK,MAAM,WAAW,MAAM,MAAM,oBAAoB,SAAS,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,KAC5F,KAAK,GAAG,KAAK,MAAM,UAAU,wBAAwB,UAAU,MAAM;GACvE,OAAO,KAAK,gBAAgB,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK;EAC/C,OAAO,IAAI,OAAO,KAAK,GACrB,OAAO,KACL,GAAG,KAAK,MAAM,UAAU,kFAC1B;OACK,IAAI,UAAU,MAAM;GAEzB,MAAM,QAAQ,SAAS,OAAQ,EAAE,MAAM,UAAU,IAAe,EAAE,MAAM,WAAW;GACnF,OAAO,EACL,KAAK,KAAK,MAAM,WAAW,KAAK,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,EACnF;EACF,OAAO;GAEL,MAAM,OACJ,KAAK,MAAM,WAAW,MACnB,MAAM,EAAE,cAAc,CAAC,CAAC,SAAS,2BAA2B,0BAA0B,KAAK,CAAW,CACzG,KAAK,KAAK,gCAAgC,OAAO;GACnD,OAAO,KAAK,gBAAgB,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK;EAC/C;CACF;;CAGA,gBAAwB,MAAsD;EAC5E,MAAM,aAAa,KAAK;EACxB,OAAO,IAAI,iBAAoB,KAAK,MAAM,YAAY,KAAK,IAAI;CACjE;AACF;;;;;;AAOA,MAAa,iBAAgC,OAAO,sBAAsB;;AAG1E,MAAa,eAA8B,OAAO,oBAAoB;;AAQtE,IAAa,kBAAb,MAA6B;CACN;CAArB,YAAY,eAAgC;EAAvB,KAAA,gBAAA;CAAwB;AAC/C;;;;;;;AAUA,IAAe,qBAAf,MAAkC;CAChC,GAAG,OAAuB;EACxB,OAAO,KAAK,UAAU,QAAQ,aAAa,KAAK,CAAC;CACnD;CAEA,MAAM,OAAuB;EAC3B,OAAO,KAAK,UAAU,SAAS,aAAa,KAAK,CAAC;CACpD;CAEA,KAAK,OAAuB;EAC1B,OAAO,KAAK,UAAU,QAAQ,aAAa,KAAK,CAAC;CACnD;AAGF;;AAGA,IAAM,kBAAN,cAA8B,mBAAmB;CAErC;CACA;CAFV,YACE,OACA,SACA;EACA,MAAM;EAHE,KAAA,QAAA;EACA,KAAA,UAAA;CAGV;CAEA,UAAoB,MAAgB,OAAiC;EACnE,IAAI,iBAAiB,KAAK,MAAM,KAAK,SACnC,OAAO,KAAK,kBAAkB,KAAK,QAAQ,KAAK,gCAAgC;EAElF,MAAM,KAAK,WAAW,KAAK,KAAK,CAAC,CAAC,GAAG,WAAW,KAAK,CAAC;EACtD,IAAI,KAAK,QAAQ,oBAAoB,SAAS,KAAK,QAAQ,0BAA0B,KAAA,GACnF,OAAO;IAAG,OAAO;GAAO;EAAG;EAE7B,MAAM,OAAO,KAAK,QAAQ,UAAU,MAAM,MAAM,EAAE,0BAA0B,KAAA,CAAS;EACrF,MAAM,aAAa,KAAK,OAAO,KAAK,sBAAuB,CAAC,MAAO,QAAQ,EAAE,CAAC;EAE9E,MAAM,gBAAgB,mBAAmB,QAAQ;GAC/C,MAAM,QAAQ,IAAI,SAAS,MAAM,UAAU;GAC3C,OAAO;IACL,KAAK,GAAG,MAAM,OAAO,UAAU,EAAE;IACjC,UAAU,CAAC,KAAK,QAAQ,qBAAqB;IAC7C,MAAM,CAAC,KAAK;GACd;EACF,CAAC;EACD,OAAO;IAAG,OAAO;GAAO,IAAI,EAAE,KAAK,CAAC,IAAI,aAAa,EAAE;EAAE;CAC3D;AACF;;AAGA,IAAM,oBAAN,cAAgC,mBAAmB;CAEvC;CACA;CAFV,YACE,OACA,OACA;EACA,MAAM;EAHE,KAAA,QAAA;EACA,KAAA,QAAA;CAGV;CAEA,UAAoB,MAAgB,OAAiC;EACnE,MAAM,EAAE,UAAU;EAClB,MAAM,YAAY,iBAAiB,KAAK;EACxC,MAAM,aAAa,OAAO,OAAO,UAAU,OAAO,CAAC,CAAC,MAAM,WAAW,OAAO,eAAe,MAAM,eAAe;EAChH,IAAI,CAAC,YACH,OAAO,KACL,eAAe,iBAAiB,KAAK,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,UAAU,MAAM,UAAU,KAAK,IACpF,MAAM,gBAAgB,gCAAgC,UAAU,UAAU,iCACjF;EAGF,MAAM,KAAK,IADQ,iBAAiB,WAAW,YAAY,MAAM,UACjD,CAAC,CAAC,GAAG,KAAK,MAAM,EAAE;EAElC,MAAM,WAAW,MAAM,SAAS,QAAQ,MAAM,gBAAgB,YAAY,MAAM,SAAS;EACzF,OAAO;IAAG,OAAO;GAAO;IAAK,iBAAiB;EAAS;CACzD;AACF;;;;;;;;;AAUA,IAAM,qBAAN,cAAiC,mBAAmB;CAExC;CACA;CAFV,YACE,OACA,OACA;EACA,MAAM;EAHE,KAAA,QAAA;EACA,KAAA,QAAA;CAGV;CAEA,UAAoB,MAAgB,OAAiC;EACnE,MAAM,EAAE,eAAe,gBAAgB,KAAK;EAC5C,MAAM,CAAC,WAAW,eAAe;EACjC,MAAM,KAAK,IAAI,gBAAgB,aAAa;EAC5C,MAAM,QAAQ,WAAW,KAAK,KAAK;EACnC,MAAM,UAAU,WAAW,KAAK;EAChC,MAAM,OAAO,mBAAmB,QAAQ;GACtC,MAAM,UAAU,IAAI,SAAS,EAAE;GAC/B,MAAM,KAAK,MAAM,MAAM,GAAG;GAC1B,OAAO;IAAE,KAAK,GAAG,MAAM,SAAS,SAAS,EAAE,KAAK,GAAG;IAAO,UAAU,GAAG;IAAU,MAAM,GAAG;GAAK;EACjG,CAAC;EACD,MAAM,KAAK,mBAAmB,QAAQ;GACpC,MAAM,UAAU,IAAI,SAAS,EAAE;GAC/B,MAAM,KAAK,QAAQ,MAAM,GAAG;GAC5B,OAAO;IAAE,KAAK,GAAG,GAAG,IAAI,KAAK,MAAM,SAAS,WAAW;IAAK,UAAU,GAAG;IAAU,MAAM,CAAC,GAAG,GAAG,MAAM,OAAO;GAAE;EACjH,CAAC;EACD,MAAM,WAAW,KAAK,MAAM,gBAAgB;EAC5C,OAAO;IACJ,OAAO;GACR;IACC,iBAAiB;IACjB,eAAe;IAAE,QAAQ;IAAI,IAAI;GAAK;EACzC;CACF;AACF;;AAGA,SAAS,aAAa,OAAiC;CACrD,IAAI,CAAC,QAAQ,KAAK,GAAG,OAAO,KAAK,iCAAiC,OAAO;CACzE,OAAO;AACT;;AAGA,SAAS,WAAW,OAA4B;CAC9C,OAAQ,MAAc;AACxB;;AAGA,IAAM,oBAAN,MAAwB;CACF;CAApB,YAAY,QAA2C;EAAnC,KAAA,SAAA;CAAoC;CAExD,GAAG,OAAuB;EACxB,OAAO,KAAK,OAAO,GAAG,KAAK;CAC7B;CAEA,MAAM,OAAuB;EAC3B,OAAO,KAAK,OAAO,MAAM,KAAK;CAChC;CAEA,KAAK,OAAuB;EAC1B,OAAO,KAAK,OAAO,KAAK,KAAK;CAC/B;AACF;;AAGA,SAAS,WAAW,OAAmC;CACrD,OAAO,UAAU,KAAA,KAAa;EAAC;EAAO;EAAQ;EAAO;EAAQ;EAAO;CAAK,CAAC,CAAC,SAAS,MAAM,IAAI;AAChG;;AAGA,SAAS,iBAAiB,MAAsB,KAAgC;CAG9E,MAAM,QADQ,CADE,MAAM,GAAG,uBAAuB,YAAY,IAAI,CAAC,CAC9C,CAAC,CAAC,MAAM,UAAU,MAAM,cAAc,KAAK,aAAa,OAAO,OAAO,MAAM,QAAQ,GAAG,CACxF,CAAC,EAAE,OAAO;CAC5B,IAAI,CAAC,WAAW,KAAK,GAAG,OAAO,KAAA;CAE/B,IAAI,OAAO,SAAS,SAAS,OAAO,SAAS,QAAQ;EACnD,IAAI,CAAC,MAAM,MAAM,QAAQ,OAAO,YAAY,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,QAAQ,MAAM,CAAC,GAAG,OAAO,KAAA;EAC1G,OAAO,MAAM,SAAS,SAClB;GACE,GAAG;GACH,YAAY,MAAM,WAAW,KAAK,eAAe;IAC/C,QAAQ,UAAU;IAClB,YAAY,UAAU;IACtB,gBAAgB,UAAU;IAC1B,eAAe,UAAU,OAAO;GAClC,EAAE;EACJ,IACA;CACN;CACA,OAAO;AACT;;;;;;AAOA,SAAS,WAAW,MAAiB,QAA8B;CACjE,MAAM,EAAE,SAAS;CACjB,MAAM,aAA6B,CAAC;CACpC,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAC/D,MAAM,IAAI,MAAM,sCAAsC,KAAK,MAAM;CAEnE,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;EAEjD,MAAM,QAAQ,QAAQ,OAAO,KAAK,OAAO,KAAK,OAAO,OAAO,KAAK,WAAW,GAAG,IAAI,KAAK,UAAU,OAAO,KAAA;EACzG,IACE,CAAC,SACD,CAAC;GAAC;GAAc;GAAa;GAAQ;EAAK,CAAC,CAAC,SAAS,MAAM,IAAI,KAC/D,CAAC,MAAM,SACP,MAAM,MAAM,QAAQ,WAAW,KAC/B,CAAC,MAAM,MAAM,QAAQ,OAAO,YAAY,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,QAAQ,MAAM,CAAC,GAE5F,MAAM,IAAI,MAAM,kCAAkC,KAAK,KAAK,GAAG,IAAI,uBAAuB;EAE5F,MAAM,SAAS,IAAI,YAAY,MAAM,MAAM,MAAM,QAAQ,EAAE,CAAC,QAAQ,IAAI;EACxE,IAAI;EACJ,IAAI,MAAM,SAAS,OAAO;GACxB,IAAI,CAAC,uBAAuB,KAAK,GAC/B,MAAM,IAAI,MAAM,sCAAsC,KAAK,KAAK,GAAG,IAAI,sBAAsB;GAE/F,MAAM,SAAS,kBAAkB,MAAM,cAAc,GAAG,KAAK;GAC7D,IAAI,QAAQ,SAAS,QACnB,MAAM,IAAI,MAAM,sCAAsC,KAAK,KAAK,GAAG,IAAI,sBAAsB;GAE/F,SAAS,SAAS,CAAC,MAAM,IAAI,CAAC;EAChC,OACE,SAAS,iBAAiB,KAAK;EAEjC,KAAK,MAAM,QAAQ,QACjB,IAAI,KAAK,SAAS,aAAa,KAAK,MAAM,MAAM,MAAM,MAAM,KAAA,CAAS,GAAG;GACtE,IAAI,KAAK,MAAM,OAAO,KAAA,GAAW,WAAW,KAAK,OAAO,aAAa;IAAE,MAAM;IAAO,OAAO,KAAK,MAAM;GAAG,CAAC,CAAC;GAC3G,IAAI,KAAK,MAAM,OAAO,KAAA,GAAW,WAAW,KAAK,OAAO,aAAa;IAAE,MAAM;IAAO,OAAO,KAAK,MAAM;GAAG,CAAC,CAAC;EAC7G,OAAO,IAAI,KAAK,SAAS,QAAQ,CAAC,OAAO,OAAO,WAAW,KAAK,MAAM,SAAS,IAAI,GACjF,WAAW,KAAK,EACd,IAAI,CACF,OAAO,aAAa,EAAE,MAAM,UAAU,CAAC,GACvC,OAAO,aAAa;GAAE,MAAM;GAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,MAAM,IAAI;EAAE,CAAC,CACjF,EACF,CAAC;OAED,WAAW,KAAK,OAAO,aAAa,IAAI,CAAC;CAG/C;CACA,OAAO,WAAW,WAAW,IAAI,gBAAgB,EAAE,KAAK,WAAW;AACrE;;AAGA,SAAS,uBAAuB,OAAyB;CACvD,IAAI,SAAS,QAAQ,OAAO,UAAU,aAAa,sBAAsB,KAAK,GAAG,OAAO;CACxF,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,MAAM,qBAAqB;CAClE,IAAI,OAAO,UAAU,YAAY,OAAO,KAAK,KAAK,CAAC,CAAC,WAAW,KAAK,OAAO,OAAO,OAAO,IAAI,GAAG;EAC9F,MAAM,WAAY,MAA0B;EAC5C,OAAO,YAAY,QAAQ,sBAAsB,QAAQ;CAC3D;CACA,OAAO;AACT;;AAGA,SAAS,sBAAsB,OAAyB;CACtD,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,SAAS,KAAK;AACjF"}
|
package/build/conditions.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conditions.cjs","names":[],"sources":["../src/conditions.ts"],"sourcesContent":["import { type ColumnCondition, type RawCondition } from \"./QueryParser.ts\";\n\nexport const predicateBrand: unique symbol = Symbol(\"joist.predicate\");\n\n/** Combines conditions without tying AND/OR or optional-filter pruning to either public API. */\nexport type ConditionGroup<C> = AndCondition<C> | OrCondition<C>;\n\n/** Requires every surviving condition to match. */\nexport interface AndCondition<C> {\n and: Array<C | undefined>;\n or?: never;\n pruneIfUndefined?: \"any\" | \"all\";\n}\n\n/** Requires at least one surviving condition to match. */\nexport interface OrCondition<C> {\n or: Array<C | undefined>;\n and?: never;\n pruneIfUndefined?: \"any\" | \"all\";\n}\n\n/** Identifies which API can resolve a predicate's aliases. */\nexport interface PredicateBrand<K extends \"domain\" | \"sql\"> {\n readonly [predicateBrand]: K;\n}\n\n/** A predicate built from alias(...) for em.find and scopes. */\nexport type DomainPredicate = (ColumnCondition | RawCondition) & PredicateBrand<\"domain\">;\n\n/** A predicate built from table(...), an SQL expression, or sql.condition. */\nexport type SqlPredicate = (ColumnCondition | RawCondition) & PredicateBrand<\"sql\">;\n\n/** Existing hand-written conditions remain an escape hatch, but cannot accept a foreign branded predicate. */\nexport type UnbrandedPredicate = (ColumnCondition | RawCondition) & { readonly [predicateBrand]?: never };\n\n/** SQL predicates and nested AND/OR groups, before query-specific clauses such as EXISTS are added. */\nexport type SqlCondition = AndCondition<SqlCondition> | OrCondition<SqlCondition> | SqlPredicate | UnbrandedPredicate;\n\n/** Unbranded compiler input shared by domain filtering and SQL queries after public API validation. */\nexport type ConditionInput =\n | AndCondition<ConditionInput>\n | OrCondition<ConditionInput>\n | ColumnCondition\n | RawCondition;\n\n/** Marks a newly created predicate without changing its enumerable SQL representation. */\nexport function brandPredicate<C extends object, K extends \"domain\" | \"sql\">(cond: C, kind: K): C & PredicateBrand<K> {\n return Object.defineProperty(cond, predicateBrand, { value: kind, enumerable: false }) as C & PredicateBrand<K>;\n}\n"],"mappings":";;;AAEA,MAAa,iBAAgC,OAAO,iBAAiB;;AA4CrE,SAAgB,eAA6D,MAAS,MAAgC;CACpH,OAAO,OAAO,eAAe,MAAM,gBAAgB;EAAE,OAAO;EAAM,YAAY;CAAM,CAAC;AACvF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conditions.d.cts","names":[],"sources":["../src/conditions.ts"],"mappings":";;cAEa;;KAGD,eAAe,KAAK,aAAa,KAAK,YAAY;;UAG7C,aAAa;EAC5B,KAAK,MAAM;EACX;EACA;;;UAIe,YAAY;EAC3B,IAAI,MAAM;EACV;EACA;;;UAIe,eAAe;YACpB,iBAAiB;;;KAIjB,mBAAmB,kBAAkB,gBAAgB;;KAGrD,gBAAgB,kBAAkB,gBAAgB;;KAGlD,sBAAsB,kBAAkB;YAA4B;;;KAGpE,eAAe,aAAa,gBAAgB,YAAY,gBAAgB,eAAe;;KAGvF,iBACR,aAAa,kBACb,YAAY,kBACZ,kBACA;;iBAGY,eAAe,kBAAkB,4BAA4B,MAAM,GAAG,MAAM,IAAI,IAAI,eAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conditions.d.mts","names":[],"sources":["../src/conditions.ts"],"mappings":";;cAEa;;KAGD,eAAe,KAAK,aAAa,KAAK,YAAY;;UAG7C,aAAa;EAC5B,KAAK,MAAM;EACX;EACA;;;UAIe,YAAY;EAC3B,IAAI,MAAM;EACV;EACA;;;UAIe,eAAe;YACpB,iBAAiB;;;KAIjB,mBAAmB,kBAAkB,gBAAgB;;KAGrD,gBAAgB,kBAAkB,gBAAgB;;KAGlD,sBAAsB,kBAAkB;YAA4B;;;KAGpE,eAAe,aAAa,gBAAgB,YAAY,gBAAgB,eAAe;;KAGvF,iBACR,aAAa,kBACb,YAAY,kBACZ,kBACA;;iBAGY,eAAe,kBAAkB,4BAA4B,MAAM,GAAG,MAAM,IAAI,IAAI,eAAe"}
|
package/build/conditions.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conditions.js","names":[],"sources":["../src/conditions.ts"],"sourcesContent":["import { type ColumnCondition, type RawCondition } from \"./QueryParser.ts\";\n\nexport const predicateBrand: unique symbol = Symbol(\"joist.predicate\");\n\n/** Combines conditions without tying AND/OR or optional-filter pruning to either public API. */\nexport type ConditionGroup<C> = AndCondition<C> | OrCondition<C>;\n\n/** Requires every surviving condition to match. */\nexport interface AndCondition<C> {\n and: Array<C | undefined>;\n or?: never;\n pruneIfUndefined?: \"any\" | \"all\";\n}\n\n/** Requires at least one surviving condition to match. */\nexport interface OrCondition<C> {\n or: Array<C | undefined>;\n and?: never;\n pruneIfUndefined?: \"any\" | \"all\";\n}\n\n/** Identifies which API can resolve a predicate's aliases. */\nexport interface PredicateBrand<K extends \"domain\" | \"sql\"> {\n readonly [predicateBrand]: K;\n}\n\n/** A predicate built from alias(...) for em.find and scopes. */\nexport type DomainPredicate = (ColumnCondition | RawCondition) & PredicateBrand<\"domain\">;\n\n/** A predicate built from table(...), an SQL expression, or sql.condition. */\nexport type SqlPredicate = (ColumnCondition | RawCondition) & PredicateBrand<\"sql\">;\n\n/** Existing hand-written conditions remain an escape hatch, but cannot accept a foreign branded predicate. */\nexport type UnbrandedPredicate = (ColumnCondition | RawCondition) & { readonly [predicateBrand]?: never };\n\n/** SQL predicates and nested AND/OR groups, before query-specific clauses such as EXISTS are added. */\nexport type SqlCondition = AndCondition<SqlCondition> | OrCondition<SqlCondition> | SqlPredicate | UnbrandedPredicate;\n\n/** Unbranded compiler input shared by domain filtering and SQL queries after public API validation. */\nexport type ConditionInput =\n | AndCondition<ConditionInput>\n | OrCondition<ConditionInput>\n | ColumnCondition\n | RawCondition;\n\n/** Marks a newly created predicate without changing its enumerable SQL representation. */\nexport function brandPredicate<C extends object, K extends \"domain\" | \"sql\">(cond: C, kind: K): C & PredicateBrand<K> {\n return Object.defineProperty(cond, predicateBrand, { value: kind, enumerable: false }) as C & PredicateBrand<K>;\n}\n"],"mappings":";;AAEA,MAAa,iBAAgC,OAAO,iBAAiB;;AA4CrE,SAAgB,eAA6D,MAAS,MAAgC;CACpH,OAAO,OAAO,eAAe,MAAM,gBAAgB;EAAE,OAAO;EAAM,YAAY;CAAM,CAAC;AACvF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"buildRawQuery.cjs","names":["kq","cleanSql","kqDot","buildWhereClause"],"sources":["../../src/drivers/buildRawQuery.ts"],"sourcesContent":["import { kq, kqDot } from \"../keywords.ts\";\nimport { type ParsedCteClause, type ParsedFindQuery, type ParsedTable } from \"../QueryParser.ts\";\nimport { assertNever, cleanSql } from \"../utils.ts\";\nimport { buildWhereClause } from \"./buildUtils.ts\";\n\ntype QuerySettings = { limit?: number; offset?: number };\n\n/**\n * Transforms `ParsedFindQuery` into a raw SQL string.\n *\n * In theory this should be implemented within each Driver, but the logic will be largely\n * the same for different dbs.\n */\nexport function buildRawQuery(\n parsed: ParsedFindQuery,\n settings: QuerySettings,\n): { sql: string; bindings: readonly any[] } {\n const { limit, offset } = settings;\n\n const primary = parsed.tables.find((t) => t.join === \"primary\")!;\n\n // If we're doing o2m joins, add a `DISTINCT` clause to avoid duplicates\n const needsDistinct =\n parsed.tables.some((t) => t.join === \"outer\" && t.distinct !== false) &&\n // If this is a `findCount`, it will rewrite the `select` to have its own distinct\n !parsed.selects.find((s) => typeof s === \"string\" && s.startsWith(\"count(\"));\n\n let sql = \"\";\n const bindings: any[] = [];\n\n if (parsed.ctes && parsed.ctes.length > 0) {\n const hasRecursive = parsed.ctes.some((cte) => cte.recursive);\n const maybeRecursive = hasRecursive ? \" RECURSIVE\" : \"\";\n sql += `WITH${maybeRecursive}`;\n for (let i = 0; i < parsed.ctes.length; i++) {\n const cte = parsed.ctes[i];\n sql += i > 0 ? \", \" : \"\";\n sql += ` ${cte.alias}`;\n if (cte.columns) {\n sql += \" (\";\n for (let j = 0; j < cte.columns.length; j++) {\n sql += j > 0 ? \", \" : \"\";\n sql += kq(cte.columns[j].columnName);\n }\n sql += \")\";\n }\n if (cte.query.kind === \"raw\") {\n sql += ` AS (${cleanSql(cte.query.sql)})`;\n bindings.push(...cte.query.bindings);\n } else if (cte.query.kind === \"ast\") {\n const nested = buildRawQuery(cte.query.query, {});\n sql += ` AS (${nested.sql})`;\n bindings.push(...nested.bindings);\n } else {\n assertNever(cte.query);\n }\n }\n sql += \" \";\n }\n\n sql += \"SELECT \";\n const subqueryRenderer = (q: ParsedFindQuery) => buildRawQuery(q, {});\n\n parsed.selects.forEach((s, i) => {\n const maybeDistinct = i === 0 && needsDistinct ? buildDistinctOn(parsed, primary) : \"\";\n const maybeComma = i === parsed.selects.length - 1 ? \"\" : \", \";\n if (typeof s === \"string\") {\n sql += maybeDistinct + s + maybeComma;\n } else if (\"sql\" in s) {\n sql += maybeDistinct + s.sql + maybeComma;\n bindings.push(...s.bindings);\n }\n });\n\n // If we're doing \"select distinct\" for o2m joins, then all order bys must be selects\n if (needsDistinct && parsed.orderBys.length > 0) {\n for (const { alias, column } of parsed.orderBys) {\n sql += `, ${kqDot(alias, column)}`;\n }\n }\n\n // Make sure the primary is first\n sql += ` FROM ${as(primary)}`;\n\n // Then the joins\n for (const t of parsed.tables) {\n if (t.join === \"inner\") {\n sql += ` JOIN ${as(t)} ON ${t.col1} = ${t.col2}`;\n } else if (t.join === \"outer\") {\n sql += ` LEFT OUTER JOIN ${as(t)} ON ${t.col1} = ${t.col2}`;\n } else if (t.join === \"primary\") {\n // handled above\n } else if (t.join === \"lateral\") {\n const { sql: subQ, bindings: subB } = buildRawQuery(t.query, t.settings ?? {});\n sql += ` CROSS JOIN LATERAL (${subQ}) AS ${kq(t.alias)}`;\n bindings.push(...subB);\n } else if (t.join === \"cross\") {\n sql += ` CROSS JOIN ${as(t)}`;\n } else {\n assertNever(t.join);\n }\n }\n\n if (parsed.condition) {\n const where = buildWhereClause(parsed.condition, true, subqueryRenderer);\n if (where) {\n sql += \" WHERE \" + where[0];\n bindings.push(...where[1]);\n }\n }\n\n if (parsed.groupBys && parsed.groupBys.length > 0) {\n sql +=\n \" GROUP BY \" +\n parsed.groupBys.map((gb) => (\"expression\" in gb ? gb.expression : kqDot(gb.alias, gb.column))).join(\", \");\n }\n\n if (parsed.orderBys.length > 0) {\n sql += \" ORDER BY \" + parsed.orderBys.map((ob) => kqDot(ob.alias, ob.column) + \" \" + ob.order).join(\", \");\n }\n\n if (limit !== undefined) {\n sql += ` LIMIT ?`;\n bindings.push(limit);\n }\n if (offset !== undefined) {\n sql += ` OFFSET ?`;\n bindings.push(offset);\n }\n\n return { sql, bindings };\n}\n\nfunction buildDistinctOn(parsed: ParsedFindQuery, primary: ParsedTable): string {\n const columns = [\n // If we have an order by, it needs to be included in the DISTINCT ON\n ...parsed.orderBys.map((ob) => kqDot(ob.alias, ob.column)),\n kqDot(primary.alias, \"id\"),\n ];\n return `DISTINCT ON (${columns.join(\", \")}) `;\n}\n\n/** Creates the `WITH alias (...)` SQL for the given `cte`. */\nexport function buildCteSql(cte: ParsedCteClause): { sql: string; bindings: readonly any[] } {\n const maybeRecursive = cte.recursive ? \"RECURSIVE \" : \"\";\n const maybeColumns = cte.columns ? ` (${cte.columns.map((c) => kq(c.columnName)).join(\", \")})` : \"\";\n const prefix = `WITH ${maybeRecursive}${cte.alias}${maybeColumns} AS`;\n if (cte.query.kind === \"raw\") {\n return {\n sql: `${prefix} (${cleanSql(cte.query.sql)} )`,\n bindings: cte.query.bindings,\n };\n } else if (cte.query.kind === \"ast\") {\n const { sql, bindings } = buildRawQuery(cte.query.query, {});\n return { sql: `${prefix} (${sql})`, bindings };\n } else {\n assertNever(cte.query);\n }\n}\n\nconst as = (t: ParsedTable) => `${kq(t.table)} AS ${kq(t.alias)}`;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"buildRawQuery.d.cts","names":[],"sources":["../../src/drivers/buildRawQuery.ts"],"mappings":";;KAKK;EAAkB;EAAgB;;;;;;;;iBAQvB,cACd,QAAQ,iBACR,UAAU;EACP;EAAa;;;iBA+HF,YAAY,KAAK;EAAoB;EAAa"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"buildRawQuery.d.mts","names":[],"sources":["../../src/drivers/buildRawQuery.ts"],"mappings":";;KAKK;EAAkB;EAAgB;;;;;;;;iBAQvB,cACd,QAAQ,iBACR,UAAU;EACP;EAAa;;;iBA+HF,YAAY,KAAK;EAAoB;EAAa"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"buildRawQuery.js","names":[],"sources":["../../src/drivers/buildRawQuery.ts"],"sourcesContent":["import { kq, kqDot } from \"../keywords.ts\";\nimport { type ParsedCteClause, type ParsedFindQuery, type ParsedTable } from \"../QueryParser.ts\";\nimport { assertNever, cleanSql } from \"../utils.ts\";\nimport { buildWhereClause } from \"./buildUtils.ts\";\n\ntype QuerySettings = { limit?: number; offset?: number };\n\n/**\n * Transforms `ParsedFindQuery` into a raw SQL string.\n *\n * In theory this should be implemented within each Driver, but the logic will be largely\n * the same for different dbs.\n */\nexport function buildRawQuery(\n parsed: ParsedFindQuery,\n settings: QuerySettings,\n): { sql: string; bindings: readonly any[] } {\n const { limit, offset } = settings;\n\n const primary = parsed.tables.find((t) => t.join === \"primary\")!;\n\n // If we're doing o2m joins, add a `DISTINCT` clause to avoid duplicates\n const needsDistinct =\n parsed.tables.some((t) => t.join === \"outer\" && t.distinct !== false) &&\n // If this is a `findCount`, it will rewrite the `select` to have its own distinct\n !parsed.selects.find((s) => typeof s === \"string\" && s.startsWith(\"count(\"));\n\n let sql = \"\";\n const bindings: any[] = [];\n\n if (parsed.ctes && parsed.ctes.length > 0) {\n const hasRecursive = parsed.ctes.some((cte) => cte.recursive);\n const maybeRecursive = hasRecursive ? \" RECURSIVE\" : \"\";\n sql += `WITH${maybeRecursive}`;\n for (let i = 0; i < parsed.ctes.length; i++) {\n const cte = parsed.ctes[i];\n sql += i > 0 ? \", \" : \"\";\n sql += ` ${cte.alias}`;\n if (cte.columns) {\n sql += \" (\";\n for (let j = 0; j < cte.columns.length; j++) {\n sql += j > 0 ? \", \" : \"\";\n sql += kq(cte.columns[j].columnName);\n }\n sql += \")\";\n }\n if (cte.query.kind === \"raw\") {\n sql += ` AS (${cleanSql(cte.query.sql)})`;\n bindings.push(...cte.query.bindings);\n } else if (cte.query.kind === \"ast\") {\n const nested = buildRawQuery(cte.query.query, {});\n sql += ` AS (${nested.sql})`;\n bindings.push(...nested.bindings);\n } else {\n assertNever(cte.query);\n }\n }\n sql += \" \";\n }\n\n sql += \"SELECT \";\n const subqueryRenderer = (q: ParsedFindQuery) => buildRawQuery(q, {});\n\n parsed.selects.forEach((s, i) => {\n const maybeDistinct = i === 0 && needsDistinct ? buildDistinctOn(parsed, primary) : \"\";\n const maybeComma = i === parsed.selects.length - 1 ? \"\" : \", \";\n if (typeof s === \"string\") {\n sql += maybeDistinct + s + maybeComma;\n } else if (\"sql\" in s) {\n sql += maybeDistinct + s.sql + maybeComma;\n bindings.push(...s.bindings);\n }\n });\n\n // If we're doing \"select distinct\" for o2m joins, then all order bys must be selects\n if (needsDistinct && parsed.orderBys.length > 0) {\n for (const { alias, column } of parsed.orderBys) {\n sql += `, ${kqDot(alias, column)}`;\n }\n }\n\n // Make sure the primary is first\n sql += ` FROM ${as(primary)}`;\n\n // Then the joins\n for (const t of parsed.tables) {\n if (t.join === \"inner\") {\n sql += ` JOIN ${as(t)} ON ${t.col1} = ${t.col2}`;\n } else if (t.join === \"outer\") {\n sql += ` LEFT OUTER JOIN ${as(t)} ON ${t.col1} = ${t.col2}`;\n } else if (t.join === \"primary\") {\n // handled above\n } else if (t.join === \"lateral\") {\n const { sql: subQ, bindings: subB } = buildRawQuery(t.query, t.settings ?? {});\n sql += ` CROSS JOIN LATERAL (${subQ}) AS ${kq(t.alias)}`;\n bindings.push(...subB);\n } else if (t.join === \"cross\") {\n sql += ` CROSS JOIN ${as(t)}`;\n } else {\n assertNever(t.join);\n }\n }\n\n if (parsed.condition) {\n const where = buildWhereClause(parsed.condition, true, subqueryRenderer);\n if (where) {\n sql += \" WHERE \" + where[0];\n bindings.push(...where[1]);\n }\n }\n\n if (parsed.groupBys && parsed.groupBys.length > 0) {\n sql +=\n \" GROUP BY \" +\n parsed.groupBys.map((gb) => (\"expression\" in gb ? gb.expression : kqDot(gb.alias, gb.column))).join(\", \");\n }\n\n if (parsed.orderBys.length > 0) {\n sql += \" ORDER BY \" + parsed.orderBys.map((ob) => kqDot(ob.alias, ob.column) + \" \" + ob.order).join(\", \");\n }\n\n if (limit !== undefined) {\n sql += ` LIMIT ?`;\n bindings.push(limit);\n }\n if (offset !== undefined) {\n sql += ` OFFSET ?`;\n bindings.push(offset);\n }\n\n return { sql, bindings };\n}\n\nfunction buildDistinctOn(parsed: ParsedFindQuery, primary: ParsedTable): string {\n const columns = [\n // If we have an order by, it needs to be included in the DISTINCT ON\n ...parsed.orderBys.map((ob) => kqDot(ob.alias, ob.column)),\n kqDot(primary.alias, \"id\"),\n ];\n return `DISTINCT ON (${columns.join(\", \")}) `;\n}\n\n/** Creates the `WITH alias (...)` SQL for the given `cte`. */\nexport function buildCteSql(cte: ParsedCteClause): { sql: string; bindings: readonly any[] } {\n const maybeRecursive = cte.recursive ? \"RECURSIVE \" : \"\";\n const maybeColumns = cte.columns ? ` (${cte.columns.map((c) => kq(c.columnName)).join(\", \")})` : \"\";\n const prefix = `WITH ${maybeRecursive}${cte.alias}${maybeColumns} AS`;\n if (cte.query.kind === \"raw\") {\n return {\n sql: `${prefix} (${cleanSql(cte.query.sql)} )`,\n bindings: cte.query.bindings,\n };\n } else if (cte.query.kind === \"ast\") {\n const { sql, bindings } = buildRawQuery(cte.query.query, {});\n return { sql: `${prefix} (${sql})`, bindings };\n } else {\n assertNever(cte.query);\n }\n}\n\nconst as = (t: ParsedTable) => `${kq(t.table)} AS ${kq(t.alias)}`;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"buildUtils.cjs","names":["fail","isDefined","kqDot","opToFn"],"sources":["../../src/drivers/buildUtils.ts"],"sourcesContent":["import { opToFn } from \"../EntityGraphQLFilter.ts\";\nimport { isDefined } from \"../EntityManager.ts\";\nimport { kqDot } from \"../keywords.ts\";\nimport {\n type ColumnCondition,\n type ExistsCondition,\n type ParsedExpressionFilter,\n type ParsedFindQuery,\n type ParsedValueFilter,\n type RawCondition,\n} from \"../QueryParser.ts\";\nimport { assertNever, fail } from \"../utils.ts\";\n\n/** Renders a ParsedFindQuery subquery to SQL — passed in to avoid circular imports with buildRawQuery. */\nexport type SubqueryRenderer = (q: ParsedFindQuery) => { sql: string; bindings: readonly any[] };\n\n/** Returns a tuple of `[\"cond AND (cond OR cond)\", bindings]`. */\nexport function buildWhereClause(\n exp: ParsedExpressionFilter,\n topLevel = false,\n renderSubquery?: SubqueryRenderer,\n): [string, any[]] | undefined {\n const tuples = exp.conditions\n .map((c) => {\n return c.kind === \"exp\"\n ? buildWhereClause(c, false, renderSubquery)\n : c.kind === \"column\"\n ? buildCondition(c)\n : c.kind === \"raw\"\n ? buildRawCondition(c)\n : c.kind === \"exists\"\n ? buildExistsCondition(c, renderSubquery)\n : fail(`Invalid condition ${c}`);\n })\n .filter(isDefined);\n // If we don't have any conditions to combine, just return undefined;\n if (tuples.length === 0) return undefined;\n // Wrap/join the sql strings together first, and then flatten the bindings.\n let sql = tuples.map(([sql]) => sql).join(` ${exp.op.toUpperCase()} `);\n if (!topLevel) sql = `(${sql})`;\n return [sql, tuples.flatMap(([, bindings]) => bindings)];\n}\n\nfunction buildRawCondition(raw: RawCondition): [string, readonly any[]] {\n return [raw.condition, raw.bindings];\n}\n\n/** Returns a tuple of `[\"column op ?\"`, bindings]`. */\nfunction buildCondition(cc: ColumnCondition): [string, any[]] {\n const { alias, column, cond } = cc;\n return buildValueCondition(kqDot(alias, column), cond);\n}\n\n/** Renders an encoded value filter against a SQL column expression. */\nexport function buildValueCondition(columnName: string, cond: ParsedValueFilter<unknown>): [string, any[]] {\n switch (cond.kind) {\n case \"eq\":\n case \"ne\":\n case \"gte\":\n case \"gt\":\n case \"lte\":\n case \"lt\":\n case \"like\":\n case \"nlike\":\n case \"ilike\":\n case \"nilike\":\n case \"regex\":\n case \"nregex\":\n case \"iregex\":\n case \"niregex\":\n case \"jsonPathExists\":\n case \"jsonPathPredicate\":\n case \"contains\":\n case \"containedBy\":\n case \"overlaps\": {\n const fn = opToFn[cond.kind] ?? fail(`Invalid operator ${cond.kind}`);\n return [`${columnName} ${fn} ?`, [cond.value]];\n }\n case \"noverlaps\":\n case \"ncontains\": {\n const fn = (opToFn as any)[cond.kind.substring(1)] ?? fail(`Invalid operator ${cond.kind}`);\n return [`NOT (${columnName} ${fn} ?)`, [cond.value]];\n }\n case \"is-null\":\n return [`${columnName} IS NULL`, []];\n case \"not-null\":\n return [`${columnName} IS NOT NULL`, []];\n case \"in\":\n return [`${columnName} = ANY(?)`, [cond.value]];\n case \"nin\":\n return [`${columnName} != ALL(?)`, [cond.value]];\n case \"between\":\n return [`${columnName} BETWEEN ? AND ?`, cond.value];\n default:\n assertNever(cond);\n }\n}\n\nfunction buildExistsCondition(c: ExistsCondition, renderSubquery?: SubqueryRenderer): [string, any[]] {\n if (!renderSubquery) throw new Error(\"EXISTS condition requires a subquery renderer\");\n const { sql, bindings } = renderSubquery(c.subquery);\n const prefix = c.negate ? \"NOT EXISTS\" : \"EXISTS\";\n return [`${prefix} (${sql})`, [...bindings]];\n}\n"],"mappings":";;;;;;;;AAiBA,SAAgB,iBACd,KACA,WAAW,OACX,gBAC6B;CAC7B,MAAM,SAAS,IAAI,WAChB,KAAK,MAAM;EACV,OAAO,EAAE,SAAS,QACd,iBAAiB,GAAG,OAAO,cAAc,IACzC,EAAE,SAAS,WACT,eAAe,CAAC,IAChB,EAAE,SAAS,QACT,kBAAkB,CAAC,IACnB,EAAE,SAAS,WACT,qBAAqB,GAAG,cAAc,IACtCA,cAAAA,KAAK,qBAAqB,GAAG;CACzC,CAAC,CAAC,CACD,OAAOC,sBAAAA,SAAS;CAEnB,IAAI,OAAO,WAAW,GAAG,OAAO,KAAA;CAEhC,IAAI,MAAM,OAAO,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,YAAY,EAAE,EAAE;CACrE,IAAI,CAAC,UAAU,MAAM,IAAI,IAAI;CAC7B,OAAO,CAAC,KAAK,OAAO,SAAS,GAAG,cAAc,QAAQ,CAAC;AACzD;AAEA,SAAS,kBAAkB,KAA6C;CACtE,OAAO,CAAC,IAAI,WAAW,IAAI,QAAQ;AACrC;;AAGA,SAAS,eAAe,IAAsC;CAC5D,MAAM,EAAE,OAAO,QAAQ,SAAS;CAChC,OAAO,oBAAoBC,iBAAAA,MAAM,OAAO,MAAM,GAAG,IAAI;AACvD;;AAGA,SAAgB,oBAAoB,YAAoB,MAAmD;CACzG,QAAQ,KAAK,MAAb;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YAEH,OAAO,CAAC,GAAG,WAAW,GADXC,4BAAAA,OAAO,KAAK,SAASH,cAAAA,KAAK,oBAAoB,KAAK,MAAM,EACxC,KAAK,CAAC,KAAK,KAAK,CAAC;EAE/C,KAAK;EACL,KAAK,aAEH,OAAO,CAAC,QAAQ,WAAW,GADfG,4BAAAA,OAAe,KAAK,KAAK,UAAU,CAAC,MAAMH,cAAAA,KAAK,oBAAoB,KAAK,MAAM,EACzD,MAAM,CAAC,KAAK,KAAK,CAAC;EAErD,KAAK,WACH,OAAO,CAAC,GAAG,WAAW,WAAW,CAAC,CAAC;EACrC,KAAK,YACH,OAAO,CAAC,GAAG,WAAW,eAAe,CAAC,CAAC;EACzC,KAAK,MACH,OAAO,CAAC,GAAG,WAAW,YAAY,CAAC,KAAK,KAAK,CAAC;EAChD,KAAK,OACH,OAAO,CAAC,GAAG,WAAW,aAAa,CAAC,KAAK,KAAK,CAAC;EACjD,KAAK,WACH,OAAO,CAAC,GAAG,WAAW,mBAAmB,KAAK,KAAK;EACrD,SACE,cAAA,YAAY,IAAI;CACpB;AACF;AAEA,SAAS,qBAAqB,GAAoB,gBAAoD;CACpG,IAAI,CAAC,gBAAgB,MAAM,IAAI,MAAM,+CAA+C;CACpF,MAAM,EAAE,KAAK,aAAa,eAAe,EAAE,QAAQ;CAEnD,OAAO,CAAC,GADO,EAAE,SAAS,eAAe,SACvB,IAAI,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC;AAC7C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"buildUtils.d.cts","names":[],"sources":["../../src/drivers/buildUtils.ts"],"mappings":";;;KAcY,oBAAoB,GAAG;EAAsB;EAAa;;;iBAGtD,iBACd,KAAK,wBACL,oBACA,iBAAiB;;iBAkCH,oBAAoB,oBAAoB,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"buildUtils.d.mts","names":[],"sources":["../../src/drivers/buildUtils.ts"],"mappings":";;;KAcY,oBAAoB,GAAG;EAAsB;EAAa;;;iBAGtD,iBACd,KAAK,wBACL,oBACA,iBAAiB;;iBAkCH,oBAAoB,oBAAoB,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"buildUtils.js","names":[],"sources":["../../src/drivers/buildUtils.ts"],"sourcesContent":["import { opToFn } from \"../EntityGraphQLFilter.ts\";\nimport { isDefined } from \"../EntityManager.ts\";\nimport { kqDot } from \"../keywords.ts\";\nimport {\n type ColumnCondition,\n type ExistsCondition,\n type ParsedExpressionFilter,\n type ParsedFindQuery,\n type ParsedValueFilter,\n type RawCondition,\n} from \"../QueryParser.ts\";\nimport { assertNever, fail } from \"../utils.ts\";\n\n/** Renders a ParsedFindQuery subquery to SQL — passed in to avoid circular imports with buildRawQuery. */\nexport type SubqueryRenderer = (q: ParsedFindQuery) => { sql: string; bindings: readonly any[] };\n\n/** Returns a tuple of `[\"cond AND (cond OR cond)\", bindings]`. */\nexport function buildWhereClause(\n exp: ParsedExpressionFilter,\n topLevel = false,\n renderSubquery?: SubqueryRenderer,\n): [string, any[]] | undefined {\n const tuples = exp.conditions\n .map((c) => {\n return c.kind === \"exp\"\n ? buildWhereClause(c, false, renderSubquery)\n : c.kind === \"column\"\n ? buildCondition(c)\n : c.kind === \"raw\"\n ? buildRawCondition(c)\n : c.kind === \"exists\"\n ? buildExistsCondition(c, renderSubquery)\n : fail(`Invalid condition ${c}`);\n })\n .filter(isDefined);\n // If we don't have any conditions to combine, just return undefined;\n if (tuples.length === 0) return undefined;\n // Wrap/join the sql strings together first, and then flatten the bindings.\n let sql = tuples.map(([sql]) => sql).join(` ${exp.op.toUpperCase()} `);\n if (!topLevel) sql = `(${sql})`;\n return [sql, tuples.flatMap(([, bindings]) => bindings)];\n}\n\nfunction buildRawCondition(raw: RawCondition): [string, readonly any[]] {\n return [raw.condition, raw.bindings];\n}\n\n/** Returns a tuple of `[\"column op ?\"`, bindings]`. */\nfunction buildCondition(cc: ColumnCondition): [string, any[]] {\n const { alias, column, cond } = cc;\n return buildValueCondition(kqDot(alias, column), cond);\n}\n\n/** Renders an encoded value filter against a SQL column expression. */\nexport function buildValueCondition(columnName: string, cond: ParsedValueFilter<unknown>): [string, any[]] {\n switch (cond.kind) {\n case \"eq\":\n case \"ne\":\n case \"gte\":\n case \"gt\":\n case \"lte\":\n case \"lt\":\n case \"like\":\n case \"nlike\":\n case \"ilike\":\n case \"nilike\":\n case \"regex\":\n case \"nregex\":\n case \"iregex\":\n case \"niregex\":\n case \"jsonPathExists\":\n case \"jsonPathPredicate\":\n case \"contains\":\n case \"containedBy\":\n case \"overlaps\": {\n const fn = opToFn[cond.kind] ?? fail(`Invalid operator ${cond.kind}`);\n return [`${columnName} ${fn} ?`, [cond.value]];\n }\n case \"noverlaps\":\n case \"ncontains\": {\n const fn = (opToFn as any)[cond.kind.substring(1)] ?? fail(`Invalid operator ${cond.kind}`);\n return [`NOT (${columnName} ${fn} ?)`, [cond.value]];\n }\n case \"is-null\":\n return [`${columnName} IS NULL`, []];\n case \"not-null\":\n return [`${columnName} IS NOT NULL`, []];\n case \"in\":\n return [`${columnName} = ANY(?)`, [cond.value]];\n case \"nin\":\n return [`${columnName} != ALL(?)`, [cond.value]];\n case \"between\":\n return [`${columnName} BETWEEN ? AND ?`, cond.value];\n default:\n assertNever(cond);\n }\n}\n\nfunction buildExistsCondition(c: ExistsCondition, renderSubquery?: SubqueryRenderer): [string, any[]] {\n if (!renderSubquery) throw new Error(\"EXISTS condition requires a subquery renderer\");\n const { sql, bindings } = renderSubquery(c.subquery);\n const prefix = c.negate ? \"NOT EXISTS\" : \"EXISTS\";\n return [`${prefix} (${sql})`, [...bindings]];\n}\n"],"mappings":";;;;;;;AAiBA,SAAgB,iBACd,KACA,WAAW,OACX,gBAC6B;CAC7B,MAAM,SAAS,IAAI,WAChB,KAAK,MAAM;EACV,OAAO,EAAE,SAAS,QACd,iBAAiB,GAAG,OAAO,cAAc,IACzC,EAAE,SAAS,WACT,eAAe,CAAC,IAChB,EAAE,SAAS,QACT,kBAAkB,CAAC,IACnB,EAAE,SAAS,WACT,qBAAqB,GAAG,cAAc,IACtC,KAAK,qBAAqB,GAAG;CACzC,CAAC,CAAC,CACD,OAAO,SAAS;CAEnB,IAAI,OAAO,WAAW,GAAG,OAAO,KAAA;CAEhC,IAAI,MAAM,OAAO,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,YAAY,EAAE,EAAE;CACrE,IAAI,CAAC,UAAU,MAAM,IAAI,IAAI;CAC7B,OAAO,CAAC,KAAK,OAAO,SAAS,GAAG,cAAc,QAAQ,CAAC;AACzD;AAEA,SAAS,kBAAkB,KAA6C;CACtE,OAAO,CAAC,IAAI,WAAW,IAAI,QAAQ;AACrC;;AAGA,SAAS,eAAe,IAAsC;CAC5D,MAAM,EAAE,OAAO,QAAQ,SAAS;CAChC,OAAO,oBAAoB,MAAM,OAAO,MAAM,GAAG,IAAI;AACvD;;AAGA,SAAgB,oBAAoB,YAAoB,MAAmD;CACzG,QAAQ,KAAK,MAAb;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YAEH,OAAO,CAAC,GAAG,WAAW,GADX,OAAO,KAAK,SAAS,KAAK,oBAAoB,KAAK,MAAM,EACxC,KAAK,CAAC,KAAK,KAAK,CAAC;EAE/C,KAAK;EACL,KAAK,aAEH,OAAO,CAAC,QAAQ,WAAW,GADf,OAAe,KAAK,KAAK,UAAU,CAAC,MAAM,KAAK,oBAAoB,KAAK,MAAM,EACzD,MAAM,CAAC,KAAK,KAAK,CAAC;EAErD,KAAK,WACH,OAAO,CAAC,GAAG,WAAW,WAAW,CAAC,CAAC;EACrC,KAAK,YACH,OAAO,CAAC,GAAG,WAAW,eAAe,CAAC,CAAC;EACzC,KAAK,MACH,OAAO,CAAC,GAAG,WAAW,YAAY,CAAC,KAAK,KAAK,CAAC;EAChD,KAAK,OACH,OAAO,CAAC,GAAG,WAAW,aAAa,CAAC,KAAK,KAAK,CAAC;EACjD,KAAK,WACH,OAAO,CAAC,GAAG,WAAW,mBAAmB,KAAK,KAAK;EACrD,SACE,YAAY,IAAI;CACpB;AACF;AAEA,SAAS,qBAAqB,GAAoB,gBAAoD;CACpG,IAAI,CAAC,gBAAgB,MAAM,IAAI,MAAM,+CAA+C;CACpF,MAAM,EAAE,KAAK,aAAa,eAAe,EAAE,QAAQ;CAEnD,OAAO,CAAC,GADO,EAAE,SAAS,eAAe,SACvB,IAAI,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC;AAC7C"}
|
package/build/execute.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute.cjs","names":["isReadQueryValue","parseUserQuery","isTable","getTableMgmt","AliasAssigner","Ctx","registerCtes","projectionToSql","kq","parseNestedQuery","safeKq","conditionToSql","injectedConditions","pruneCtes","withFragment","isExpr","isEntity","asNode","keyToTaggedId","toTaggedId"],"sources":["../src/execute.ts"],"sourcesContent":["import { AliasAssigner } from \"./AliasAssigner.ts\";\nimport { type Column } from \"./columns.ts\";\nimport { type SqlCondition } from \"./conditions.ts\";\nimport { type DriverQueryResult } from \"./drivers/Driver.ts\";\nimport { type Entity, isEntity } from \"./Entity.ts\";\nimport { type IdOf } from \"./EntityManager.ts\";\nimport { type EntityMetadata } from \"./EntityMetadata.ts\";\nimport { type ExprBrand, type ExprLike, type SqlFragment, asNode, exprBrand, isExpr } from \"./Expr.ts\";\nimport { keyToTaggedId, toTaggedId } from \"./keys.ts\";\nimport { kq, safeKq } from \"./keywords.ts\";\nimport {\n type CheckReadQuery,\n type CheckScope,\n type CheckSetQuery,\n Ctx,\n type EntityHydrator,\n type NameOf,\n type Plan,\n type Query,\n type QueryJoins,\n type QueryRow,\n type ReadQueryRow,\n type SetOperand,\n type SetOperation,\n type SetQuery,\n type Subquery,\n type WithInput,\n conditionToSql,\n entityQueryBrand,\n injectedConditions,\n isReadQueryValue,\n parseNestedQuery,\n parseUserQuery,\n projectionToSql,\n pruneCtes,\n registerCtes,\n subqueryBrand,\n withFragment,\n} from \"./query.ts\";\nimport { type TableFor, getTableMgmt, isTable, tableMgmt } from \"./Tables.ts\";\nimport { type ColumnsOf, type TypeMapEntry } from \"./typeMap.ts\";\nimport { fail } from \"./utils.ts\";\n\n/** The native command count and decoded rows from one immediate SQL statement. */\nexport interface ExecuteResult<R> {\n rowCount: number;\n rows: R[];\n}\n\n/** A mutation's RETURNING projection: one SQL expression or a named object of expressions. */\nexport type MutationReturning = (ExprLike<unknown> | Readonly<Record<string, ExprLike<unknown>>>) & {\n readonly [tableMgmt]?: never;\n readonly [subqueryBrand]?: never;\n readonly [entityQueryBrand]?: never;\n};\n\n/** SQL INSERT inputs, based on physical storage rather than entity creation options. */\nexport type InsertValues<T extends Entity> = {\n [K in RequiredInsertKey<T>]: Assignment<T, K>;\n} & {\n [K in Exclude<InsertKey<T>, RequiredInsertKey<T>>]?: Assignment<T, K> | undefined;\n};\n\n/** SQL UPDATE inputs include persisted derived columns, but never primary keys. */\nexport type UpdateValues<T extends Entity> = {\n [K in UpdateKey<T>]?: Assignment<T, K> | undefined;\n};\n\n/** A reusable INSERT POJO; use a concrete Q for annotated INSERT SELECT source checking. */\nexport type InsertStatement<\n T extends Entity,\n R extends MutationReturning | undefined = MutationReturning | undefined,\n Q extends SetOperand = Query<InsertProjection<T>, []> | Subquery<InsertSourceRow<T>, string>,\n> = {\n readonly insert: MutationTarget<T>;\n readonly returning?: R;\n readonly update?: never;\n readonly delete?: never;\n readonly set?: never;\n readonly where?: never;\n readonly allowAll?: never;\n readonly softDeletes?: never;\n /** CTEs to add to a `WITH` before the INSERT; see `Clauses.with`. */\n readonly with?: WithInput;\n} & NoMutationReadClauses &\n (\n | { readonly values: InsertValues<T> | readonly InsertValues<T>[]; readonly from?: never }\n | { readonly from: Q & CheckInsertSource<T, Q>; readonly values?: never }\n );\n\n/** A reusable guarded UPDATE POJO. Undefined assignments leave existing columns unchanged. */\nexport type UpdateStatement<\n T extends Entity,\n R extends MutationReturning | undefined = MutationReturning | undefined,\n> = {\n readonly update: MutationTarget<T>;\n readonly set: UpdateValues<T>;\n readonly returning?: R;\n readonly insert?: never;\n readonly delete?: never;\n readonly values?: never;\n readonly from?: never;\n /** CTEs to add to a `WITH` before the UPDATE; see `Clauses.with`. */\n readonly with?: WithInput;\n} & MutationFilter &\n NoMutationReadClauses;\n\n/** A reusable guarded physical DELETE POJO, not an ORM soft delete. */\nexport type DeleteStatement<\n T extends Entity,\n R extends MutationReturning | undefined = MutationReturning | undefined,\n> = {\n readonly delete: MutationTarget<T>;\n readonly returning?: R;\n readonly insert?: never;\n readonly update?: never;\n readonly values?: never;\n readonly from?: never;\n readonly set?: never;\n /** CTEs to add to a `WITH` before the DELETE; see `Clauses.with`. */\n readonly with?: WithInput;\n} & MutationFilter &\n NoMutationReadClauses;\n\n/** Public statement annotations retain the target's physical field policy. */\nexport type MutationStatement<\n T extends Entity,\n R extends MutationReturning | undefined = MutationReturning | undefined,\n> = InsertStatement<T, R> | UpdateStatement<T, R> | DeleteStatement<T, R>;\n\n/** Inference starts with the literal POJO; CheckMutation checks its target and every supplied key. */\nexport type MutationInput = (\n | { readonly insert: TableFor<Entity>; readonly values: object | readonly object[]; readonly from?: never }\n | { readonly insert: TableFor<Entity>; readonly from: SetOperand; readonly values?: never }\n | { readonly update: TableFor<Entity>; readonly set: object }\n | { readonly delete: TableFor<Entity> }\n) & { readonly returning?: MutationReturning; readonly with?: WithInput } & MutationFilter;\n\n/** Without RETURNING the row type is never; scalar expressions produce scalar rows. */\nexport type MutationRow<M> = M extends { readonly returning?: infer R }\n ? R extends MutationReturning\n ? R extends ExprLike<unknown>\n ? QueryRow<R>\n : { -readonly [K in keyof QueryRow<R>]: QueryRow<R>[K] }\n : never\n : never;\n\n/** Checks nonliteral statements as well as fresh literals without widening their inferred result. */\nexport type CheckMutation<M> = M extends unknown\n ? TargetEntity<M> extends infer T extends Entity\n ? TypeMapEntry<T, \"supportsEmExecute\"> extends true\n ? { readonly [K in keyof M]: K extends MutationClause<M> ? unknown : never } & {\n readonly returning?: M extends { readonly returning?: infer R }\n ? CheckReturning<R, NameOf<TargetTable<M>>>\n : never;\n } & (\n | (M extends { readonly values: infer V } ? { readonly values: CheckValues<T, V> } : never)\n | (M extends { readonly from: infer Q extends SetOperand }\n ? { readonly from: CheckInsertSource<T, Q> }\n : never)\n | (M extends { readonly set: infer V }\n ? { readonly set: CheckAssignments<V, UpdateValues<T>, NameOf<TargetTable<M>>> }\n : never)\n | (M extends { readonly delete: unknown } ? unknown : never)\n )\n : \"SQL mutations require a supported non-inherited target and regenerated metadata\"\n : never\n : never;\n\n/** Classifies mutation roots before EntityManager applies write permissions, including malformed roots. */\nexport function isMutation(arg: unknown): boolean {\n return (\n typeof arg === \"object\" &&\n arg !== null &&\n !isReadQueryValue(arg) &&\n [\"insert\", \"update\", \"delete\"].some((key) => key in arg)\n );\n}\n\n/**\n * Compiles one immediate statement using the read compiler's scopes, projections, and codecs.\n * INSERT SELECT keeps source rows in PostgreSQL; only RETURNING rows pass through JS decoders.\n * An undefined plan represents a validated standalone empty VALUES array, not DEFAULT VALUES.\n */\nexport function parseStatement(arg: unknown): Plan | undefined {\n if (!isMutation(arg)) return parseUserQuery(arg);\n const statement = arg as Record<string, unknown>;\n const roots = [\"insert\", \"update\", \"delete\"].filter((key) => key in statement);\n if (roots.length !== 1) fail(\"A mutation requires exactly one insert, update, or delete root\");\n const operation = roots[0];\n const allowed =\n operation === \"insert\"\n ? [\"insert\", \"values\", \"from\", \"returning\", \"with\"]\n : [\n operation,\n \"where\",\n \"allowAll\",\n \"softDeletes\",\n \"returning\",\n \"with\",\n ...(operation === \"update\" ? [\"set\"] : []),\n ];\n checkPojo(statement, allowed, `SQL ${operation}`);\n const target = statement[operation];\n if (!isTable(target)) fail(\"A mutation target must be an entity table\");\n const mgmt = getTableMgmt(target);\n const meta = mgmt.meta;\n if (meta.inheritanceType || meta.baseType || meta.baseTypes.length || meta.subTypes.length) {\n fail(\"SQL mutations do not support CTI/STI targets or inherited table families\");\n }\n if (meta.supportsEmExecute !== true)\n fail(`SQL mutations require supported physical metadata for ${meta.type}; run codegen`);\n const fields = Object.entries(meta.columns);\n for (const [, field] of fields) {\n requireColumnMetadata(meta, field);\n }\n const assigner = new AliasAssigner();\n // A CTE is in scope for the whole statement, so its scope is the parent of every other one here. It\n // deliberately holds no target alias, which is what lets INSERT VALUES cells and the INSERT SELECT\n // source read the CTEs without also seeing the row being written.\n const withCtx = new Ctx(assigner, undefined);\n const ctes = registerCtes(statement, withCtx, assigner);\n // Aliases the rest of the statement reads, so an unread CTE prunes like it does on a read query.\n const refs: string[] = [];\n const ctx = new Ctx(assigner, withCtx);\n const alias = assigner.getAlias(meta.tableName);\n ctx.register(mgmt, alias);\n const returning = statement.returning === undefined ? undefined : projectionToSql(statement.returning, ctx);\n if (returning) for (const select of returning.selects) refs.push(...select.refs);\n let sql = `${operation === \"delete\" ? \"DELETE FROM\" : operation.toUpperCase() + (operation === \"insert\" ? \" INTO\" : \"\")} ${kq(meta.tableName)} AS ${kq(alias)}`;\n const bindings: unknown[] = [];\n if (operation === \"insert\") {\n if (\"values\" in statement === \"from\" in statement) fail(\"INSERT requires exactly one of values or from\");\n const required = fields.filter(([, column]) => column.insert === \"required\");\n if (\"values\" in statement) {\n const rows = Array.isArray(statement.values) ? statement.values : [statement.values];\n // A VALUES cell *is* the new row, so there is no existing row for it to read: this scope skips\n // the `ctx.register(mgmt, alias)` above, so a cell naming the target fails instead of emitting a\n // `b` with no FROM clause. I.e. an UPDATE can say `set: { title: b.title }`; an INSERT cannot.\n // A value subquery still works, because it brings its own sources, and the parent here is the CTE\n // scope rather than `ctx`, so a cell can read a `with` entry but not the row being written.\n const valuesCtx = new Ctx(assigner, withCtx);\n const entries = rows.map((row) => assignments(meta, row, \"insert\"));\n for (const row of entries) {\n for (const [key] of required) {\n if (!row.some((entry) => entry[0] === key)) fail(`INSERT requires ${meta.type}.${key}`);\n }\n }\n if (rows.length === 0) return undefined;\n const keys = fields.filter(([key]) => entries.some((row) => row.some((entry) => entry[0] === key)));\n sql += ` (${keys.map(([, field]) => kq(field.columnName)).join(\", \")}) VALUES `;\n sql += entries\n .map((row) => {\n const cells = keys.map(([key, field]) => {\n const entry = row.find((entry) => entry[0] === key);\n if (!entry) return \"DEFAULT\";\n const cell = assignmentToSql(meta, field, entry[1], valuesCtx);\n bindings.push(...cell.bindings);\n refs.push(...cell.refs);\n return cell.sql;\n });\n return `(${cells.join(\", \")})`;\n })\n .join(\", \");\n } else {\n const source = parseNestedQuery(statement.from, withCtx, assigner);\n if (source.output.kind !== \"pojo\") fail(\"INSERT SELECT requires named POJO output columns\");\n const columns = source.output.columns;\n for (const [key] of required) {\n if (!columns.some((column) => column[0] === key)) fail(`INSERT requires ${meta.type}.${key}`);\n }\n for (const [key, expr] of columns) {\n const field = writableField(meta, key, \"insert\");\n const left = field.outputType;\n const right = expr.outputType;\n if (\n !left ||\n !right ||\n left.dbType !== right.dbType ||\n left.domain !== right.domain ||\n left.idMeta !== right.idMeta\n ) {\n fail(`INSERT SELECT ${meta.type}.${key} has incompatible or unknown storage codecs`);\n }\n if (!field.sqlNullable && expr.sqlNullable === true)\n fail(`INSERT SELECT ${meta.type}.${key} cannot accept a nullable output`);\n }\n const keys = fields.filter(([key]) => columns.some((column) => column[0] === key));\n const sourceAlias = safeKq(assigner.getLiteralAlias(\"sq\"));\n sql += ` (${keys.map(([, field]) => kq(field.columnName)).join(\", \")}) SELECT ${keys.map(([key]) => `${sourceAlias}.${safeKq(key)}`).join(\", \")} FROM (${source.sql}) AS ${sourceAlias}`;\n bindings.push(...source.bindings);\n refs.push(...source.outerRefs);\n }\n } else {\n if (statement.allowAll !== undefined && typeof statement.allowAll !== \"boolean\") fail(\"allowAll must be a boolean\");\n if (\n statement.softDeletes !== undefined &&\n statement.softDeletes !== \"include\" &&\n statement.softDeletes !== \"exclude\"\n )\n fail(\"softDeletes must be 'include' or 'exclude'\");\n const user = mutationCondition(statement.where, ctx);\n if (!user && statement.allowAll !== true) fail(\"UPDATE and DELETE require a nonempty user where or allowAll: true\");\n if (operation === \"update\") {\n const entries = assignments(meta, statement.set, \"update\");\n sql +=\n \" SET \" +\n entries\n .map((entry) => {\n const [key, value] = entry;\n const field = writableField(meta, key, \"update\");\n const cell = assignmentToSql(meta, field, value, ctx);\n bindings.push(...cell.bindings);\n refs.push(...cell.refs);\n return `${kq(field.columnName)} = ${cell.sql}`;\n })\n .join(\", \");\n }\n const injected = conditionToSql(\n { and: injectedConditions({ meta, alias }, statement.softDeletes ?? \"exclude\") },\n ctx,\n true,\n );\n const conditions = [user, injected].filter((condition) => condition !== undefined);\n if (conditions.length) {\n sql += ` WHERE ${conditions.map((condition) => `(${condition.sql})`).join(\" AND \")}`;\n for (const condition of conditions) {\n bindings.push(...condition.bindings);\n refs.push(...condition.refs);\n }\n }\n }\n if (returning) {\n sql += ` RETURNING ${returning.selects.map((select) => select.sql).join(\", \")}`;\n for (const select of returning.selects) bindings.push(...select.bindings);\n }\n const keptCtes = pruneCtes(ctes, new Set(refs));\n if (keptCtes.length > 0) {\n const clause = withFragment(keptCtes);\n sql = clause.sql + sql;\n bindings.unshift(...clause.bindings);\n }\n return {\n sql,\n bindings,\n outerRefs: [],\n output: returning?.output ?? { kind: \"pojo\", columns: [] },\n decodeRows: returning?.decodeRows ?? (() => []),\n };\n}\n\n/** Retains native counts even when no rows return, and propagates decoding failures after execution. */\nexport function decodeStatementResult(\n em: EntityHydrator,\n plan: Plan,\n result: DriverQueryResult,\n): ExecuteResult<unknown> {\n if (typeof result.rowCount !== \"number\" || !Number.isInteger(result.rowCount) || result.rowCount < 0)\n fail(\"The driver did not return a numeric command rowCount\");\n return { rowCount: result.rowCount, rows: plan.decodeRows(em, result.rows) };\n}\n\ntype MutationTarget<T extends Entity> = TableFor<T> &\n (TypeMapEntry<T, \"supportsEmExecute\"> extends true ? unknown : never);\ntype MutationFilter = {\n readonly where?: SqlCondition | ExprLike<boolean>;\n readonly allowAll?: boolean;\n readonly softDeletes?: \"include\" | \"exclude\";\n};\ntype NoMutationReadClauses = Partial<\n Record<\n | \"select\"\n | \"join\"\n | \"groupBy\"\n | \"having\"\n | \"orderBy\"\n | \"limit\"\n | \"offset\"\n | \"distinct\"\n | \"pruneJoins\"\n | \"as\"\n | \"union\"\n | \"unionAll\"\n | \"intersect\"\n | \"intersectAll\"\n | \"except\"\n | \"exceptAll\"\n | \"ctes\"\n | \"using\"\n | \"onConflict\",\n never\n >\n>;\n/** Column keys allowed in INSERT, i.e. Book's optional `id` and required `authorId`. */\ntype InsertKey<T> = {\n [K in keyof ColumnsOf<T>]: ColumnsOf<T>[K] extends { insert: \"required\" | \"optional\" } ? K : never;\n}[keyof ColumnsOf<T>];\n/** Column keys that each INSERT row must supply, i.e. Book's `authorId` despite its ORM default. */\ntype RequiredInsertKey<T> = {\n [K in keyof ColumnsOf<T>]: ColumnsOf<T>[K] extends { insert: \"required\" } ? K : never;\n}[keyof ColumnsOf<T>];\n/** Column keys allowed in UPDATE SET, i.e. Book's `title` and `authorId`, but not `id`. */\ntype UpdateKey<T> = {\n [K in keyof ColumnsOf<T>]: ColumnsOf<T>[K] extends { update: true } ? K : never;\n}[keyof ColumnsOf<T>];\n/** A column's domain value before SQL nullability is added, i.e. Book's `id` is BookId and `authorId` is AuthorId. */\ntype DomainValue<T, K extends keyof ColumnsOf<T>> = K extends \"id\"\n ? IdOf<T>\n : ColumnsOf<T>[K] extends { entity: infer U }\n ? IdOf<U>\n : ColumnsOf<T>[K] extends { type: infer V }\n ? V\n : never;\ntype SqlValue<T, K extends keyof ColumnsOf<T>> =\n | DomainValue<T, K>\n | (ColumnsOf<T>[K] extends { nullable: true } ? null : never);\ntype Assignment<T, K extends keyof ColumnsOf<T>> =\n | SqlValue<T, K>\n | ExprLike<SqlValue<T, K>>\n | (K extends \"id\" ? never : ColumnsOf<T>[K] extends { entity: infer U } ? U : never);\ntype InsertSourceRow<T> = { [K in RequiredInsertKey<T>]: SqlValue<T, K> } & {\n [K in Exclude<InsertKey<T>, RequiredInsertKey<T>>]?: SqlValue<T, K>;\n};\ntype InsertProjection<T> = { [K in RequiredInsertKey<T>]: ExprLike<SqlValue<T, K>> } & {\n [K in Exclude<InsertKey<T>, RequiredInsertKey<T>>]?: ExprLike<SqlValue<T, K>>;\n};\ntype UnionKeys<V> = V extends unknown ? keyof V : never;\n/** Collects every alternative before scope checking; a valid branch cannot hide an unrelated alias. */\ntype UnionValue<V, K extends PropertyKey> = V extends unknown ? (K extends keyof V ? V[K] : never) : never;\ntype ExprSource<V> = V extends { readonly [exprBrand]: ExprBrand<unknown, infer Src> } ? Src : never;\ntype CheckExprScope<V, Scope> =\n string extends ExprSource<V>\n ? unknown\n : [Exclude<ExprSource<V>, Scope>] extends [never]\n ? unknown\n : \"Expression source is not in the statement scope\";\ntype ReturningExpr<R> = R extends ExprLike<unknown> ? R : R extends undefined ? never : R[keyof R];\ntype EmptyReturning<R> = R extends object ? (keyof R extends never ? true : false) : false;\ntype CheckReturning<R, Scope> = true extends EmptyReturning<R> ? never : CheckExprScope<ReturningExpr<R>, Scope>;\ntype CheckAssignments<V, Allowed, Scope> = [Exclude<UnionKeys<V>, keyof Allowed>] extends [never]\n ? Allowed & {\n [K in UnionKeys<V>]?: CheckExprScope<UnionValue<V, K>, Scope>;\n }\n : \"SQL assignments have unknown target fields\";\ntype CheckValues<T extends Entity, V> =\n | ([Extract<V, readonly unknown[]>] extends [never]\n ? never\n : readonly CheckAssignments<Extract<V, readonly unknown[]>[number], InsertValues<T>, never>[])\n | ([Exclude<V, readonly unknown[]>] extends [never]\n ? never\n : CheckAssignments<Exclude<V, readonly unknown[]>, InsertValues<T>, never>);\ntype CheckSourceScope<Q> = Q extends { readonly select: infer S; readonly from: infer F }\n ? CheckScope<S, F, \"join\" extends keyof Q ? Extract<Q[keyof Q & \"join\"], QueryJoins> : []>\n : {\n [K in keyof Q]: K extends SetOperation\n ? Q[K] extends readonly unknown[]\n ? { [I in keyof Q[K]]: CheckSourceScope<Q[K][I]> }\n : unknown\n : unknown;\n };\ntype CheckInsertSource<T, Q extends SetOperand> = SetOperand extends Q\n ? \"INSERT source was typed too generically; retain its named output fields\"\n : ReadQueryRow<Q> extends InsertSourceRow<T>\n ? Exclude<UnionKeys<ReadQueryRow<Q>>, InsertKey<T>> extends never\n ? CheckReadQuery<Q> &\n CheckSourceScope<Q> &\n (Q extends SetQuery<readonly SetOperand[]> ? CheckSetQuery<Q> : unknown)\n : \"INSERT SELECT has unknown target fields\"\n : \"INSERT SELECT requires compatible values for all SQL-required fields\";\ntype TargetEntity<M> = M extends\n | { readonly insert: TableFor<infer T> }\n | { readonly update: TableFor<infer T> }\n | { readonly delete: TableFor<infer T> }\n ? T\n : never;\ntype TargetTable<M> = M extends\n | { readonly insert: infer A }\n | { readonly update: infer A }\n | { readonly delete: infer A }\n ? A\n : never;\ntype MutationClause<M> =\n | \"returning\"\n | \"with\"\n | (M extends { readonly insert: unknown }\n ? \"insert\" | (M extends { readonly values: unknown } ? \"values\" : \"from\")\n : \"where\" | \"allowAll\" | \"softDeletes\" | (M extends { readonly update: unknown } ? \"update\" | \"set\" : \"delete\"));\n/** SQL mutations require complete physical metadata. */\nfunction requireColumnMetadata(meta: EntityMetadata, column: Column): void {\n if (\n typeof column.sqlNullable !== \"boolean\" ||\n typeof column.hasDefault !== \"boolean\" ||\n typeof column.isGenerated !== \"boolean\"\n )\n fail(`Missing physical metadata for ${meta.type}.${column.columnName}; run codegen`);\n}\n\n/** Validates every supplied key, including undefined fields, before pruning omitted values. */\nfunction assignments(meta: EntityMetadata, value: unknown, operation: \"insert\" | \"update\"): [string, unknown][] {\n if (!value || typeof value !== \"object\" || Array.isArray(value) || isExpr(value) || isEntity(value))\n fail(`${operation} assignments must be a field POJO`);\n const entries = Object.entries(value);\n for (const [key] of entries) writableField(meta, key, operation);\n checkPojo(value, Object.keys(meta.columns), `${operation} assignments`);\n const defined = entries.filter((entry) => entry[1] !== undefined);\n if (!defined.length) fail(`${operation} requires at least one defined field; empty rows/sets are not DEFAULT VALUES`);\n return defined;\n}\n\n/** Applies physical write restrictions, not ORM-derived, protected, or business-immutable flags. */\nfunction writableField(meta: EntityMetadata, key: string, operation: \"insert\" | \"update\"): Column {\n const column = Object.hasOwn(meta.columns, key) ? meta.columns[key] : undefined;\n if (!column) fail(`Unsupported SQL mutation field ${meta.type}.${key}`);\n requireColumnMetadata(meta, column);\n if (operation === \"update\" && key === \"id\") fail(\"UPDATE primary-key assignments are not supported\");\n if (column.isGenerated) fail(`Generated field ${meta.type}.${key} is omit-only`);\n if (operation === \"update\" ? !column.update : column.insert === \"never\")\n fail(`Unsupported SQL mutation field ${meta.type}.${key}`);\n return column;\n}\n\n/**\n * Classifies SQL expressions and SQL NULL before invoking the column's entity-independent write codec.\n * Normalizes public PK/FK ids to internal tagged ids using the target entity's idType.\n */\nfunction assignmentToSql(meta: EntityMetadata, column: Column, value: unknown, ctx: Ctx): SqlFragment {\n if (isExpr(value)) return asNode(value).toSql(ctx);\n if (value === null) {\n if (!column.sqlNullable) fail(`${meta.type}.${column.columnName} is physically NOT NULL`);\n return { sql: \"NULL\", bindings: [], refs: [] };\n }\n if (column.idMetadata) {\n const other = column.idMetadata();\n if (isEntity(value)) {\n if (column.columnName === \"id\" || !(value instanceof other.cstr)) fail(`Expected a ${other.type} reference`);\n if (value.isNewEntity || value.idTaggedMaybe === undefined)\n fail(`Cannot reference an unflushed ${other.type}, even with an assigned ID`);\n value = value.idTaggedMaybe;\n } else if (typeof value !== (other.idType === \"number\" ? \"number\" : \"string\")) {\n fail(`Expected a persisted ${other.type} or its ID; nested creation is not supported`);\n } else {\n // Public untagged TEXT ids may contain delimiters or start with the entity tag.\n value =\n other.idType === \"untagged-string\"\n ? keyToTaggedId(other, value as string)\n : toTaggedId(other, value as string | number);\n }\n }\n if (!column.codec.mapToDbValue)\n fail(`The codec for ${meta.type}.${column.columnName} does not support SQL value writes`);\n return { sql: \"?\", bindings: [column.mapToDbValue(value)], refs: [] };\n}\n\n/** Checks the user predicate independently so metadata filters cannot turn a pruned guard into consent. */\nfunction mutationCondition(value: unknown, ctx: Ctx): SqlFragment | undefined {\n if (isExpr(value)) return asNode(value).toSql(ctx);\n return conditionToSql(value as SqlCondition | undefined, ctx, true);\n}\n\n/** Only own enumerable POJO clauses count as input or explicit full-table consent. */\nfunction checkPojo(value: object, allowed: readonly PropertyKey[], description: string): void {\n if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)\n fail(`${description} must be a plain POJO`);\n for (const key of Reflect.ownKeys(value)) {\n if (!allowed.includes(key)) fail(`${description} does not support '${String(key)}'`);\n if (typeof key === \"string\" && !Object.prototype.propertyIsEnumerable.call(value, key))\n fail(`${description} requires enumerable fields`);\n }\n}\n"],"mappings":"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"}
|
package/build/execute.d.cts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.cts","names":[],"sources":["../src/execute.ts"],"mappings":"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"}
|
package/build/execute.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.mts","names":[],"sources":["../src/execute.ts"],"mappings":"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"}
|
package/build/execute.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","names":[],"sources":["../src/execute.ts"],"sourcesContent":["import { AliasAssigner } from \"./AliasAssigner.ts\";\nimport { type Column } from \"./columns.ts\";\nimport { type SqlCondition } from \"./conditions.ts\";\nimport { type DriverQueryResult } from \"./drivers/Driver.ts\";\nimport { type Entity, isEntity } from \"./Entity.ts\";\nimport { type IdOf } from \"./EntityManager.ts\";\nimport { type EntityMetadata } from \"./EntityMetadata.ts\";\nimport { type ExprBrand, type ExprLike, type SqlFragment, asNode, exprBrand, isExpr } from \"./Expr.ts\";\nimport { keyToTaggedId, toTaggedId } from \"./keys.ts\";\nimport { kq, safeKq } from \"./keywords.ts\";\nimport {\n type CheckReadQuery,\n type CheckScope,\n type CheckSetQuery,\n Ctx,\n type EntityHydrator,\n type NameOf,\n type Plan,\n type Query,\n type QueryJoins,\n type QueryRow,\n type ReadQueryRow,\n type SetOperand,\n type SetOperation,\n type SetQuery,\n type Subquery,\n type WithInput,\n conditionToSql,\n entityQueryBrand,\n injectedConditions,\n isReadQueryValue,\n parseNestedQuery,\n parseUserQuery,\n projectionToSql,\n pruneCtes,\n registerCtes,\n subqueryBrand,\n withFragment,\n} from \"./query.ts\";\nimport { type TableFor, getTableMgmt, isTable, tableMgmt } from \"./Tables.ts\";\nimport { type ColumnsOf, type TypeMapEntry } from \"./typeMap.ts\";\nimport { fail } from \"./utils.ts\";\n\n/** The native command count and decoded rows from one immediate SQL statement. */\nexport interface ExecuteResult<R> {\n rowCount: number;\n rows: R[];\n}\n\n/** A mutation's RETURNING projection: one SQL expression or a named object of expressions. */\nexport type MutationReturning = (ExprLike<unknown> | Readonly<Record<string, ExprLike<unknown>>>) & {\n readonly [tableMgmt]?: never;\n readonly [subqueryBrand]?: never;\n readonly [entityQueryBrand]?: never;\n};\n\n/** SQL INSERT inputs, based on physical storage rather than entity creation options. */\nexport type InsertValues<T extends Entity> = {\n [K in RequiredInsertKey<T>]: Assignment<T, K>;\n} & {\n [K in Exclude<InsertKey<T>, RequiredInsertKey<T>>]?: Assignment<T, K> | undefined;\n};\n\n/** SQL UPDATE inputs include persisted derived columns, but never primary keys. */\nexport type UpdateValues<T extends Entity> = {\n [K in UpdateKey<T>]?: Assignment<T, K> | undefined;\n};\n\n/** A reusable INSERT POJO; use a concrete Q for annotated INSERT SELECT source checking. */\nexport type InsertStatement<\n T extends Entity,\n R extends MutationReturning | undefined = MutationReturning | undefined,\n Q extends SetOperand = Query<InsertProjection<T>, []> | Subquery<InsertSourceRow<T>, string>,\n> = {\n readonly insert: MutationTarget<T>;\n readonly returning?: R;\n readonly update?: never;\n readonly delete?: never;\n readonly set?: never;\n readonly where?: never;\n readonly allowAll?: never;\n readonly softDeletes?: never;\n /** CTEs to add to a `WITH` before the INSERT; see `Clauses.with`. */\n readonly with?: WithInput;\n} & NoMutationReadClauses &\n (\n | { readonly values: InsertValues<T> | readonly InsertValues<T>[]; readonly from?: never }\n | { readonly from: Q & CheckInsertSource<T, Q>; readonly values?: never }\n );\n\n/** A reusable guarded UPDATE POJO. Undefined assignments leave existing columns unchanged. */\nexport type UpdateStatement<\n T extends Entity,\n R extends MutationReturning | undefined = MutationReturning | undefined,\n> = {\n readonly update: MutationTarget<T>;\n readonly set: UpdateValues<T>;\n readonly returning?: R;\n readonly insert?: never;\n readonly delete?: never;\n readonly values?: never;\n readonly from?: never;\n /** CTEs to add to a `WITH` before the UPDATE; see `Clauses.with`. */\n readonly with?: WithInput;\n} & MutationFilter &\n NoMutationReadClauses;\n\n/** A reusable guarded physical DELETE POJO, not an ORM soft delete. */\nexport type DeleteStatement<\n T extends Entity,\n R extends MutationReturning | undefined = MutationReturning | undefined,\n> = {\n readonly delete: MutationTarget<T>;\n readonly returning?: R;\n readonly insert?: never;\n readonly update?: never;\n readonly values?: never;\n readonly from?: never;\n readonly set?: never;\n /** CTEs to add to a `WITH` before the DELETE; see `Clauses.with`. */\n readonly with?: WithInput;\n} & MutationFilter &\n NoMutationReadClauses;\n\n/** Public statement annotations retain the target's physical field policy. */\nexport type MutationStatement<\n T extends Entity,\n R extends MutationReturning | undefined = MutationReturning | undefined,\n> = InsertStatement<T, R> | UpdateStatement<T, R> | DeleteStatement<T, R>;\n\n/** Inference starts with the literal POJO; CheckMutation checks its target and every supplied key. */\nexport type MutationInput = (\n | { readonly insert: TableFor<Entity>; readonly values: object | readonly object[]; readonly from?: never }\n | { readonly insert: TableFor<Entity>; readonly from: SetOperand; readonly values?: never }\n | { readonly update: TableFor<Entity>; readonly set: object }\n | { readonly delete: TableFor<Entity> }\n) & { readonly returning?: MutationReturning; readonly with?: WithInput } & MutationFilter;\n\n/** Without RETURNING the row type is never; scalar expressions produce scalar rows. */\nexport type MutationRow<M> = M extends { readonly returning?: infer R }\n ? R extends MutationReturning\n ? R extends ExprLike<unknown>\n ? QueryRow<R>\n : { -readonly [K in keyof QueryRow<R>]: QueryRow<R>[K] }\n : never\n : never;\n\n/** Checks nonliteral statements as well as fresh literals without widening their inferred result. */\nexport type CheckMutation<M> = M extends unknown\n ? TargetEntity<M> extends infer T extends Entity\n ? TypeMapEntry<T, \"supportsEmExecute\"> extends true\n ? { readonly [K in keyof M]: K extends MutationClause<M> ? unknown : never } & {\n readonly returning?: M extends { readonly returning?: infer R }\n ? CheckReturning<R, NameOf<TargetTable<M>>>\n : never;\n } & (\n | (M extends { readonly values: infer V } ? { readonly values: CheckValues<T, V> } : never)\n | (M extends { readonly from: infer Q extends SetOperand }\n ? { readonly from: CheckInsertSource<T, Q> }\n : never)\n | (M extends { readonly set: infer V }\n ? { readonly set: CheckAssignments<V, UpdateValues<T>, NameOf<TargetTable<M>>> }\n : never)\n | (M extends { readonly delete: unknown } ? unknown : never)\n )\n : \"SQL mutations require a supported non-inherited target and regenerated metadata\"\n : never\n : never;\n\n/** Classifies mutation roots before EntityManager applies write permissions, including malformed roots. */\nexport function isMutation(arg: unknown): boolean {\n return (\n typeof arg === \"object\" &&\n arg !== null &&\n !isReadQueryValue(arg) &&\n [\"insert\", \"update\", \"delete\"].some((key) => key in arg)\n );\n}\n\n/**\n * Compiles one immediate statement using the read compiler's scopes, projections, and codecs.\n * INSERT SELECT keeps source rows in PostgreSQL; only RETURNING rows pass through JS decoders.\n * An undefined plan represents a validated standalone empty VALUES array, not DEFAULT VALUES.\n */\nexport function parseStatement(arg: unknown): Plan | undefined {\n if (!isMutation(arg)) return parseUserQuery(arg);\n const statement = arg as Record<string, unknown>;\n const roots = [\"insert\", \"update\", \"delete\"].filter((key) => key in statement);\n if (roots.length !== 1) fail(\"A mutation requires exactly one insert, update, or delete root\");\n const operation = roots[0];\n const allowed =\n operation === \"insert\"\n ? [\"insert\", \"values\", \"from\", \"returning\", \"with\"]\n : [\n operation,\n \"where\",\n \"allowAll\",\n \"softDeletes\",\n \"returning\",\n \"with\",\n ...(operation === \"update\" ? [\"set\"] : []),\n ];\n checkPojo(statement, allowed, `SQL ${operation}`);\n const target = statement[operation];\n if (!isTable(target)) fail(\"A mutation target must be an entity table\");\n const mgmt = getTableMgmt(target);\n const meta = mgmt.meta;\n if (meta.inheritanceType || meta.baseType || meta.baseTypes.length || meta.subTypes.length) {\n fail(\"SQL mutations do not support CTI/STI targets or inherited table families\");\n }\n if (meta.supportsEmExecute !== true)\n fail(`SQL mutations require supported physical metadata for ${meta.type}; run codegen`);\n const fields = Object.entries(meta.columns);\n for (const [, field] of fields) {\n requireColumnMetadata(meta, field);\n }\n const assigner = new AliasAssigner();\n // A CTE is in scope for the whole statement, so its scope is the parent of every other one here. It\n // deliberately holds no target alias, which is what lets INSERT VALUES cells and the INSERT SELECT\n // source read the CTEs without also seeing the row being written.\n const withCtx = new Ctx(assigner, undefined);\n const ctes = registerCtes(statement, withCtx, assigner);\n // Aliases the rest of the statement reads, so an unread CTE prunes like it does on a read query.\n const refs: string[] = [];\n const ctx = new Ctx(assigner, withCtx);\n const alias = assigner.getAlias(meta.tableName);\n ctx.register(mgmt, alias);\n const returning = statement.returning === undefined ? undefined : projectionToSql(statement.returning, ctx);\n if (returning) for (const select of returning.selects) refs.push(...select.refs);\n let sql = `${operation === \"delete\" ? \"DELETE FROM\" : operation.toUpperCase() + (operation === \"insert\" ? \" INTO\" : \"\")} ${kq(meta.tableName)} AS ${kq(alias)}`;\n const bindings: unknown[] = [];\n if (operation === \"insert\") {\n if (\"values\" in statement === \"from\" in statement) fail(\"INSERT requires exactly one of values or from\");\n const required = fields.filter(([, column]) => column.insert === \"required\");\n if (\"values\" in statement) {\n const rows = Array.isArray(statement.values) ? statement.values : [statement.values];\n // A VALUES cell *is* the new row, so there is no existing row for it to read: this scope skips\n // the `ctx.register(mgmt, alias)` above, so a cell naming the target fails instead of emitting a\n // `b` with no FROM clause. I.e. an UPDATE can say `set: { title: b.title }`; an INSERT cannot.\n // A value subquery still works, because it brings its own sources, and the parent here is the CTE\n // scope rather than `ctx`, so a cell can read a `with` entry but not the row being written.\n const valuesCtx = new Ctx(assigner, withCtx);\n const entries = rows.map((row) => assignments(meta, row, \"insert\"));\n for (const row of entries) {\n for (const [key] of required) {\n if (!row.some((entry) => entry[0] === key)) fail(`INSERT requires ${meta.type}.${key}`);\n }\n }\n if (rows.length === 0) return undefined;\n const keys = fields.filter(([key]) => entries.some((row) => row.some((entry) => entry[0] === key)));\n sql += ` (${keys.map(([, field]) => kq(field.columnName)).join(\", \")}) VALUES `;\n sql += entries\n .map((row) => {\n const cells = keys.map(([key, field]) => {\n const entry = row.find((entry) => entry[0] === key);\n if (!entry) return \"DEFAULT\";\n const cell = assignmentToSql(meta, field, entry[1], valuesCtx);\n bindings.push(...cell.bindings);\n refs.push(...cell.refs);\n return cell.sql;\n });\n return `(${cells.join(\", \")})`;\n })\n .join(\", \");\n } else {\n const source = parseNestedQuery(statement.from, withCtx, assigner);\n if (source.output.kind !== \"pojo\") fail(\"INSERT SELECT requires named POJO output columns\");\n const columns = source.output.columns;\n for (const [key] of required) {\n if (!columns.some((column) => column[0] === key)) fail(`INSERT requires ${meta.type}.${key}`);\n }\n for (const [key, expr] of columns) {\n const field = writableField(meta, key, \"insert\");\n const left = field.outputType;\n const right = expr.outputType;\n if (\n !left ||\n !right ||\n left.dbType !== right.dbType ||\n left.domain !== right.domain ||\n left.idMeta !== right.idMeta\n ) {\n fail(`INSERT SELECT ${meta.type}.${key} has incompatible or unknown storage codecs`);\n }\n if (!field.sqlNullable && expr.sqlNullable === true)\n fail(`INSERT SELECT ${meta.type}.${key} cannot accept a nullable output`);\n }\n const keys = fields.filter(([key]) => columns.some((column) => column[0] === key));\n const sourceAlias = safeKq(assigner.getLiteralAlias(\"sq\"));\n sql += ` (${keys.map(([, field]) => kq(field.columnName)).join(\", \")}) SELECT ${keys.map(([key]) => `${sourceAlias}.${safeKq(key)}`).join(\", \")} FROM (${source.sql}) AS ${sourceAlias}`;\n bindings.push(...source.bindings);\n refs.push(...source.outerRefs);\n }\n } else {\n if (statement.allowAll !== undefined && typeof statement.allowAll !== \"boolean\") fail(\"allowAll must be a boolean\");\n if (\n statement.softDeletes !== undefined &&\n statement.softDeletes !== \"include\" &&\n statement.softDeletes !== \"exclude\"\n )\n fail(\"softDeletes must be 'include' or 'exclude'\");\n const user = mutationCondition(statement.where, ctx);\n if (!user && statement.allowAll !== true) fail(\"UPDATE and DELETE require a nonempty user where or allowAll: true\");\n if (operation === \"update\") {\n const entries = assignments(meta, statement.set, \"update\");\n sql +=\n \" SET \" +\n entries\n .map((entry) => {\n const [key, value] = entry;\n const field = writableField(meta, key, \"update\");\n const cell = assignmentToSql(meta, field, value, ctx);\n bindings.push(...cell.bindings);\n refs.push(...cell.refs);\n return `${kq(field.columnName)} = ${cell.sql}`;\n })\n .join(\", \");\n }\n const injected = conditionToSql(\n { and: injectedConditions({ meta, alias }, statement.softDeletes ?? \"exclude\") },\n ctx,\n true,\n );\n const conditions = [user, injected].filter((condition) => condition !== undefined);\n if (conditions.length) {\n sql += ` WHERE ${conditions.map((condition) => `(${condition.sql})`).join(\" AND \")}`;\n for (const condition of conditions) {\n bindings.push(...condition.bindings);\n refs.push(...condition.refs);\n }\n }\n }\n if (returning) {\n sql += ` RETURNING ${returning.selects.map((select) => select.sql).join(\", \")}`;\n for (const select of returning.selects) bindings.push(...select.bindings);\n }\n const keptCtes = pruneCtes(ctes, new Set(refs));\n if (keptCtes.length > 0) {\n const clause = withFragment(keptCtes);\n sql = clause.sql + sql;\n bindings.unshift(...clause.bindings);\n }\n return {\n sql,\n bindings,\n outerRefs: [],\n output: returning?.output ?? { kind: \"pojo\", columns: [] },\n decodeRows: returning?.decodeRows ?? (() => []),\n };\n}\n\n/** Retains native counts even when no rows return, and propagates decoding failures after execution. */\nexport function decodeStatementResult(\n em: EntityHydrator,\n plan: Plan,\n result: DriverQueryResult,\n): ExecuteResult<unknown> {\n if (typeof result.rowCount !== \"number\" || !Number.isInteger(result.rowCount) || result.rowCount < 0)\n fail(\"The driver did not return a numeric command rowCount\");\n return { rowCount: result.rowCount, rows: plan.decodeRows(em, result.rows) };\n}\n\ntype MutationTarget<T extends Entity> = TableFor<T> &\n (TypeMapEntry<T, \"supportsEmExecute\"> extends true ? unknown : never);\ntype MutationFilter = {\n readonly where?: SqlCondition | ExprLike<boolean>;\n readonly allowAll?: boolean;\n readonly softDeletes?: \"include\" | \"exclude\";\n};\ntype NoMutationReadClauses = Partial<\n Record<\n | \"select\"\n | \"join\"\n | \"groupBy\"\n | \"having\"\n | \"orderBy\"\n | \"limit\"\n | \"offset\"\n | \"distinct\"\n | \"pruneJoins\"\n | \"as\"\n | \"union\"\n | \"unionAll\"\n | \"intersect\"\n | \"intersectAll\"\n | \"except\"\n | \"exceptAll\"\n | \"ctes\"\n | \"using\"\n | \"onConflict\",\n never\n >\n>;\n/** Column keys allowed in INSERT, i.e. Book's optional `id` and required `authorId`. */\ntype InsertKey<T> = {\n [K in keyof ColumnsOf<T>]: ColumnsOf<T>[K] extends { insert: \"required\" | \"optional\" } ? K : never;\n}[keyof ColumnsOf<T>];\n/** Column keys that each INSERT row must supply, i.e. Book's `authorId` despite its ORM default. */\ntype RequiredInsertKey<T> = {\n [K in keyof ColumnsOf<T>]: ColumnsOf<T>[K] extends { insert: \"required\" } ? K : never;\n}[keyof ColumnsOf<T>];\n/** Column keys allowed in UPDATE SET, i.e. Book's `title` and `authorId`, but not `id`. */\ntype UpdateKey<T> = {\n [K in keyof ColumnsOf<T>]: ColumnsOf<T>[K] extends { update: true } ? K : never;\n}[keyof ColumnsOf<T>];\n/** A column's domain value before SQL nullability is added, i.e. Book's `id` is BookId and `authorId` is AuthorId. */\ntype DomainValue<T, K extends keyof ColumnsOf<T>> = K extends \"id\"\n ? IdOf<T>\n : ColumnsOf<T>[K] extends { entity: infer U }\n ? IdOf<U>\n : ColumnsOf<T>[K] extends { type: infer V }\n ? V\n : never;\ntype SqlValue<T, K extends keyof ColumnsOf<T>> =\n | DomainValue<T, K>\n | (ColumnsOf<T>[K] extends { nullable: true } ? null : never);\ntype Assignment<T, K extends keyof ColumnsOf<T>> =\n | SqlValue<T, K>\n | ExprLike<SqlValue<T, K>>\n | (K extends \"id\" ? never : ColumnsOf<T>[K] extends { entity: infer U } ? U : never);\ntype InsertSourceRow<T> = { [K in RequiredInsertKey<T>]: SqlValue<T, K> } & {\n [K in Exclude<InsertKey<T>, RequiredInsertKey<T>>]?: SqlValue<T, K>;\n};\ntype InsertProjection<T> = { [K in RequiredInsertKey<T>]: ExprLike<SqlValue<T, K>> } & {\n [K in Exclude<InsertKey<T>, RequiredInsertKey<T>>]?: ExprLike<SqlValue<T, K>>;\n};\ntype UnionKeys<V> = V extends unknown ? keyof V : never;\n/** Collects every alternative before scope checking; a valid branch cannot hide an unrelated alias. */\ntype UnionValue<V, K extends PropertyKey> = V extends unknown ? (K extends keyof V ? V[K] : never) : never;\ntype ExprSource<V> = V extends { readonly [exprBrand]: ExprBrand<unknown, infer Src> } ? Src : never;\ntype CheckExprScope<V, Scope> =\n string extends ExprSource<V>\n ? unknown\n : [Exclude<ExprSource<V>, Scope>] extends [never]\n ? unknown\n : \"Expression source is not in the statement scope\";\ntype ReturningExpr<R> = R extends ExprLike<unknown> ? R : R extends undefined ? never : R[keyof R];\ntype EmptyReturning<R> = R extends object ? (keyof R extends never ? true : false) : false;\ntype CheckReturning<R, Scope> = true extends EmptyReturning<R> ? never : CheckExprScope<ReturningExpr<R>, Scope>;\ntype CheckAssignments<V, Allowed, Scope> = [Exclude<UnionKeys<V>, keyof Allowed>] extends [never]\n ? Allowed & {\n [K in UnionKeys<V>]?: CheckExprScope<UnionValue<V, K>, Scope>;\n }\n : \"SQL assignments have unknown target fields\";\ntype CheckValues<T extends Entity, V> =\n | ([Extract<V, readonly unknown[]>] extends [never]\n ? never\n : readonly CheckAssignments<Extract<V, readonly unknown[]>[number], InsertValues<T>, never>[])\n | ([Exclude<V, readonly unknown[]>] extends [never]\n ? never\n : CheckAssignments<Exclude<V, readonly unknown[]>, InsertValues<T>, never>);\ntype CheckSourceScope<Q> = Q extends { readonly select: infer S; readonly from: infer F }\n ? CheckScope<S, F, \"join\" extends keyof Q ? Extract<Q[keyof Q & \"join\"], QueryJoins> : []>\n : {\n [K in keyof Q]: K extends SetOperation\n ? Q[K] extends readonly unknown[]\n ? { [I in keyof Q[K]]: CheckSourceScope<Q[K][I]> }\n : unknown\n : unknown;\n };\ntype CheckInsertSource<T, Q extends SetOperand> = SetOperand extends Q\n ? \"INSERT source was typed too generically; retain its named output fields\"\n : ReadQueryRow<Q> extends InsertSourceRow<T>\n ? Exclude<UnionKeys<ReadQueryRow<Q>>, InsertKey<T>> extends never\n ? CheckReadQuery<Q> &\n CheckSourceScope<Q> &\n (Q extends SetQuery<readonly SetOperand[]> ? CheckSetQuery<Q> : unknown)\n : \"INSERT SELECT has unknown target fields\"\n : \"INSERT SELECT requires compatible values for all SQL-required fields\";\ntype TargetEntity<M> = M extends\n | { readonly insert: TableFor<infer T> }\n | { readonly update: TableFor<infer T> }\n | { readonly delete: TableFor<infer T> }\n ? T\n : never;\ntype TargetTable<M> = M extends\n | { readonly insert: infer A }\n | { readonly update: infer A }\n | { readonly delete: infer A }\n ? A\n : never;\ntype MutationClause<M> =\n | \"returning\"\n | \"with\"\n | (M extends { readonly insert: unknown }\n ? \"insert\" | (M extends { readonly values: unknown } ? \"values\" : \"from\")\n : \"where\" | \"allowAll\" | \"softDeletes\" | (M extends { readonly update: unknown } ? \"update\" | \"set\" : \"delete\"));\n/** SQL mutations require complete physical metadata. */\nfunction requireColumnMetadata(meta: EntityMetadata, column: Column): void {\n if (\n typeof column.sqlNullable !== \"boolean\" ||\n typeof column.hasDefault !== \"boolean\" ||\n typeof column.isGenerated !== \"boolean\"\n )\n fail(`Missing physical metadata for ${meta.type}.${column.columnName}; run codegen`);\n}\n\n/** Validates every supplied key, including undefined fields, before pruning omitted values. */\nfunction assignments(meta: EntityMetadata, value: unknown, operation: \"insert\" | \"update\"): [string, unknown][] {\n if (!value || typeof value !== \"object\" || Array.isArray(value) || isExpr(value) || isEntity(value))\n fail(`${operation} assignments must be a field POJO`);\n const entries = Object.entries(value);\n for (const [key] of entries) writableField(meta, key, operation);\n checkPojo(value, Object.keys(meta.columns), `${operation} assignments`);\n const defined = entries.filter((entry) => entry[1] !== undefined);\n if (!defined.length) fail(`${operation} requires at least one defined field; empty rows/sets are not DEFAULT VALUES`);\n return defined;\n}\n\n/** Applies physical write restrictions, not ORM-derived, protected, or business-immutable flags. */\nfunction writableField(meta: EntityMetadata, key: string, operation: \"insert\" | \"update\"): Column {\n const column = Object.hasOwn(meta.columns, key) ? meta.columns[key] : undefined;\n if (!column) fail(`Unsupported SQL mutation field ${meta.type}.${key}`);\n requireColumnMetadata(meta, column);\n if (operation === \"update\" && key === \"id\") fail(\"UPDATE primary-key assignments are not supported\");\n if (column.isGenerated) fail(`Generated field ${meta.type}.${key} is omit-only`);\n if (operation === \"update\" ? !column.update : column.insert === \"never\")\n fail(`Unsupported SQL mutation field ${meta.type}.${key}`);\n return column;\n}\n\n/**\n * Classifies SQL expressions and SQL NULL before invoking the column's entity-independent write codec.\n * Normalizes public PK/FK ids to internal tagged ids using the target entity's idType.\n */\nfunction assignmentToSql(meta: EntityMetadata, column: Column, value: unknown, ctx: Ctx): SqlFragment {\n if (isExpr(value)) return asNode(value).toSql(ctx);\n if (value === null) {\n if (!column.sqlNullable) fail(`${meta.type}.${column.columnName} is physically NOT NULL`);\n return { sql: \"NULL\", bindings: [], refs: [] };\n }\n if (column.idMetadata) {\n const other = column.idMetadata();\n if (isEntity(value)) {\n if (column.columnName === \"id\" || !(value instanceof other.cstr)) fail(`Expected a ${other.type} reference`);\n if (value.isNewEntity || value.idTaggedMaybe === undefined)\n fail(`Cannot reference an unflushed ${other.type}, even with an assigned ID`);\n value = value.idTaggedMaybe;\n } else if (typeof value !== (other.idType === \"number\" ? \"number\" : \"string\")) {\n fail(`Expected a persisted ${other.type} or its ID; nested creation is not supported`);\n } else {\n // Public untagged TEXT ids may contain delimiters or start with the entity tag.\n value =\n other.idType === \"untagged-string\"\n ? keyToTaggedId(other, value as string)\n : toTaggedId(other, value as string | number);\n }\n }\n if (!column.codec.mapToDbValue)\n fail(`The codec for ${meta.type}.${column.columnName} does not support SQL value writes`);\n return { sql: \"?\", bindings: [column.mapToDbValue(value)], refs: [] };\n}\n\n/** Checks the user predicate independently so metadata filters cannot turn a pruned guard into consent. */\nfunction mutationCondition(value: unknown, ctx: Ctx): SqlFragment | undefined {\n if (isExpr(value)) return asNode(value).toSql(ctx);\n return conditionToSql(value as SqlCondition | undefined, ctx, true);\n}\n\n/** Only own enumerable POJO clauses count as input or explicit full-table consent. */\nfunction checkPojo(value: object, allowed: readonly PropertyKey[], description: string): void {\n if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)\n fail(`${description} must be a plain POJO`);\n for (const key of Reflect.ownKeys(value)) {\n if (!allowed.includes(key)) fail(`${description} does not support '${String(key)}'`);\n if (typeof key === \"string\" && !Object.prototype.propertyIsEnumerable.call(value, key))\n fail(`${description} requires enumerable fields`);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"arrayAgg.cjs","names":["BaseExpr","parseExpression","expressionToSql","joinFragments","orderByToSql","isObject"],"sources":["../../src/expressions/arrayAgg.ts"],"sourcesContent":["import {\n type ArrayAggOptions,\n BaseExpr,\n type ExprContext,\n type ExprLike,\n type SqlFragment,\n joinFragments,\n orderByToSql,\n} from \"../Expr.ts\";\nimport { expressionToSql } from \"./expression.ts\";\nimport { checkKeys, isObject, parseExpression } from \"./parseExpression.ts\";\nimport type { ParsedExpression, ResultCodec } from \"./types.ts\";\n\n/** The aggregate value alone, or the value together with PostgreSQL aggregate options. */\nexport interface ArrayAggInput {\n readonly arrayAgg: ExprLike<unknown> | ArrayAggExpressionOptions;\n}\n\n/** Options for an inline ARRAY_AGG expression. */\nexport interface ArrayAggExpressionOptions extends ArrayAggOptions {\n readonly value: unknown;\n}\n\n/** An ARRAY_AGG value and its aggregate options. */\nexport interface ParsedArrayAggExpression {\n kind: \"arrayAgg\";\n value: ParsedExpression;\n options?: ArrayAggOptions;\n}\n\n/** Parses compact and expanded ARRAY_AGG inputs. */\nexport function parseArrayAggExpression(input: unknown): ParsedArrayAggExpression {\n if (input instanceof BaseExpr || !isArrayAggOptions(input)) {\n return { kind: \"arrayAgg\", value: parseExpression(input) };\n }\n checkKeys(input, [\"value\", \"distinct\", \"orderBy\", \"filter\"]);\n if (!(\"value\" in input)) throw new Error(\"ARRAY_AGG options need a value\");\n if (input.distinct !== undefined && typeof input.distinct !== \"boolean\") {\n throw new Error(\"ARRAY_AGG distinct must be a boolean\");\n }\n if (input.orderBy !== undefined && !Array.isArray(input.orderBy)) {\n throw new Error(\"ARRAY_AGG orderBy must be an array\");\n }\n return {\n kind: \"arrayAgg\",\n value: parseExpression(input.value),\n options: {\n distinct: input.distinct as boolean | undefined,\n orderBy: input.orderBy as ArrayAggOptions[\"orderBy\"],\n filter: input.filter as ArrayAggOptions[\"filter\"],\n },\n };\n}\n\n/** Renders ARRAY_AGG's value, ordering, and filter in SQL binding order. */\nexport function arrayAggToSql(\n parsed: ParsedArrayAggExpression,\n ctx: ExprContext,\n valueCodec: ResultCodec,\n): SqlFragment {\n const value = expressionToSql(parsed.value, ctx, valueCodec);\n const ordering = joinFragments(\n (parsed.options?.orderBy ?? []).flatMap((entry) => {\n if (entry === undefined) return [];\n const fragment = orderByToSql(entry, ctx);\n return fragment ? [fragment] : [];\n }),\n \", \",\n );\n const filter = parsed.options?.filter;\n const condition = filter === undefined ? undefined : ctx.conditionToSql(filter);\n return {\n sql: `array_agg(${parsed.options?.distinct ? \"DISTINCT \" : \"\"}${value.sql}${ordering.sql ? ` ORDER BY ${ordering.sql}` : \"\"})${condition ? ` FILTER (WHERE ${condition.sql})` : \"\"}`,\n bindings: [...value.bindings, ...ordering.bindings, ...(condition?.bindings ?? [])],\n refs: [...value.refs, ...ordering.refs, ...(condition?.refs ?? [])],\n };\n}\n\n/** Distinguishes expanded options from nested object expressions. */\nfunction isArrayAggOptions(input: unknown): input is Record<string, unknown> {\n return isObject(input) && (\"value\" in input || \"distinct\" in input || \"orderBy\" in input || \"filter\" in input);\n}\n"],"mappings":";;;;;;AA+BA,SAAgB,wBAAwB,OAA0C;CAChF,IAAI,iBAAiBA,aAAAA,YAAY,CAAC,kBAAkB,KAAK,GACvD,OAAO;EAAE,MAAM;EAAY,OAAOC,oCAAAA,gBAAgB,KAAK;CAAE;CAE3D,oCAAA,UAAU,OAAO;EAAC;EAAS;EAAY;EAAW;CAAQ,CAAC;CAC3D,IAAI,EAAE,WAAW,QAAQ,MAAM,IAAI,MAAM,gCAAgC;CACzE,IAAI,MAAM,aAAa,KAAA,KAAa,OAAO,MAAM,aAAa,WAC5D,MAAM,IAAI,MAAM,sCAAsC;CAExD,IAAI,MAAM,YAAY,KAAA,KAAa,CAAC,MAAM,QAAQ,MAAM,OAAO,GAC7D,MAAM,IAAI,MAAM,oCAAoC;CAEtD,OAAO;EACL,MAAM;EACN,OAAOA,oCAAAA,gBAAgB,MAAM,KAAK;EAClC,SAAS;GACP,UAAU,MAAM;GAChB,SAAS,MAAM;GACf,QAAQ,MAAM;EAChB;CACF;AACF;;AAGA,SAAgB,cACd,QACA,KACA,YACa;CACb,MAAM,QAAQC,+BAAAA,gBAAgB,OAAO,OAAO,KAAK,UAAU;CAC3D,MAAM,WAAWC,aAAAA,eACd,OAAO,SAAS,WAAW,CAAC,EAAA,CAAG,SAAS,UAAU;EACjD,IAAI,UAAU,KAAA,GAAW,OAAO,CAAC;EACjC,MAAM,WAAWC,aAAAA,aAAa,OAAO,GAAG;EACxC,OAAO,WAAW,CAAC,QAAQ,IAAI,CAAC;CAClC,CAAC,GACD,IACF;CACA,MAAM,SAAS,OAAO,SAAS;CAC/B,MAAM,YAAY,WAAW,KAAA,IAAY,KAAA,IAAY,IAAI,eAAe,MAAM;CAC9E,OAAO;EACL,KAAK,aAAa,OAAO,SAAS,WAAW,cAAc,KAAK,MAAM,MAAM,SAAS,MAAM,aAAa,SAAS,QAAQ,GAAG,GAAG,YAAY,kBAAkB,UAAU,IAAI,KAAK;EAChL,UAAU;GAAC,GAAG,MAAM;GAAU,GAAG,SAAS;GAAU,GAAI,WAAW,YAAY,CAAC;EAAE;EAClF,MAAM;GAAC,GAAG,MAAM;GAAM,GAAG,SAAS;GAAM,GAAI,WAAW,QAAQ,CAAC;EAAE;CACpE;AACF;;AAGA,SAAS,kBAAkB,OAAkD;CAC3E,OAAOC,oCAAAA,SAAS,KAAK,MAAM,WAAW,SAAS,cAAc,SAAS,aAAa,SAAS,YAAY;AAC1G"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"arrayAgg.d.cts","names":[],"sources":["../../src/expressions/arrayAgg.ts"],"mappings":";;;;UAciB;WACN,UAAU,oBAAoB;;;UAIxB,kCAAkC;WACxC;;;UAIM;EACf;EACA,OAAO;EACP,UAAU;;;iBAII,wBAAwB,iBAAiB;;iBAwBzC,cACd,QAAQ,0BACR,KAAK,aACL,YAAY,cACX"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"arrayAgg.d.mts","names":[],"sources":["../../src/expressions/arrayAgg.ts"],"mappings":";;;;UAciB;WACN,UAAU,oBAAoB;;;UAIxB,kCAAkC;WACxC;;;UAIM;EACf;EACA,OAAO;EACP,UAAU;;;iBAII,wBAAwB,iBAAiB;;iBAwBzC,cACd,QAAQ,0BACR,KAAK,aACL,YAAY,cACX"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"arrayAgg.js","names":[],"sources":["../../src/expressions/arrayAgg.ts"],"sourcesContent":["import {\n type ArrayAggOptions,\n BaseExpr,\n type ExprContext,\n type ExprLike,\n type SqlFragment,\n joinFragments,\n orderByToSql,\n} from \"../Expr.ts\";\nimport { expressionToSql } from \"./expression.ts\";\nimport { checkKeys, isObject, parseExpression } from \"./parseExpression.ts\";\nimport type { ParsedExpression, ResultCodec } from \"./types.ts\";\n\n/** The aggregate value alone, or the value together with PostgreSQL aggregate options. */\nexport interface ArrayAggInput {\n readonly arrayAgg: ExprLike<unknown> | ArrayAggExpressionOptions;\n}\n\n/** Options for an inline ARRAY_AGG expression. */\nexport interface ArrayAggExpressionOptions extends ArrayAggOptions {\n readonly value: unknown;\n}\n\n/** An ARRAY_AGG value and its aggregate options. */\nexport interface ParsedArrayAggExpression {\n kind: \"arrayAgg\";\n value: ParsedExpression;\n options?: ArrayAggOptions;\n}\n\n/** Parses compact and expanded ARRAY_AGG inputs. */\nexport function parseArrayAggExpression(input: unknown): ParsedArrayAggExpression {\n if (input instanceof BaseExpr || !isArrayAggOptions(input)) {\n return { kind: \"arrayAgg\", value: parseExpression(input) };\n }\n checkKeys(input, [\"value\", \"distinct\", \"orderBy\", \"filter\"]);\n if (!(\"value\" in input)) throw new Error(\"ARRAY_AGG options need a value\");\n if (input.distinct !== undefined && typeof input.distinct !== \"boolean\") {\n throw new Error(\"ARRAY_AGG distinct must be a boolean\");\n }\n if (input.orderBy !== undefined && !Array.isArray(input.orderBy)) {\n throw new Error(\"ARRAY_AGG orderBy must be an array\");\n }\n return {\n kind: \"arrayAgg\",\n value: parseExpression(input.value),\n options: {\n distinct: input.distinct as boolean | undefined,\n orderBy: input.orderBy as ArrayAggOptions[\"orderBy\"],\n filter: input.filter as ArrayAggOptions[\"filter\"],\n },\n };\n}\n\n/** Renders ARRAY_AGG's value, ordering, and filter in SQL binding order. */\nexport function arrayAggToSql(\n parsed: ParsedArrayAggExpression,\n ctx: ExprContext,\n valueCodec: ResultCodec,\n): SqlFragment {\n const value = expressionToSql(parsed.value, ctx, valueCodec);\n const ordering = joinFragments(\n (parsed.options?.orderBy ?? []).flatMap((entry) => {\n if (entry === undefined) return [];\n const fragment = orderByToSql(entry, ctx);\n return fragment ? [fragment] : [];\n }),\n \", \",\n );\n const filter = parsed.options?.filter;\n const condition = filter === undefined ? undefined : ctx.conditionToSql(filter);\n return {\n sql: `array_agg(${parsed.options?.distinct ? \"DISTINCT \" : \"\"}${value.sql}${ordering.sql ? ` ORDER BY ${ordering.sql}` : \"\"})${condition ? ` FILTER (WHERE ${condition.sql})` : \"\"}`,\n bindings: [...value.bindings, ...ordering.bindings, ...(condition?.bindings ?? [])],\n refs: [...value.refs, ...ordering.refs, ...(condition?.refs ?? [])],\n };\n}\n\n/** Distinguishes expanded options from nested object expressions. */\nfunction isArrayAggOptions(input: unknown): input is Record<string, unknown> {\n return isObject(input) && (\"value\" in input || \"distinct\" in input || \"orderBy\" in input || \"filter\" in input);\n}\n"],"mappings":";;;;;AA+BA,SAAgB,wBAAwB,OAA0C;CAChF,IAAI,iBAAiB,YAAY,CAAC,kBAAkB,KAAK,GACvD,OAAO;EAAE,MAAM;EAAY,OAAO,gBAAgB,KAAK;CAAE;CAE3D,UAAU,OAAO;EAAC;EAAS;EAAY;EAAW;CAAQ,CAAC;CAC3D,IAAI,EAAE,WAAW,QAAQ,MAAM,IAAI,MAAM,gCAAgC;CACzE,IAAI,MAAM,aAAa,KAAA,KAAa,OAAO,MAAM,aAAa,WAC5D,MAAM,IAAI,MAAM,sCAAsC;CAExD,IAAI,MAAM,YAAY,KAAA,KAAa,CAAC,MAAM,QAAQ,MAAM,OAAO,GAC7D,MAAM,IAAI,MAAM,oCAAoC;CAEtD,OAAO;EACL,MAAM;EACN,OAAO,gBAAgB,MAAM,KAAK;EAClC,SAAS;GACP,UAAU,MAAM;GAChB,SAAS,MAAM;GACf,QAAQ,MAAM;EAChB;CACF;AACF;;AAGA,SAAgB,cACd,QACA,KACA,YACa;CACb,MAAM,QAAQ,gBAAgB,OAAO,OAAO,KAAK,UAAU;CAC3D,MAAM,WAAW,eACd,OAAO,SAAS,WAAW,CAAC,EAAA,CAAG,SAAS,UAAU;EACjD,IAAI,UAAU,KAAA,GAAW,OAAO,CAAC;EACjC,MAAM,WAAW,aAAa,OAAO,GAAG;EACxC,OAAO,WAAW,CAAC,QAAQ,IAAI,CAAC;CAClC,CAAC,GACD,IACF;CACA,MAAM,SAAS,OAAO,SAAS;CAC/B,MAAM,YAAY,WAAW,KAAA,IAAY,KAAA,IAAY,IAAI,eAAe,MAAM;CAC9E,OAAO;EACL,KAAK,aAAa,OAAO,SAAS,WAAW,cAAc,KAAK,MAAM,MAAM,SAAS,MAAM,aAAa,SAAS,QAAQ,GAAG,GAAG,YAAY,kBAAkB,UAAU,IAAI,KAAK;EAChL,UAAU;GAAC,GAAG,MAAM;GAAU,GAAG,SAAS;GAAU,GAAI,WAAW,YAAY,CAAC;EAAE;EAClF,MAAM;GAAC,GAAG,MAAM;GAAM,GAAG,SAAS;GAAM,GAAI,WAAW,QAAQ,CAAC;EAAE;CACpE;AACF;;AAGA,SAAS,kBAAkB,OAAkD;CAC3E,OAAO,SAAS,KAAK,MAAM,WAAW,SAAS,cAAc,SAAS,aAAa,SAAS,YAAY;AAC1G"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"case.cjs","names":["isObject","parseExpression","joinFragments","expressionToSql","expressionNullable"],"sources":["../../src/expressions/case.ts"],"sourcesContent":["import { type ExprContext, type SqlFragment, joinFragments } from \"../Expr.ts\";\nimport type { QueryCondition } from \"../query.ts\";\nimport { expressionNullable, expressionToSql } from \"./expression.ts\";\nimport { checkKeys, isObject, parseExpression } from \"./parseExpression.ts\";\nimport type { CheckExpression, ParsedExpression, ResultCodec } from \"./types.ts\";\n\n/** One condition and the value to return when it is true. */\nexport interface CaseWhen {\n readonly when: QueryCondition | undefined;\n readonly then: unknown;\n readonly else?: never;\n}\n\n/** The fallback value, allowed only as the last entry in a CASE array. */\nexport interface CaseElse {\n readonly else: unknown;\n readonly when?: never;\n readonly then?: never;\n}\n\n/** A single WHEN or an ordered array of WHEN entries with an optional final ELSE. */\nexport interface CaseInput {\n readonly case: CaseWhen | readonly (CaseWhen | CaseElse)[];\n}\n\n/** The values returned by CASE's THEN and ELSE entries. */\nexport type CaseArmValue<A> = A extends readonly unknown[]\n ? CaseArmValue<A[number]>\n : A extends { readonly then: infer V }\n ? V\n : A extends { readonly else: infer V }\n ? V\n : never;\n\n/** A single CASE entry must be WHEN; an array can also have a final ELSE. */\nexport type CheckCase<A, R> = A extends readonly []\n ? \"CASE needs at least one arm\"\n : A extends readonly unknown[]\n ? { readonly [K in keyof A]: CheckCaseEntry<A[K], R> } & CheckCaseOrder<A>\n : A extends CaseWhen\n ? CheckCaseEntry<A, R>\n : never;\n\n/** Checks THEN/ELSE values and rejects extra keys on an entry. */\ntype CheckCaseEntry<A, R> = A extends CaseWhen\n ? { readonly [K in keyof A]: K extends \"then\" ? CheckExpression<A[K], R> : K extends \"when\" ? unknown : never }\n : A extends CaseElse\n ? { readonly [K in keyof A]: K extends \"else\" ? CheckExpression<A[K], R> : never }\n : never;\n\n/** Fixed CASE arrays can be checked now; dynamic arrays get the same checks at runtime. */\ntype CheckCaseOrder<A extends readonly unknown[], HasWhen extends boolean = false> = A extends readonly [\n infer H,\n ...infer T,\n]\n ? H extends { readonly else: unknown }\n ? HasWhen extends true\n ? T extends readonly []\n ? unknown\n : \"CASE ELSE must be last\"\n : \"CASE needs a WHEN arm before ELSE\"\n : CheckCaseOrder<T, true>\n : unknown;\n\n/** A CASE has at least one WHEN and an optional ELSE; no ELSE means SQL NULL. */\nexport interface ParsedCaseExpression {\n kind: \"case\";\n whens: [ParsedCaseWhen, ...ParsedCaseWhen[]];\n else?: ParsedExpression;\n}\n\n/** A CASE condition and its parsed result expression. */\ninterface ParsedCaseWhen {\n when: QueryCondition | undefined;\n then: ParsedExpression;\n}\n\n/**\n * Parses WHEN entries and an optional final ELSE into a ParsedCaseExpression.\n * Requires at least one WHEN, even if its condition may later be pruned.\n */\nexport function parseCaseExpression(input: unknown): ParsedCaseExpression {\n const entries = Array.isArray(input) ? input : [input];\n const whens: ParsedCaseWhen[] = [];\n let fallback: ParsedExpression | undefined;\n for (const [i, entry] of entries.entries()) {\n if (isObject(entry) && \"else\" in entry) {\n checkKeys(entry, [\"else\"]);\n if (whens.length === 0) throw new Error(\"CASE needs a WHEN arm before ELSE\");\n if (i !== entries.length - 1) throw new Error(\"CASE ELSE must be last\");\n fallback = parseExpression(entry.else);\n } else {\n if (!isObject(entry) || !(\"when\" in entry) || !(\"then\" in entry))\n throw new Error(\"A CASE arm needs when and then\");\n checkKeys(entry, [\"when\", \"then\"]);\n whens.push({ when: entry.when as QueryCondition | undefined, then: parseExpression(entry.then) });\n }\n }\n if (whens.length === 0) throw new Error(\"CASE needs at least one arm\");\n const [first, ...rest] = whens;\n return { kind: \"case\", whens: [first, ...rest], else: fallback };\n}\n\n/** Removes CASE entries with omitted conditions, falling back to ELSE or SQL NULL if none remain. */\nexport function caseToSql(parsed: ParsedCaseExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment {\n const parts: SqlFragment[] = [];\n for (const entry of parsed.whens) {\n const when = entry.when === undefined ? undefined : ctx.conditionToSql(entry.when);\n if (!when) continue;\n const branch = joinFragments([when, expressionToSql(entry.then, ctx, codec)], \" THEN \");\n parts.push({ ...branch, sql: `WHEN ${branch.sql}` });\n }\n const otherwise = expressionToSql(parsed.else ?? { kind: \"literal\", value: null }, ctx, codec);\n if (parts.length === 0) return otherwise;\n if (parsed.else) parts.push({ ...otherwise, sql: `ELSE ${otherwise.sql}` });\n const body = joinFragments(parts, \" \");\n return { ...body, sql: `(CASE ${body.sql} END)` };\n}\n\n/** CASE is definitely non-null only when every THEN value and the ELSE value are non-null. */\nexport function caseNullable(parsed: ParsedCaseExpression): boolean | undefined {\n return parsed.else &&\n expressionNullable(parsed.else) === false &&\n parsed.whens.every((entry) => expressionNullable(entry.then) === false)\n ? false\n : undefined;\n}\n"],"mappings":";;;;;;;;;AAiFA,SAAgB,oBAAoB,OAAsC;CACxE,MAAM,UAAU,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;CACrD,MAAM,QAA0B,CAAC;CACjC,IAAI;CACJ,KAAK,MAAM,CAAC,GAAG,UAAU,QAAQ,QAAQ,GACvC,IAAIA,oCAAAA,SAAS,KAAK,KAAK,UAAU,OAAO;EACtC,oCAAA,UAAU,OAAO,CAAC,MAAM,CAAC;EACzB,IAAI,MAAM,WAAW,GAAG,MAAM,IAAI,MAAM,mCAAmC;EAC3E,IAAI,MAAM,QAAQ,SAAS,GAAG,MAAM,IAAI,MAAM,wBAAwB;EACtE,WAAWC,oCAAAA,gBAAgB,MAAM,IAAI;CACvC,OAAO;EACL,IAAI,CAACD,oCAAAA,SAAS,KAAK,KAAK,EAAE,UAAU,UAAU,EAAE,UAAU,QACxD,MAAM,IAAI,MAAM,gCAAgC;EAClD,oCAAA,UAAU,OAAO,CAAC,QAAQ,MAAM,CAAC;EACjC,MAAM,KAAK;GAAE,MAAM,MAAM;GAAoC,MAAMC,oCAAAA,gBAAgB,MAAM,IAAI;EAAE,CAAC;CAClG;CAEF,IAAI,MAAM,WAAW,GAAG,MAAM,IAAI,MAAM,6BAA6B;CACrE,MAAM,CAAC,OAAO,GAAG,QAAQ;CACzB,OAAO;EAAE,MAAM;EAAQ,OAAO,CAAC,OAAO,GAAG,IAAI;EAAG,MAAM;CAAS;AACjE;;AAGA,SAAgB,UAAU,QAA8B,KAAkB,OAAiC;CACzG,MAAM,QAAuB,CAAC;CAC9B,KAAK,MAAM,SAAS,OAAO,OAAO;EAChC,MAAM,OAAO,MAAM,SAAS,KAAA,IAAY,KAAA,IAAY,IAAI,eAAe,MAAM,IAAI;EACjF,IAAI,CAAC,MAAM;EACX,MAAM,SAASC,aAAAA,cAAc,CAAC,MAAMC,+BAAAA,gBAAgB,MAAM,MAAM,KAAK,KAAK,CAAC,GAAG,QAAQ;EACtF,MAAM,KAAK;GAAE,GAAG;GAAQ,KAAK,QAAQ,OAAO;EAAM,CAAC;CACrD;CACA,MAAM,YAAYA,+BAAAA,gBAAgB,OAAO,QAAQ;EAAE,MAAM;EAAW,OAAO;CAAK,GAAG,KAAK,KAAK;CAC7F,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,IAAI,OAAO,MAAM,MAAM,KAAK;EAAE,GAAG;EAAW,KAAK,QAAQ,UAAU;CAAM,CAAC;CAC1E,MAAM,OAAOD,aAAAA,cAAc,OAAO,GAAG;CACrC,OAAO;EAAE,GAAG;EAAM,KAAK,SAAS,KAAK,IAAI;CAAO;AAClD;;AAGA,SAAgB,aAAa,QAAmD;CAC9E,OAAO,OAAO,QACZE,+BAAAA,mBAAmB,OAAO,IAAI,MAAM,SACpC,OAAO,MAAM,OAAO,UAAUA,+BAAAA,mBAAmB,MAAM,IAAI,MAAM,KAAK,IACpE,QACA,KAAA;AACN"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"case.d.cts","names":[],"sources":["../../src/expressions/case.ts"],"mappings":";;;;;UAOiB;WACN,MAAM;WACN;WACA;;;UAIM;WACN;WACA;WACA;;;UAIM;WACN,MAAM,qBAAqB,WAAW;;;KAIrC,aAAa,KAAK,+BAC1B,aAAa,aACb;WAAqB,YAAY;IAC/B,IACA;WAAqB,YAAY;IAC/B;;KAII,UAAU,GAAG,KAAK,wDAE1B,2CACc,WAAW,IAAI,eAAe,EAAE,IAAI,QAAO,eAAe,KACtE,UAAU,WACR,eAAe,GAAG;;KAIrB,eAAe,GAAG,KAAK,UAAU,uBACtB,WAAW,IAAI,mBAAmB,gBAAgB,EAAE,IAAI,KAAK,wCACzE,UAAU,uBACI,WAAW,IAAI,mBAAmB,gBAAgB,EAAE,IAAI;;KAIrE,eAAe,8BAA8B,mCAAmC,0BAC7E,YACG,KAEP;WAAqB;IACnB,uBACE,mGAIF,eAAe;;UAIJ;EACf;EACA,QAAQ,mBAAmB;EAC3B,OAAO;;;UAIC;EACR,MAAM;EACN,MAAM;;;;;;iBAOQ,oBAAoB,iBAAiB;;iBAuBrC,UAAU,QAAQ,sBAAsB,KAAK,aAAa,OAAO,cAAc;;iBAgB/E,aAAa,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"case.d.mts","names":[],"sources":["../../src/expressions/case.ts"],"mappings":";;;;;UAOiB;WACN,MAAM;WACN;WACA;;;UAIM;WACN;WACA;WACA;;;UAIM;WACN,MAAM,qBAAqB,WAAW;;;KAIrC,aAAa,KAAK,+BAC1B,aAAa,aACb;WAAqB,YAAY;IAC/B,IACA;WAAqB,YAAY;IAC/B;;KAII,UAAU,GAAG,KAAK,wDAE1B,2CACc,WAAW,IAAI,eAAe,EAAE,IAAI,QAAO,eAAe,KACtE,UAAU,WACR,eAAe,GAAG;;KAIrB,eAAe,GAAG,KAAK,UAAU,uBACtB,WAAW,IAAI,mBAAmB,gBAAgB,EAAE,IAAI,KAAK,wCACzE,UAAU,uBACI,WAAW,IAAI,mBAAmB,gBAAgB,EAAE,IAAI;;KAIrE,eAAe,8BAA8B,mCAAmC,0BAC7E,YACG,KAEP;WAAqB;IACnB,uBACE,mGAIF,eAAe;;UAIJ;EACf;EACA,QAAQ,mBAAmB;EAC3B,OAAO;;;UAIC;EACR,MAAM;EACN,MAAM;;;;;;iBAOQ,oBAAoB,iBAAiB;;iBAuBrC,UAAU,QAAQ,sBAAsB,KAAK,aAAa,OAAO,cAAc;;iBAgB/E,aAAa,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"case.js","names":[],"sources":["../../src/expressions/case.ts"],"sourcesContent":["import { type ExprContext, type SqlFragment, joinFragments } from \"../Expr.ts\";\nimport type { QueryCondition } from \"../query.ts\";\nimport { expressionNullable, expressionToSql } from \"./expression.ts\";\nimport { checkKeys, isObject, parseExpression } from \"./parseExpression.ts\";\nimport type { CheckExpression, ParsedExpression, ResultCodec } from \"./types.ts\";\n\n/** One condition and the value to return when it is true. */\nexport interface CaseWhen {\n readonly when: QueryCondition | undefined;\n readonly then: unknown;\n readonly else?: never;\n}\n\n/** The fallback value, allowed only as the last entry in a CASE array. */\nexport interface CaseElse {\n readonly else: unknown;\n readonly when?: never;\n readonly then?: never;\n}\n\n/** A single WHEN or an ordered array of WHEN entries with an optional final ELSE. */\nexport interface CaseInput {\n readonly case: CaseWhen | readonly (CaseWhen | CaseElse)[];\n}\n\n/** The values returned by CASE's THEN and ELSE entries. */\nexport type CaseArmValue<A> = A extends readonly unknown[]\n ? CaseArmValue<A[number]>\n : A extends { readonly then: infer V }\n ? V\n : A extends { readonly else: infer V }\n ? V\n : never;\n\n/** A single CASE entry must be WHEN; an array can also have a final ELSE. */\nexport type CheckCase<A, R> = A extends readonly []\n ? \"CASE needs at least one arm\"\n : A extends readonly unknown[]\n ? { readonly [K in keyof A]: CheckCaseEntry<A[K], R> } & CheckCaseOrder<A>\n : A extends CaseWhen\n ? CheckCaseEntry<A, R>\n : never;\n\n/** Checks THEN/ELSE values and rejects extra keys on an entry. */\ntype CheckCaseEntry<A, R> = A extends CaseWhen\n ? { readonly [K in keyof A]: K extends \"then\" ? CheckExpression<A[K], R> : K extends \"when\" ? unknown : never }\n : A extends CaseElse\n ? { readonly [K in keyof A]: K extends \"else\" ? CheckExpression<A[K], R> : never }\n : never;\n\n/** Fixed CASE arrays can be checked now; dynamic arrays get the same checks at runtime. */\ntype CheckCaseOrder<A extends readonly unknown[], HasWhen extends boolean = false> = A extends readonly [\n infer H,\n ...infer T,\n]\n ? H extends { readonly else: unknown }\n ? HasWhen extends true\n ? T extends readonly []\n ? unknown\n : \"CASE ELSE must be last\"\n : \"CASE needs a WHEN arm before ELSE\"\n : CheckCaseOrder<T, true>\n : unknown;\n\n/** A CASE has at least one WHEN and an optional ELSE; no ELSE means SQL NULL. */\nexport interface ParsedCaseExpression {\n kind: \"case\";\n whens: [ParsedCaseWhen, ...ParsedCaseWhen[]];\n else?: ParsedExpression;\n}\n\n/** A CASE condition and its parsed result expression. */\ninterface ParsedCaseWhen {\n when: QueryCondition | undefined;\n then: ParsedExpression;\n}\n\n/**\n * Parses WHEN entries and an optional final ELSE into a ParsedCaseExpression.\n * Requires at least one WHEN, even if its condition may later be pruned.\n */\nexport function parseCaseExpression(input: unknown): ParsedCaseExpression {\n const entries = Array.isArray(input) ? input : [input];\n const whens: ParsedCaseWhen[] = [];\n let fallback: ParsedExpression | undefined;\n for (const [i, entry] of entries.entries()) {\n if (isObject(entry) && \"else\" in entry) {\n checkKeys(entry, [\"else\"]);\n if (whens.length === 0) throw new Error(\"CASE needs a WHEN arm before ELSE\");\n if (i !== entries.length - 1) throw new Error(\"CASE ELSE must be last\");\n fallback = parseExpression(entry.else);\n } else {\n if (!isObject(entry) || !(\"when\" in entry) || !(\"then\" in entry))\n throw new Error(\"A CASE arm needs when and then\");\n checkKeys(entry, [\"when\", \"then\"]);\n whens.push({ when: entry.when as QueryCondition | undefined, then: parseExpression(entry.then) });\n }\n }\n if (whens.length === 0) throw new Error(\"CASE needs at least one arm\");\n const [first, ...rest] = whens;\n return { kind: \"case\", whens: [first, ...rest], else: fallback };\n}\n\n/** Removes CASE entries with omitted conditions, falling back to ELSE or SQL NULL if none remain. */\nexport function caseToSql(parsed: ParsedCaseExpression, ctx: ExprContext, codec: ResultCodec): SqlFragment {\n const parts: SqlFragment[] = [];\n for (const entry of parsed.whens) {\n const when = entry.when === undefined ? undefined : ctx.conditionToSql(entry.when);\n if (!when) continue;\n const branch = joinFragments([when, expressionToSql(entry.then, ctx, codec)], \" THEN \");\n parts.push({ ...branch, sql: `WHEN ${branch.sql}` });\n }\n const otherwise = expressionToSql(parsed.else ?? { kind: \"literal\", value: null }, ctx, codec);\n if (parts.length === 0) return otherwise;\n if (parsed.else) parts.push({ ...otherwise, sql: `ELSE ${otherwise.sql}` });\n const body = joinFragments(parts, \" \");\n return { ...body, sql: `(CASE ${body.sql} END)` };\n}\n\n/** CASE is definitely non-null only when every THEN value and the ELSE value are non-null. */\nexport function caseNullable(parsed: ParsedCaseExpression): boolean | undefined {\n return parsed.else &&\n expressionNullable(parsed.else) === false &&\n parsed.whens.every((entry) => expressionNullable(entry.then) === false)\n ? false\n : undefined;\n}\n"],"mappings":";;;;;;;;AAiFA,SAAgB,oBAAoB,OAAsC;CACxE,MAAM,UAAU,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;CACrD,MAAM,QAA0B,CAAC;CACjC,IAAI;CACJ,KAAK,MAAM,CAAC,GAAG,UAAU,QAAQ,QAAQ,GACvC,IAAI,SAAS,KAAK,KAAK,UAAU,OAAO;EACtC,UAAU,OAAO,CAAC,MAAM,CAAC;EACzB,IAAI,MAAM,WAAW,GAAG,MAAM,IAAI,MAAM,mCAAmC;EAC3E,IAAI,MAAM,QAAQ,SAAS,GAAG,MAAM,IAAI,MAAM,wBAAwB;EACtE,WAAW,gBAAgB,MAAM,IAAI;CACvC,OAAO;EACL,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,UAAU,UAAU,EAAE,UAAU,QACxD,MAAM,IAAI,MAAM,gCAAgC;EAClD,UAAU,OAAO,CAAC,QAAQ,MAAM,CAAC;EACjC,MAAM,KAAK;GAAE,MAAM,MAAM;GAAoC,MAAM,gBAAgB,MAAM,IAAI;EAAE,CAAC;CAClG;CAEF,IAAI,MAAM,WAAW,GAAG,MAAM,IAAI,MAAM,6BAA6B;CACrE,MAAM,CAAC,OAAO,GAAG,QAAQ;CACzB,OAAO;EAAE,MAAM;EAAQ,OAAO,CAAC,OAAO,GAAG,IAAI;EAAG,MAAM;CAAS;AACjE;;AAGA,SAAgB,UAAU,QAA8B,KAAkB,OAAiC;CACzG,MAAM,QAAuB,CAAC;CAC9B,KAAK,MAAM,SAAS,OAAO,OAAO;EAChC,MAAM,OAAO,MAAM,SAAS,KAAA,IAAY,KAAA,IAAY,IAAI,eAAe,MAAM,IAAI;EACjF,IAAI,CAAC,MAAM;EACX,MAAM,SAAS,cAAc,CAAC,MAAM,gBAAgB,MAAM,MAAM,KAAK,KAAK,CAAC,GAAG,QAAQ;EACtF,MAAM,KAAK;GAAE,GAAG;GAAQ,KAAK,QAAQ,OAAO;EAAM,CAAC;CACrD;CACA,MAAM,YAAY,gBAAgB,OAAO,QAAQ;EAAE,MAAM;EAAW,OAAO;CAAK,GAAG,KAAK,KAAK;CAC7F,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,IAAI,OAAO,MAAM,MAAM,KAAK;EAAE,GAAG;EAAW,KAAK,QAAQ,UAAU;CAAM,CAAC;CAC1E,MAAM,OAAO,cAAc,OAAO,GAAG;CACrC,OAAO;EAAE,GAAG;EAAM,KAAK,SAAS,KAAK,IAAI;CAAO;AAClD;;AAGA,SAAgB,aAAa,QAAmD;CAC9E,OAAO,OAAO,QACZ,mBAAmB,OAAO,IAAI,MAAM,SACpC,OAAO,MAAM,OAAO,UAAU,mBAAmB,MAAM,IAAI,MAAM,KAAK,IACpE,QACA,KAAA;AACN"}
|