@warlock.js/cascade 4.0.157 → 4.0.161
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/package.json +4 -4
- package/cjs/context/database-data-source-context.d.ts +0 -29
- package/cjs/context/database-data-source-context.d.ts.map +0 -1
- package/cjs/context/database-data-source-context.js +0 -28
- package/cjs/context/database-data-source-context.js.map +0 -1
- package/cjs/context/database-transaction-context.d.ts +0 -35
- package/cjs/context/database-transaction-context.d.ts.map +0 -1
- package/cjs/context/database-transaction-context.js +0 -40
- package/cjs/context/database-transaction-context.js.map +0 -1
- package/cjs/contracts/database-driver.contract.d.ts +0 -450
- package/cjs/contracts/database-driver.contract.d.ts.map +0 -1
- package/cjs/contracts/database-id-generator.contract.d.ts +0 -109
- package/cjs/contracts/database-id-generator.contract.d.ts.map +0 -1
- package/cjs/contracts/database-remover.contract.d.ts +0 -104
- package/cjs/contracts/database-remover.contract.d.ts.map +0 -1
- package/cjs/contracts/database-restorer.contract.d.ts +0 -143
- package/cjs/contracts/database-restorer.contract.d.ts.map +0 -1
- package/cjs/contracts/database-writer.contract.d.ts +0 -119
- package/cjs/contracts/database-writer.contract.d.ts.map +0 -1
- package/cjs/contracts/driver-blueprint.contract.d.ts +0 -49
- package/cjs/contracts/driver-blueprint.contract.d.ts.map +0 -1
- package/cjs/contracts/index.d.ts +0 -10
- package/cjs/contracts/index.d.ts.map +0 -1
- package/cjs/contracts/migration-driver.contract.d.ts +0 -522
- package/cjs/contracts/migration-driver.contract.d.ts.map +0 -1
- package/cjs/contracts/query-builder.contract.d.ts +0 -1609
- package/cjs/contracts/query-builder.contract.d.ts.map +0 -1
- package/cjs/contracts/sync-adapter.contract.d.ts +0 -58
- package/cjs/contracts/sync-adapter.contract.d.ts.map +0 -1
- package/cjs/data-source/data-source-registry.d.ts +0 -108
- package/cjs/data-source/data-source-registry.d.ts.map +0 -1
- package/cjs/data-source/data-source-registry.js +0 -145
- package/cjs/data-source/data-source-registry.js.map +0 -1
- package/cjs/data-source/data-source.d.ts +0 -147
- package/cjs/data-source/data-source.d.ts.map +0 -1
- package/cjs/data-source/data-source.js +0 -83
- package/cjs/data-source/data-source.js.map +0 -1
- package/cjs/database-dirty-tracker.d.ts +0 -252
- package/cjs/database-dirty-tracker.d.ts.map +0 -1
- package/cjs/database-dirty-tracker.js +0 -386
- package/cjs/database-dirty-tracker.js.map +0 -1
- package/cjs/drivers/mongodb/mongodb-blueprint.d.ts +0 -30
- package/cjs/drivers/mongodb/mongodb-blueprint.d.ts.map +0 -1
- package/cjs/drivers/mongodb/mongodb-blueprint.js +0 -51
- package/cjs/drivers/mongodb/mongodb-blueprint.js.map +0 -1
- package/cjs/drivers/mongodb/mongodb-driver.d.ts +0 -324
- package/cjs/drivers/mongodb/mongodb-driver.d.ts.map +0 -1
- package/cjs/drivers/mongodb/mongodb-driver.js +0 -799
- package/cjs/drivers/mongodb/mongodb-driver.js.map +0 -1
- package/cjs/drivers/mongodb/mongodb-id-generator.d.ts +0 -116
- package/cjs/drivers/mongodb/mongodb-id-generator.d.ts.map +0 -1
- package/cjs/drivers/mongodb/mongodb-id-generator.js +0 -149
- package/cjs/drivers/mongodb/mongodb-id-generator.js.map +0 -1
- package/cjs/drivers/mongodb/mongodb-migration-driver.d.ts +0 -317
- package/cjs/drivers/mongodb/mongodb-migration-driver.d.ts.map +0 -1
- package/cjs/drivers/mongodb/mongodb-migration-driver.js +0 -666
- package/cjs/drivers/mongodb/mongodb-migration-driver.js.map +0 -1
- package/cjs/drivers/mongodb/mongodb-query-builder.d.ts +0 -1122
- package/cjs/drivers/mongodb/mongodb-query-builder.d.ts.map +0 -1
- package/cjs/drivers/mongodb/mongodb-query-builder.js +0 -1988
- package/cjs/drivers/mongodb/mongodb-query-builder.js.map +0 -1
- package/cjs/drivers/mongodb/mongodb-query-operations.d.ts +0 -226
- package/cjs/drivers/mongodb/mongodb-query-operations.d.ts.map +0 -1
- package/cjs/drivers/mongodb/mongodb-query-operations.js +0 -270
- package/cjs/drivers/mongodb/mongodb-query-operations.js.map +0 -1
- package/cjs/drivers/mongodb/mongodb-query-parser.d.ts +0 -262
- package/cjs/drivers/mongodb/mongodb-query-parser.d.ts.map +0 -1
- package/cjs/drivers/mongodb/mongodb-query-parser.js +0 -1351
- package/cjs/drivers/mongodb/mongodb-query-parser.js.map +0 -1
- package/cjs/drivers/mongodb/mongodb-sync-adapter.d.ts +0 -79
- package/cjs/drivers/mongodb/mongodb-sync-adapter.d.ts.map +0 -1
- package/cjs/drivers/mongodb/mongodb-sync-adapter.js +0 -146
- package/cjs/drivers/mongodb/mongodb-sync-adapter.js.map +0 -1
- package/cjs/drivers/mongodb/types.d.ts +0 -43
- package/cjs/drivers/mongodb/types.d.ts.map +0 -1
- package/cjs/drivers/postgres/index.d.ts +0 -16
- package/cjs/drivers/postgres/index.d.ts.map +0 -1
- package/cjs/drivers/postgres/postgres-blueprint.d.ts +0 -64
- package/cjs/drivers/postgres/postgres-blueprint.d.ts.map +0 -1
- package/cjs/drivers/postgres/postgres-blueprint.js +0 -121
- package/cjs/drivers/postgres/postgres-blueprint.js.map +0 -1
- package/cjs/drivers/postgres/postgres-dialect.d.ts +0 -136
- package/cjs/drivers/postgres/postgres-dialect.d.ts.map +0 -1
- package/cjs/drivers/postgres/postgres-dialect.js +0 -268
- package/cjs/drivers/postgres/postgres-dialect.js.map +0 -1
- package/cjs/drivers/postgres/postgres-driver.d.ts +0 -432
- package/cjs/drivers/postgres/postgres-driver.d.ts.map +0 -1
- package/cjs/drivers/postgres/postgres-driver.js +0 -965
- package/cjs/drivers/postgres/postgres-driver.js.map +0 -1
- package/cjs/drivers/postgres/postgres-migration-driver.d.ts +0 -397
- package/cjs/drivers/postgres/postgres-migration-driver.d.ts.map +0 -1
- package/cjs/drivers/postgres/postgres-migration-driver.js +0 -900
- package/cjs/drivers/postgres/postgres-migration-driver.js.map +0 -1
- package/cjs/drivers/postgres/postgres-query-builder.d.ts +0 -254
- package/cjs/drivers/postgres/postgres-query-builder.d.ts.map +0 -1
- package/cjs/drivers/postgres/postgres-query-builder.js +0 -933
- package/cjs/drivers/postgres/postgres-query-builder.js.map +0 -1
- package/cjs/drivers/postgres/postgres-query-parser.d.ts +0 -328
- package/cjs/drivers/postgres/postgres-query-parser.d.ts.map +0 -1
- package/cjs/drivers/postgres/postgres-query-parser.js +0 -864
- package/cjs/drivers/postgres/postgres-query-parser.js.map +0 -1
- package/cjs/drivers/postgres/postgres-sql-serializer.d.ts +0 -37
- package/cjs/drivers/postgres/postgres-sql-serializer.d.ts.map +0 -1
- package/cjs/drivers/postgres/postgres-sql-serializer.js +0 -400
- package/cjs/drivers/postgres/postgres-sql-serializer.js.map +0 -1
- package/cjs/drivers/postgres/postgres-sync-adapter.d.ts +0 -83
- package/cjs/drivers/postgres/postgres-sync-adapter.d.ts.map +0 -1
- package/cjs/drivers/postgres/postgres-sync-adapter.js +0 -197
- package/cjs/drivers/postgres/postgres-sync-adapter.js.map +0 -1
- package/cjs/drivers/postgres/types.d.ts +0 -142
- package/cjs/drivers/postgres/types.d.ts.map +0 -1
- package/cjs/drivers/sql/index.d.ts +0 -10
- package/cjs/drivers/sql/index.d.ts.map +0 -1
- package/cjs/drivers/sql/sql-dialect.contract.d.ts +0 -204
- package/cjs/drivers/sql/sql-dialect.contract.d.ts.map +0 -1
- package/cjs/drivers/sql/sql-types.d.ts +0 -202
- package/cjs/drivers/sql/sql-types.d.ts.map +0 -1
- package/cjs/errors/missing-data-source.error.d.ts +0 -22
- package/cjs/errors/missing-data-source.error.d.ts.map +0 -1
- package/cjs/errors/missing-data-source.error.js +0 -29
- package/cjs/errors/missing-data-source.error.js.map +0 -1
- package/cjs/errors/transaction-rollback.error.d.ts +0 -20
- package/cjs/errors/transaction-rollback.error.d.ts.map +0 -1
- package/cjs/errors/transaction-rollback.error.js +0 -27
- package/cjs/errors/transaction-rollback.error.js.map +0 -1
- package/cjs/events/model-events.d.ts +0 -231
- package/cjs/events/model-events.d.ts.map +0 -1
- package/cjs/events/model-events.js +0 -259
- package/cjs/events/model-events.js.map +0 -1
- package/cjs/expressions/aggregate-expressions.d.ts +0 -215
- package/cjs/expressions/aggregate-expressions.d.ts.map +0 -1
- package/cjs/expressions/aggregate-expressions.js +0 -221
- package/cjs/expressions/aggregate-expressions.js.map +0 -1
- package/cjs/expressions/index.d.ts +0 -2
- package/cjs/expressions/index.d.ts.map +0 -1
- package/cjs/index.d.ts +0 -45
- package/cjs/index.d.ts.map +0 -1
- package/cjs/index.js +0 -1
- package/cjs/index.js.map +0 -1
- package/cjs/migration/column-builder.d.ts +0 -417
- package/cjs/migration/column-builder.d.ts.map +0 -1
- package/cjs/migration/column-builder.js +0 -586
- package/cjs/migration/column-builder.js.map +0 -1
- package/cjs/migration/column-helpers.d.ts +0 -275
- package/cjs/migration/column-helpers.d.ts.map +0 -1
- package/cjs/migration/column-helpers.js +0 -389
- package/cjs/migration/column-helpers.js.map +0 -1
- package/cjs/migration/foreign-key-builder.d.ts +0 -103
- package/cjs/migration/foreign-key-builder.d.ts.map +0 -1
- package/cjs/migration/foreign-key-builder.js +0 -121
- package/cjs/migration/foreign-key-builder.js.map +0 -1
- package/cjs/migration/index.d.ts +0 -7
- package/cjs/migration/index.d.ts.map +0 -1
- package/cjs/migration/migration-runner.d.ts +0 -278
- package/cjs/migration/migration-runner.d.ts.map +0 -1
- package/cjs/migration/migration-runner.js +0 -815
- package/cjs/migration/migration-runner.js.map +0 -1
- package/cjs/migration/migration.d.ts +0 -1992
- package/cjs/migration/migration.d.ts.map +0 -1
- package/cjs/migration/migration.js +0 -2162
- package/cjs/migration/migration.js.map +0 -1
- package/cjs/migration/sql-grammar.d.ts +0 -61
- package/cjs/migration/sql-grammar.d.ts.map +0 -1
- package/cjs/migration/sql-grammar.js +0 -164
- package/cjs/migration/sql-grammar.js.map +0 -1
- package/cjs/migration/sql-serializer.d.ts +0 -22
- package/cjs/migration/sql-serializer.d.ts.map +0 -1
- package/cjs/migration/sql-serializer.js +0 -26
- package/cjs/migration/sql-serializer.js.map +0 -1
- package/cjs/migration/types.d.ts +0 -155
- package/cjs/migration/types.d.ts.map +0 -1
- package/cjs/model/methods/accessor-methods.d.ts +0 -13
- package/cjs/model/methods/accessor-methods.d.ts.map +0 -1
- package/cjs/model/methods/accessor-methods.js +0 -51
- package/cjs/model/methods/accessor-methods.js.map +0 -1
- package/cjs/model/methods/delete-methods.d.ts +0 -10
- package/cjs/model/methods/delete-methods.d.ts.map +0 -1
- package/cjs/model/methods/delete-methods.js +0 -10
- package/cjs/model/methods/delete-methods.js.map +0 -1
- package/cjs/model/methods/dirty-methods.d.ts +0 -10
- package/cjs/model/methods/dirty-methods.d.ts.map +0 -1
- package/cjs/model/methods/dirty-methods.js +0 -15
- package/cjs/model/methods/dirty-methods.js.map +0 -1
- package/cjs/model/methods/hydration-methods.d.ts +0 -10
- package/cjs/model/methods/hydration-methods.d.ts.map +0 -1
- package/cjs/model/methods/hydration-methods.js +0 -57
- package/cjs/model/methods/hydration-methods.js.map +0 -1
- package/cjs/model/methods/instance-event-methods.d.ts +0 -7
- package/cjs/model/methods/instance-event-methods.d.ts.map +0 -1
- package/cjs/model/methods/instance-event-methods.js +0 -15
- package/cjs/model/methods/instance-event-methods.js.map +0 -1
- package/cjs/model/methods/meta-methods.d.ts +0 -7
- package/cjs/model/methods/meta-methods.d.ts.map +0 -1
- package/cjs/model/methods/meta-methods.js +0 -78
- package/cjs/model/methods/meta-methods.js.map +0 -1
- package/cjs/model/methods/query-methods.d.ts +0 -24
- package/cjs/model/methods/query-methods.d.ts.map +0 -1
- package/cjs/model/methods/query-methods.js +0 -161
- package/cjs/model/methods/query-methods.js.map +0 -1
- package/cjs/model/methods/restore-methods.d.ts +0 -10
- package/cjs/model/methods/restore-methods.d.ts.map +0 -1
- package/cjs/model/methods/restore-methods.js +0 -13
- package/cjs/model/methods/restore-methods.js.map +0 -1
- package/cjs/model/methods/scope-methods.d.ts +0 -7
- package/cjs/model/methods/scope-methods.d.ts.map +0 -1
- package/cjs/model/methods/scope-methods.js +0 -15
- package/cjs/model/methods/scope-methods.js.map +0 -1
- package/cjs/model/methods/serialization-methods.d.ts +0 -3
- package/cjs/model/methods/serialization-methods.d.ts.map +0 -1
- package/cjs/model/methods/serialization-methods.js +0 -27
- package/cjs/model/methods/serialization-methods.js.map +0 -1
- package/cjs/model/methods/static-event-methods.d.ts +0 -9
- package/cjs/model/methods/static-event-methods.d.ts.map +0 -1
- package/cjs/model/methods/static-event-methods.js +0 -29
- package/cjs/model/methods/static-event-methods.js.map +0 -1
- package/cjs/model/methods/write-methods.d.ts +0 -10
- package/cjs/model/methods/write-methods.d.ts.map +0 -1
- package/cjs/model/methods/write-methods.js +0 -52
- package/cjs/model/methods/write-methods.js.map +0 -1
- package/cjs/model/model.d.ts +0 -1650
- package/cjs/model/model.d.ts.map +0 -1
- package/cjs/model/model.js +0 -1657
- package/cjs/model/model.js.map +0 -1
- package/cjs/model/model.types.d.ts +0 -44
- package/cjs/model/model.types.d.ts.map +0 -1
- package/cjs/model/register-model.d.ts +0 -81
- package/cjs/model/register-model.d.ts.map +0 -1
- package/cjs/model/register-model.js +0 -94
- package/cjs/model/register-model.js.map +0 -1
- package/cjs/query-builder/query-builder.d.ts +0 -556
- package/cjs/query-builder/query-builder.d.ts.map +0 -1
- package/cjs/query-builder/query-builder.js +0 -1070
- package/cjs/query-builder/query-builder.js.map +0 -1
- package/cjs/relations/helpers.d.ts +0 -156
- package/cjs/relations/helpers.d.ts.map +0 -1
- package/cjs/relations/helpers.js +0 -201
- package/cjs/relations/helpers.js.map +0 -1
- package/cjs/relations/index.d.ts +0 -35
- package/cjs/relations/index.d.ts.map +0 -1
- package/cjs/relations/pivot-operations.d.ts +0 -160
- package/cjs/relations/pivot-operations.d.ts.map +0 -1
- package/cjs/relations/pivot-operations.js +0 -293
- package/cjs/relations/pivot-operations.js.map +0 -1
- package/cjs/relations/relation-hydrator.d.ts +0 -68
- package/cjs/relations/relation-hydrator.d.ts.map +0 -1
- package/cjs/relations/relation-hydrator.js +0 -81
- package/cjs/relations/relation-hydrator.js.map +0 -1
- package/cjs/relations/relation-loader.d.ts +0 -194
- package/cjs/relations/relation-loader.d.ts.map +0 -1
- package/cjs/relations/relation-loader.js +0 -466
- package/cjs/relations/relation-loader.js.map +0 -1
- package/cjs/relations/types.d.ts +0 -306
- package/cjs/relations/types.d.ts.map +0 -1
- package/cjs/remover/database-remover.d.ts +0 -100
- package/cjs/remover/database-remover.d.ts.map +0 -1
- package/cjs/remover/database-remover.js +0 -214
- package/cjs/remover/database-remover.js.map +0 -1
- package/cjs/restorer/database-restorer.d.ts +0 -131
- package/cjs/restorer/database-restorer.d.ts.map +0 -1
- package/cjs/restorer/database-restorer.js +0 -434
- package/cjs/restorer/database-restorer.js.map +0 -1
- package/cjs/sql-database-dirty-tracker.d.ts +0 -13
- package/cjs/sql-database-dirty-tracker.d.ts.map +0 -1
- package/cjs/sql-database-dirty-tracker.js +0 -14
- package/cjs/sql-database-dirty-tracker.js.map +0 -1
- package/cjs/sync/index.d.ts +0 -12
- package/cjs/sync/index.d.ts.map +0 -1
- package/cjs/sync/model-events.d.ts +0 -62
- package/cjs/sync/model-events.d.ts.map +0 -1
- package/cjs/sync/model-events.js +0 -49
- package/cjs/sync/model-events.js.map +0 -1
- package/cjs/sync/model-sync-operation.d.ts +0 -163
- package/cjs/sync/model-sync-operation.d.ts.map +0 -1
- package/cjs/sync/model-sync-operation.js +0 -292
- package/cjs/sync/model-sync-operation.js.map +0 -1
- package/cjs/sync/model-sync.d.ts +0 -130
- package/cjs/sync/model-sync.d.ts.map +0 -1
- package/cjs/sync/model-sync.js +0 -178
- package/cjs/sync/model-sync.js.map +0 -1
- package/cjs/sync/sync-context.d.ts +0 -70
- package/cjs/sync/sync-context.d.ts.map +0 -1
- package/cjs/sync/sync-context.js +0 -101
- package/cjs/sync/sync-context.js.map +0 -1
- package/cjs/sync/sync-manager.d.ts +0 -213
- package/cjs/sync/sync-manager.d.ts.map +0 -1
- package/cjs/sync/sync-manager.js +0 -689
- package/cjs/sync/sync-manager.js.map +0 -1
- package/cjs/sync/types.d.ts +0 -289
- package/cjs/sync/types.d.ts.map +0 -1
- package/cjs/test-migrations/test-enhanced-features.migration.d.ts +0 -15
- package/cjs/test-migrations/test-enhanced-features.migration.d.ts.map +0 -1
- package/cjs/types.d.ts +0 -371
- package/cjs/types.d.ts.map +0 -1
- package/cjs/utils/connect-to-database.d.ts +0 -300
- package/cjs/utils/connect-to-database.d.ts.map +0 -1
- package/cjs/utils/connect-to-database.js +0 -128
- package/cjs/utils/connect-to-database.js.map +0 -1
- package/cjs/utils/database-writer.utils.d.ts +0 -15
- package/cjs/utils/database-writer.utils.d.ts.map +0 -1
- package/cjs/utils/database-writer.utils.js +0 -14
- package/cjs/utils/database-writer.utils.js.map +0 -1
- package/cjs/utils/define-model.js +0 -100
- package/cjs/utils/define-model.js.map +0 -1
- package/cjs/utils/is-valid-date-value.d.ts +0 -5
- package/cjs/utils/is-valid-date-value.d.ts.map +0 -1
- package/cjs/utils/is-valid-date-value.js +0 -25
- package/cjs/utils/is-valid-date-value.js.map +0 -1
- package/cjs/utils/once-connected.d.ts +0 -146
- package/cjs/utils/once-connected.d.ts.map +0 -1
- package/cjs/utils/once-connected.js +0 -251
- package/cjs/utils/once-connected.js.map +0 -1
- package/cjs/validation/database-seal-plugins.d.ts +0 -12
- package/cjs/validation/database-seal-plugins.d.ts.map +0 -1
- package/cjs/validation/database-seal-plugins.js +0 -1
- package/cjs/validation/database-seal-plugins.js.map +0 -1
- package/cjs/validation/database-writer-validation-error.d.ts +0 -97
- package/cjs/validation/database-writer-validation-error.d.ts.map +0 -1
- package/cjs/validation/database-writer-validation-error.js +0 -160
- package/cjs/validation/database-writer-validation-error.js.map +0 -1
- package/cjs/validation/index.d.ts +0 -3
- package/cjs/validation/index.d.ts.map +0 -1
- package/cjs/validation/mutators/embed-mutator.d.ts +0 -9
- package/cjs/validation/mutators/embed-mutator.d.ts.map +0 -1
- package/cjs/validation/mutators/embed-mutator.js +0 -33
- package/cjs/validation/mutators/embed-mutator.js.map +0 -1
- package/cjs/validation/plugins/embed-validator-plugin.d.ts +0 -24
- package/cjs/validation/plugins/embed-validator-plugin.d.ts.map +0 -1
- package/cjs/validation/plugins/embed-validator-plugin.js +0 -18
- package/cjs/validation/plugins/embed-validator-plugin.js.map +0 -1
- package/cjs/validation/rules/database-model-rule.d.ts +0 -7
- package/cjs/validation/rules/database-model-rule.d.ts.map +0 -1
- package/cjs/validation/rules/database-model-rule.js +0 -27
- package/cjs/validation/rules/database-model-rule.js.map +0 -1
- package/cjs/validation/transformers/embed-model-transformer.d.ts +0 -3
- package/cjs/validation/transformers/embed-model-transformer.d.ts.map +0 -1
- package/cjs/validation/transformers/embed-model-transformer.js +0 -18
- package/cjs/validation/transformers/embed-model-transformer.js.map +0 -1
- package/cjs/validation/validators/embed-validator.d.ts +0 -21
- package/cjs/validation/validators/embed-validator.d.ts.map +0 -1
- package/cjs/validation/validators/embed-validator.js +0 -43
- package/cjs/validation/validators/embed-validator.js.map +0 -1
- package/cjs/writer/database-writer.d.ts +0 -181
- package/cjs/writer/database-writer.d.ts.map +0 -1
- package/cjs/writer/database-writer.js +0 -407
- package/cjs/writer/database-writer.js.map +0 -1
- package/esm/context/database-data-source-context.d.ts +0 -29
- package/esm/context/database-data-source-context.d.ts.map +0 -1
- package/esm/context/database-data-source-context.js +0 -28
- package/esm/context/database-data-source-context.js.map +0 -1
- package/esm/context/database-transaction-context.d.ts +0 -35
- package/esm/context/database-transaction-context.d.ts.map +0 -1
- package/esm/context/database-transaction-context.js +0 -40
- package/esm/context/database-transaction-context.js.map +0 -1
- package/esm/contracts/database-driver.contract.d.ts +0 -450
- package/esm/contracts/database-driver.contract.d.ts.map +0 -1
- package/esm/contracts/database-id-generator.contract.d.ts +0 -109
- package/esm/contracts/database-id-generator.contract.d.ts.map +0 -1
- package/esm/contracts/database-remover.contract.d.ts +0 -104
- package/esm/contracts/database-remover.contract.d.ts.map +0 -1
- package/esm/contracts/database-restorer.contract.d.ts +0 -143
- package/esm/contracts/database-restorer.contract.d.ts.map +0 -1
- package/esm/contracts/database-writer.contract.d.ts +0 -119
- package/esm/contracts/database-writer.contract.d.ts.map +0 -1
- package/esm/contracts/driver-blueprint.contract.d.ts +0 -49
- package/esm/contracts/driver-blueprint.contract.d.ts.map +0 -1
- package/esm/contracts/index.d.ts +0 -10
- package/esm/contracts/index.d.ts.map +0 -1
- package/esm/contracts/migration-driver.contract.d.ts +0 -522
- package/esm/contracts/migration-driver.contract.d.ts.map +0 -1
- package/esm/contracts/query-builder.contract.d.ts +0 -1609
- package/esm/contracts/query-builder.contract.d.ts.map +0 -1
- package/esm/contracts/sync-adapter.contract.d.ts +0 -58
- package/esm/contracts/sync-adapter.contract.d.ts.map +0 -1
- package/esm/data-source/data-source-registry.d.ts +0 -108
- package/esm/data-source/data-source-registry.d.ts.map +0 -1
- package/esm/data-source/data-source-registry.js +0 -145
- package/esm/data-source/data-source-registry.js.map +0 -1
- package/esm/data-source/data-source.d.ts +0 -147
- package/esm/data-source/data-source.d.ts.map +0 -1
- package/esm/data-source/data-source.js +0 -83
- package/esm/data-source/data-source.js.map +0 -1
- package/esm/database-dirty-tracker.d.ts +0 -252
- package/esm/database-dirty-tracker.d.ts.map +0 -1
- package/esm/database-dirty-tracker.js +0 -386
- package/esm/database-dirty-tracker.js.map +0 -1
- package/esm/drivers/mongodb/mongodb-blueprint.d.ts +0 -30
- package/esm/drivers/mongodb/mongodb-blueprint.d.ts.map +0 -1
- package/esm/drivers/mongodb/mongodb-blueprint.js +0 -51
- package/esm/drivers/mongodb/mongodb-blueprint.js.map +0 -1
- package/esm/drivers/mongodb/mongodb-driver.d.ts +0 -324
- package/esm/drivers/mongodb/mongodb-driver.d.ts.map +0 -1
- package/esm/drivers/mongodb/mongodb-driver.js +0 -799
- package/esm/drivers/mongodb/mongodb-driver.js.map +0 -1
- package/esm/drivers/mongodb/mongodb-id-generator.d.ts +0 -116
- package/esm/drivers/mongodb/mongodb-id-generator.d.ts.map +0 -1
- package/esm/drivers/mongodb/mongodb-id-generator.js +0 -149
- package/esm/drivers/mongodb/mongodb-id-generator.js.map +0 -1
- package/esm/drivers/mongodb/mongodb-migration-driver.d.ts +0 -317
- package/esm/drivers/mongodb/mongodb-migration-driver.d.ts.map +0 -1
- package/esm/drivers/mongodb/mongodb-migration-driver.js +0 -666
- package/esm/drivers/mongodb/mongodb-migration-driver.js.map +0 -1
- package/esm/drivers/mongodb/mongodb-query-builder.d.ts +0 -1122
- package/esm/drivers/mongodb/mongodb-query-builder.d.ts.map +0 -1
- package/esm/drivers/mongodb/mongodb-query-builder.js +0 -1988
- package/esm/drivers/mongodb/mongodb-query-builder.js.map +0 -1
- package/esm/drivers/mongodb/mongodb-query-operations.d.ts +0 -226
- package/esm/drivers/mongodb/mongodb-query-operations.d.ts.map +0 -1
- package/esm/drivers/mongodb/mongodb-query-operations.js +0 -270
- package/esm/drivers/mongodb/mongodb-query-operations.js.map +0 -1
- package/esm/drivers/mongodb/mongodb-query-parser.d.ts +0 -262
- package/esm/drivers/mongodb/mongodb-query-parser.d.ts.map +0 -1
- package/esm/drivers/mongodb/mongodb-query-parser.js +0 -1351
- package/esm/drivers/mongodb/mongodb-query-parser.js.map +0 -1
- package/esm/drivers/mongodb/mongodb-sync-adapter.d.ts +0 -79
- package/esm/drivers/mongodb/mongodb-sync-adapter.d.ts.map +0 -1
- package/esm/drivers/mongodb/mongodb-sync-adapter.js +0 -146
- package/esm/drivers/mongodb/mongodb-sync-adapter.js.map +0 -1
- package/esm/drivers/mongodb/types.d.ts +0 -43
- package/esm/drivers/mongodb/types.d.ts.map +0 -1
- package/esm/drivers/postgres/index.d.ts +0 -16
- package/esm/drivers/postgres/index.d.ts.map +0 -1
- package/esm/drivers/postgres/postgres-blueprint.d.ts +0 -64
- package/esm/drivers/postgres/postgres-blueprint.d.ts.map +0 -1
- package/esm/drivers/postgres/postgres-blueprint.js +0 -121
- package/esm/drivers/postgres/postgres-blueprint.js.map +0 -1
- package/esm/drivers/postgres/postgres-dialect.d.ts +0 -136
- package/esm/drivers/postgres/postgres-dialect.d.ts.map +0 -1
- package/esm/drivers/postgres/postgres-dialect.js +0 -268
- package/esm/drivers/postgres/postgres-dialect.js.map +0 -1
- package/esm/drivers/postgres/postgres-driver.d.ts +0 -432
- package/esm/drivers/postgres/postgres-driver.d.ts.map +0 -1
- package/esm/drivers/postgres/postgres-driver.js +0 -965
- package/esm/drivers/postgres/postgres-driver.js.map +0 -1
- package/esm/drivers/postgres/postgres-migration-driver.d.ts +0 -397
- package/esm/drivers/postgres/postgres-migration-driver.d.ts.map +0 -1
- package/esm/drivers/postgres/postgres-migration-driver.js +0 -900
- package/esm/drivers/postgres/postgres-migration-driver.js.map +0 -1
- package/esm/drivers/postgres/postgres-query-builder.d.ts +0 -254
- package/esm/drivers/postgres/postgres-query-builder.d.ts.map +0 -1
- package/esm/drivers/postgres/postgres-query-builder.js +0 -933
- package/esm/drivers/postgres/postgres-query-builder.js.map +0 -1
- package/esm/drivers/postgres/postgres-query-parser.d.ts +0 -328
- package/esm/drivers/postgres/postgres-query-parser.d.ts.map +0 -1
- package/esm/drivers/postgres/postgres-query-parser.js +0 -864
- package/esm/drivers/postgres/postgres-query-parser.js.map +0 -1
- package/esm/drivers/postgres/postgres-sql-serializer.d.ts +0 -37
- package/esm/drivers/postgres/postgres-sql-serializer.d.ts.map +0 -1
- package/esm/drivers/postgres/postgres-sql-serializer.js +0 -400
- package/esm/drivers/postgres/postgres-sql-serializer.js.map +0 -1
- package/esm/drivers/postgres/postgres-sync-adapter.d.ts +0 -83
- package/esm/drivers/postgres/postgres-sync-adapter.d.ts.map +0 -1
- package/esm/drivers/postgres/postgres-sync-adapter.js +0 -197
- package/esm/drivers/postgres/postgres-sync-adapter.js.map +0 -1
- package/esm/drivers/postgres/types.d.ts +0 -142
- package/esm/drivers/postgres/types.d.ts.map +0 -1
- package/esm/drivers/sql/index.d.ts +0 -10
- package/esm/drivers/sql/index.d.ts.map +0 -1
- package/esm/drivers/sql/sql-dialect.contract.d.ts +0 -204
- package/esm/drivers/sql/sql-dialect.contract.d.ts.map +0 -1
- package/esm/drivers/sql/sql-types.d.ts +0 -202
- package/esm/drivers/sql/sql-types.d.ts.map +0 -1
- package/esm/errors/missing-data-source.error.d.ts +0 -22
- package/esm/errors/missing-data-source.error.d.ts.map +0 -1
- package/esm/errors/missing-data-source.error.js +0 -29
- package/esm/errors/missing-data-source.error.js.map +0 -1
- package/esm/errors/transaction-rollback.error.d.ts +0 -20
- package/esm/errors/transaction-rollback.error.d.ts.map +0 -1
- package/esm/errors/transaction-rollback.error.js +0 -27
- package/esm/errors/transaction-rollback.error.js.map +0 -1
- package/esm/events/model-events.d.ts +0 -231
- package/esm/events/model-events.d.ts.map +0 -1
- package/esm/events/model-events.js +0 -259
- package/esm/events/model-events.js.map +0 -1
- package/esm/expressions/aggregate-expressions.d.ts +0 -215
- package/esm/expressions/aggregate-expressions.d.ts.map +0 -1
- package/esm/expressions/aggregate-expressions.js +0 -221
- package/esm/expressions/aggregate-expressions.js.map +0 -1
- package/esm/expressions/index.d.ts +0 -2
- package/esm/expressions/index.d.ts.map +0 -1
- package/esm/index.d.ts +0 -45
- package/esm/index.d.ts.map +0 -1
- package/esm/index.js +0 -1
- package/esm/index.js.map +0 -1
- package/esm/migration/column-builder.d.ts +0 -417
- package/esm/migration/column-builder.d.ts.map +0 -1
- package/esm/migration/column-builder.js +0 -586
- package/esm/migration/column-builder.js.map +0 -1
- package/esm/migration/column-helpers.d.ts +0 -275
- package/esm/migration/column-helpers.d.ts.map +0 -1
- package/esm/migration/column-helpers.js +0 -389
- package/esm/migration/column-helpers.js.map +0 -1
- package/esm/migration/foreign-key-builder.d.ts +0 -103
- package/esm/migration/foreign-key-builder.d.ts.map +0 -1
- package/esm/migration/foreign-key-builder.js +0 -121
- package/esm/migration/foreign-key-builder.js.map +0 -1
- package/esm/migration/index.d.ts +0 -7
- package/esm/migration/index.d.ts.map +0 -1
- package/esm/migration/migration-runner.d.ts +0 -278
- package/esm/migration/migration-runner.d.ts.map +0 -1
- package/esm/migration/migration-runner.js +0 -815
- package/esm/migration/migration-runner.js.map +0 -1
- package/esm/migration/migration.d.ts +0 -1992
- package/esm/migration/migration.d.ts.map +0 -1
- package/esm/migration/migration.js +0 -2162
- package/esm/migration/migration.js.map +0 -1
- package/esm/migration/sql-grammar.d.ts +0 -61
- package/esm/migration/sql-grammar.d.ts.map +0 -1
- package/esm/migration/sql-grammar.js +0 -164
- package/esm/migration/sql-grammar.js.map +0 -1
- package/esm/migration/sql-serializer.d.ts +0 -22
- package/esm/migration/sql-serializer.d.ts.map +0 -1
- package/esm/migration/sql-serializer.js +0 -26
- package/esm/migration/sql-serializer.js.map +0 -1
- package/esm/migration/types.d.ts +0 -155
- package/esm/migration/types.d.ts.map +0 -1
- package/esm/model/methods/accessor-methods.d.ts +0 -13
- package/esm/model/methods/accessor-methods.d.ts.map +0 -1
- package/esm/model/methods/accessor-methods.js +0 -51
- package/esm/model/methods/accessor-methods.js.map +0 -1
- package/esm/model/methods/delete-methods.d.ts +0 -10
- package/esm/model/methods/delete-methods.d.ts.map +0 -1
- package/esm/model/methods/delete-methods.js +0 -10
- package/esm/model/methods/delete-methods.js.map +0 -1
- package/esm/model/methods/dirty-methods.d.ts +0 -10
- package/esm/model/methods/dirty-methods.d.ts.map +0 -1
- package/esm/model/methods/dirty-methods.js +0 -15
- package/esm/model/methods/dirty-methods.js.map +0 -1
- package/esm/model/methods/hydration-methods.d.ts +0 -10
- package/esm/model/methods/hydration-methods.d.ts.map +0 -1
- package/esm/model/methods/hydration-methods.js +0 -57
- package/esm/model/methods/hydration-methods.js.map +0 -1
- package/esm/model/methods/instance-event-methods.d.ts +0 -7
- package/esm/model/methods/instance-event-methods.d.ts.map +0 -1
- package/esm/model/methods/instance-event-methods.js +0 -15
- package/esm/model/methods/instance-event-methods.js.map +0 -1
- package/esm/model/methods/meta-methods.d.ts +0 -7
- package/esm/model/methods/meta-methods.d.ts.map +0 -1
- package/esm/model/methods/meta-methods.js +0 -78
- package/esm/model/methods/meta-methods.js.map +0 -1
- package/esm/model/methods/query-methods.d.ts +0 -24
- package/esm/model/methods/query-methods.d.ts.map +0 -1
- package/esm/model/methods/query-methods.js +0 -161
- package/esm/model/methods/query-methods.js.map +0 -1
- package/esm/model/methods/restore-methods.d.ts +0 -10
- package/esm/model/methods/restore-methods.d.ts.map +0 -1
- package/esm/model/methods/restore-methods.js +0 -13
- package/esm/model/methods/restore-methods.js.map +0 -1
- package/esm/model/methods/scope-methods.d.ts +0 -7
- package/esm/model/methods/scope-methods.d.ts.map +0 -1
- package/esm/model/methods/scope-methods.js +0 -15
- package/esm/model/methods/scope-methods.js.map +0 -1
- package/esm/model/methods/serialization-methods.d.ts +0 -3
- package/esm/model/methods/serialization-methods.d.ts.map +0 -1
- package/esm/model/methods/serialization-methods.js +0 -27
- package/esm/model/methods/serialization-methods.js.map +0 -1
- package/esm/model/methods/static-event-methods.d.ts +0 -9
- package/esm/model/methods/static-event-methods.d.ts.map +0 -1
- package/esm/model/methods/static-event-methods.js +0 -29
- package/esm/model/methods/static-event-methods.js.map +0 -1
- package/esm/model/methods/write-methods.d.ts +0 -10
- package/esm/model/methods/write-methods.d.ts.map +0 -1
- package/esm/model/methods/write-methods.js +0 -52
- package/esm/model/methods/write-methods.js.map +0 -1
- package/esm/model/model.d.ts +0 -1650
- package/esm/model/model.d.ts.map +0 -1
- package/esm/model/model.js +0 -1657
- package/esm/model/model.js.map +0 -1
- package/esm/model/model.types.d.ts +0 -44
- package/esm/model/model.types.d.ts.map +0 -1
- package/esm/model/register-model.d.ts +0 -81
- package/esm/model/register-model.d.ts.map +0 -1
- package/esm/model/register-model.js +0 -94
- package/esm/model/register-model.js.map +0 -1
- package/esm/query-builder/query-builder.d.ts +0 -556
- package/esm/query-builder/query-builder.d.ts.map +0 -1
- package/esm/query-builder/query-builder.js +0 -1070
- package/esm/query-builder/query-builder.js.map +0 -1
- package/esm/relations/helpers.d.ts +0 -156
- package/esm/relations/helpers.d.ts.map +0 -1
- package/esm/relations/helpers.js +0 -201
- package/esm/relations/helpers.js.map +0 -1
- package/esm/relations/index.d.ts +0 -35
- package/esm/relations/index.d.ts.map +0 -1
- package/esm/relations/pivot-operations.d.ts +0 -160
- package/esm/relations/pivot-operations.d.ts.map +0 -1
- package/esm/relations/pivot-operations.js +0 -293
- package/esm/relations/pivot-operations.js.map +0 -1
- package/esm/relations/relation-hydrator.d.ts +0 -68
- package/esm/relations/relation-hydrator.d.ts.map +0 -1
- package/esm/relations/relation-hydrator.js +0 -81
- package/esm/relations/relation-hydrator.js.map +0 -1
- package/esm/relations/relation-loader.d.ts +0 -194
- package/esm/relations/relation-loader.d.ts.map +0 -1
- package/esm/relations/relation-loader.js +0 -466
- package/esm/relations/relation-loader.js.map +0 -1
- package/esm/relations/types.d.ts +0 -306
- package/esm/relations/types.d.ts.map +0 -1
- package/esm/remover/database-remover.d.ts +0 -100
- package/esm/remover/database-remover.d.ts.map +0 -1
- package/esm/remover/database-remover.js +0 -214
- package/esm/remover/database-remover.js.map +0 -1
- package/esm/restorer/database-restorer.d.ts +0 -131
- package/esm/restorer/database-restorer.d.ts.map +0 -1
- package/esm/restorer/database-restorer.js +0 -434
- package/esm/restorer/database-restorer.js.map +0 -1
- package/esm/sql-database-dirty-tracker.d.ts +0 -13
- package/esm/sql-database-dirty-tracker.d.ts.map +0 -1
- package/esm/sql-database-dirty-tracker.js +0 -14
- package/esm/sql-database-dirty-tracker.js.map +0 -1
- package/esm/sync/index.d.ts +0 -12
- package/esm/sync/index.d.ts.map +0 -1
- package/esm/sync/model-events.d.ts +0 -62
- package/esm/sync/model-events.d.ts.map +0 -1
- package/esm/sync/model-events.js +0 -49
- package/esm/sync/model-events.js.map +0 -1
- package/esm/sync/model-sync-operation.d.ts +0 -163
- package/esm/sync/model-sync-operation.d.ts.map +0 -1
- package/esm/sync/model-sync-operation.js +0 -292
- package/esm/sync/model-sync-operation.js.map +0 -1
- package/esm/sync/model-sync.d.ts +0 -130
- package/esm/sync/model-sync.d.ts.map +0 -1
- package/esm/sync/model-sync.js +0 -178
- package/esm/sync/model-sync.js.map +0 -1
- package/esm/sync/sync-context.d.ts +0 -70
- package/esm/sync/sync-context.d.ts.map +0 -1
- package/esm/sync/sync-context.js +0 -101
- package/esm/sync/sync-context.js.map +0 -1
- package/esm/sync/sync-manager.d.ts +0 -213
- package/esm/sync/sync-manager.d.ts.map +0 -1
- package/esm/sync/sync-manager.js +0 -689
- package/esm/sync/sync-manager.js.map +0 -1
- package/esm/sync/types.d.ts +0 -289
- package/esm/sync/types.d.ts.map +0 -1
- package/esm/test-migrations/test-enhanced-features.migration.d.ts +0 -15
- package/esm/test-migrations/test-enhanced-features.migration.d.ts.map +0 -1
- package/esm/types.d.ts +0 -371
- package/esm/types.d.ts.map +0 -1
- package/esm/utils/connect-to-database.d.ts +0 -300
- package/esm/utils/connect-to-database.d.ts.map +0 -1
- package/esm/utils/connect-to-database.js +0 -128
- package/esm/utils/connect-to-database.js.map +0 -1
- package/esm/utils/database-writer.utils.d.ts +0 -15
- package/esm/utils/database-writer.utils.d.ts.map +0 -1
- package/esm/utils/database-writer.utils.js +0 -14
- package/esm/utils/database-writer.utils.js.map +0 -1
- package/esm/utils/define-model.js +0 -100
- package/esm/utils/define-model.js.map +0 -1
- package/esm/utils/is-valid-date-value.d.ts +0 -5
- package/esm/utils/is-valid-date-value.d.ts.map +0 -1
- package/esm/utils/is-valid-date-value.js +0 -25
- package/esm/utils/is-valid-date-value.js.map +0 -1
- package/esm/utils/once-connected.d.ts +0 -146
- package/esm/utils/once-connected.d.ts.map +0 -1
- package/esm/utils/once-connected.js +0 -251
- package/esm/utils/once-connected.js.map +0 -1
- package/esm/validation/database-seal-plugins.d.ts +0 -12
- package/esm/validation/database-seal-plugins.d.ts.map +0 -1
- package/esm/validation/database-seal-plugins.js +0 -1
- package/esm/validation/database-seal-plugins.js.map +0 -1
- package/esm/validation/database-writer-validation-error.d.ts +0 -97
- package/esm/validation/database-writer-validation-error.d.ts.map +0 -1
- package/esm/validation/database-writer-validation-error.js +0 -160
- package/esm/validation/database-writer-validation-error.js.map +0 -1
- package/esm/validation/index.d.ts +0 -3
- package/esm/validation/index.d.ts.map +0 -1
- package/esm/validation/mutators/embed-mutator.d.ts +0 -9
- package/esm/validation/mutators/embed-mutator.d.ts.map +0 -1
- package/esm/validation/mutators/embed-mutator.js +0 -33
- package/esm/validation/mutators/embed-mutator.js.map +0 -1
- package/esm/validation/plugins/embed-validator-plugin.d.ts +0 -24
- package/esm/validation/plugins/embed-validator-plugin.d.ts.map +0 -1
- package/esm/validation/plugins/embed-validator-plugin.js +0 -18
- package/esm/validation/plugins/embed-validator-plugin.js.map +0 -1
- package/esm/validation/rules/database-model-rule.d.ts +0 -7
- package/esm/validation/rules/database-model-rule.d.ts.map +0 -1
- package/esm/validation/rules/database-model-rule.js +0 -27
- package/esm/validation/rules/database-model-rule.js.map +0 -1
- package/esm/validation/transformers/embed-model-transformer.d.ts +0 -3
- package/esm/validation/transformers/embed-model-transformer.d.ts.map +0 -1
- package/esm/validation/transformers/embed-model-transformer.js +0 -18
- package/esm/validation/transformers/embed-model-transformer.js.map +0 -1
- package/esm/validation/validators/embed-validator.d.ts +0 -21
- package/esm/validation/validators/embed-validator.d.ts.map +0 -1
- package/esm/validation/validators/embed-validator.js +0 -43
- package/esm/validation/validators/embed-validator.js.map +0 -1
- package/esm/writer/database-writer.d.ts +0 -181
- package/esm/writer/database-writer.d.ts.map +0 -1
- package/esm/writer/database-writer.js +0 -407
- package/esm/writer/database-writer.js.map +0 -1
|
@@ -1,933 +0,0 @@
|
|
|
1
|
-
'use strict';var dataSourceRegistry=require('../../data-source/data-source-registry.js'),registerModel=require('../../model/register-model.js'),queryBuilder=require('../../query-builder/query-builder.js'),postgresQueryParser=require('./postgres-query-parser.js');/**
|
|
2
|
-
* PostgreSQL Query Builder
|
|
3
|
-
*
|
|
4
|
-
* Extends the pure QueryBuilder base with PostgreSQL-specific execution,
|
|
5
|
-
* SQL generation, relation hydration, and scope management.
|
|
6
|
-
*
|
|
7
|
-
* @module cascade/drivers/postgres
|
|
8
|
-
*/
|
|
9
|
-
// ============================================================================
|
|
10
|
-
// HELPER
|
|
11
|
-
// ============================================================================
|
|
12
|
-
/**
|
|
13
|
-
* Cast an Op[] to PostgresParserOperation[] — the shapes are compatible since
|
|
14
|
-
* both have `type: string` and `data: Record<string, unknown>`.
|
|
15
|
-
*/
|
|
16
|
-
function toParserOps(ops) {
|
|
17
|
-
return ops;
|
|
18
|
-
}
|
|
19
|
-
// ============================================================================
|
|
20
|
-
// POSTGRES QUERY BUILDER
|
|
21
|
-
// ============================================================================
|
|
22
|
-
/**
|
|
23
|
-
* PostgreSQL Query Builder.
|
|
24
|
-
*
|
|
25
|
-
* Collects query operations (via the base class) and delegates SQL generation
|
|
26
|
-
* to `PostgresQueryParser`. Owns execution, hydration, and relation loading.
|
|
27
|
-
*
|
|
28
|
-
* @example
|
|
29
|
-
* ```typescript
|
|
30
|
-
* const users = await User.query()
|
|
31
|
-
* .select(["id", "name", "email"])
|
|
32
|
-
* .where("status", "active")
|
|
33
|
-
* .orderBy("createdAt", "desc")
|
|
34
|
-
* .limit(10)
|
|
35
|
-
* .get();
|
|
36
|
-
* ```
|
|
37
|
-
*/
|
|
38
|
-
class PostgresQueryBuilder extends queryBuilder.QueryBuilder {
|
|
39
|
-
table;
|
|
40
|
-
// ──────────────────────────────────────────────────────────────
|
|
41
|
-
// POSTGRES-SPECIFIC STATE
|
|
42
|
-
// ──────────────────────────────────────────────────────────────
|
|
43
|
-
/** Data source backing this builder. */
|
|
44
|
-
dataSource;
|
|
45
|
-
/** Hydration callback for transforming result rows into model instances. */
|
|
46
|
-
hydrateCallback;
|
|
47
|
-
/** Invoked before query execution. */
|
|
48
|
-
fetchingCallback;
|
|
49
|
-
/** Invoked after fetch but before hydration. */
|
|
50
|
-
hydratingCallback;
|
|
51
|
-
/** Invoked after fetch and hydration. */
|
|
52
|
-
fetchedCallback;
|
|
53
|
-
/**
|
|
54
|
-
* Map of relations registered via `joinWith()`.
|
|
55
|
-
* Keyed by dot-notation path (e.g. "organizationAiModel.aiModel").
|
|
56
|
-
*/
|
|
57
|
-
joinRelations = new Map();
|
|
58
|
-
// ──────────────────────────────────────────────────────────────
|
|
59
|
-
// CONSTRUCTOR
|
|
60
|
-
// ──────────────────────────────────────────────────────────────
|
|
61
|
-
/**
|
|
62
|
-
* @param table - Target table name
|
|
63
|
-
* @param dataSource - Optional (uses default data source from registry if omitted)
|
|
64
|
-
*/
|
|
65
|
-
constructor(table, dataSource) {
|
|
66
|
-
super();
|
|
67
|
-
this.table = table;
|
|
68
|
-
this.dataSource = dataSource ?? dataSourceRegistry.dataSourceRegistry.get();
|
|
69
|
-
}
|
|
70
|
-
// ──────────────────────────────────────────────────────────────
|
|
71
|
-
// DRIVER
|
|
72
|
-
// ──────────────────────────────────────────────────────────────
|
|
73
|
-
get driver() {
|
|
74
|
-
return this.dataSource.driver;
|
|
75
|
-
}
|
|
76
|
-
// ──────────────────────────────────────────────────────────────
|
|
77
|
-
// CLONE
|
|
78
|
-
// ──────────────────────────────────────────────────────────────
|
|
79
|
-
clone() {
|
|
80
|
-
const cloned = new PostgresQueryBuilder(this.table, this.dataSource);
|
|
81
|
-
// Copy base-class state
|
|
82
|
-
cloned.operations = [...this.operations];
|
|
83
|
-
cloned.pendingGlobalScopes = this.pendingGlobalScopes;
|
|
84
|
-
cloned.availableLocalScopes = this.availableLocalScopes;
|
|
85
|
-
cloned.disabledGlobalScopes = new Set(this.disabledGlobalScopes);
|
|
86
|
-
cloned.scopesApplied = this.scopesApplied;
|
|
87
|
-
cloned.eagerLoadRelations = new Map(this.eagerLoadRelations);
|
|
88
|
-
cloned.countRelations = [...this.countRelations];
|
|
89
|
-
cloned.relationDefinitions = this.relationDefinitions;
|
|
90
|
-
cloned.modelClass = this.modelClass;
|
|
91
|
-
// Copy PG-specific state
|
|
92
|
-
cloned.hydrateCallback = this.hydrateCallback;
|
|
93
|
-
cloned.joinRelations = new Map(this.joinRelations);
|
|
94
|
-
return cloned;
|
|
95
|
-
}
|
|
96
|
-
// ============================================================================
|
|
97
|
-
// PG-SPECIFIC FLUENT METHODS
|
|
98
|
-
// ============================================================================
|
|
99
|
-
/**
|
|
100
|
-
* Native-query escape hatch. Passes `operations[]` to the callback for
|
|
101
|
-
* direct manipulation. Use sparingly — only when fluent API is insufficient.
|
|
102
|
-
*
|
|
103
|
-
* @example
|
|
104
|
-
* q.raw(ops => ops.push({ type: "whereRaw", data: { expression: "1=1" } }))
|
|
105
|
-
*/
|
|
106
|
-
raw(callback) {
|
|
107
|
-
callback(this.operations);
|
|
108
|
-
return this;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Record a DISTINCT flag AND auto-select the field(s).
|
|
112
|
-
* In PostgreSQL, DISTINCT ON (col) requires the col to appear in SELECT.
|
|
113
|
-
*
|
|
114
|
-
* @example
|
|
115
|
-
* q.distinctValues("category") // SELECT category … DISTINCT ON (category)
|
|
116
|
-
* q.distinctValues(["category", "status"]) // both fields in DISTINCT ON and SELECT
|
|
117
|
-
*/
|
|
118
|
-
distinctValues(fields) {
|
|
119
|
-
// Record the base DISTINCT flag op
|
|
120
|
-
super.distinctValues(fields);
|
|
121
|
-
// Also add a select for the field(s) so they appear in the SELECT clause
|
|
122
|
-
if (fields) {
|
|
123
|
-
const fieldArr = Array.isArray(fields) ? fields : [fields];
|
|
124
|
-
this.addOperation("select", { fields: fieldArr });
|
|
125
|
-
}
|
|
126
|
-
return this;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Nearest-neighbour vector similarity search via pgvector cosine distance.
|
|
130
|
-
*
|
|
131
|
-
* Adds two operations atomically:
|
|
132
|
-
* 1. `selectRaw` → `1 - (column <=> $n::vector) AS <alias>`
|
|
133
|
-
* Makes the similarity score available on every returned row.
|
|
134
|
-
* 2. `orderByRaw` → `column <=> $n::vector`
|
|
135
|
-
* Tells the PostgreSQL query planner to use the IVFFlat/HNSW vector index.
|
|
136
|
-
* Using the alias in ORDER BY would bypass the index — the raw expression is required.
|
|
137
|
-
*
|
|
138
|
-
* @example
|
|
139
|
-
* ```typescript
|
|
140
|
-
* const results = await Vector.query()
|
|
141
|
-
* .where({ organization_id: "org-123", content_type: "summary" })
|
|
142
|
-
* .nearestTo("embedding", queryEmbedding)
|
|
143
|
-
* .limit(5)
|
|
144
|
-
* .get<VectorRow & { score: number }>();
|
|
145
|
-
* ```
|
|
146
|
-
*/
|
|
147
|
-
nearestTo(column, embedding, alias = "score") {
|
|
148
|
-
// pgvector expects the literal format: [n,n,n,...]
|
|
149
|
-
const literal = `[${embedding.join(",")}]`;
|
|
150
|
-
const quotedCol = this.driver.dialect.quoteIdentifier(column);
|
|
151
|
-
const quotedTable = this.driver.dialect.quoteIdentifier(this.table);
|
|
152
|
-
// 0 — Preserve all table columns.
|
|
153
|
-
// Adding a selectRaw suppresses the parser's "SELECT *" fallback,
|
|
154
|
-
// so we must explicitly include table.* before the score expression.
|
|
155
|
-
this.addOperation("selectRaw", {
|
|
156
|
-
expression: `${quotedTable}.*`,
|
|
157
|
-
bindings: [],
|
|
158
|
-
});
|
|
159
|
-
// 1 — Add similarity score to SELECT
|
|
160
|
-
this.addOperation("selectRaw", {
|
|
161
|
-
expression: `1 - (${quotedCol} <=> ?::vector) AS ${alias}`,
|
|
162
|
-
bindings: [literal],
|
|
163
|
-
});
|
|
164
|
-
// 2 — ORDER BY the raw expression so the vector index is used
|
|
165
|
-
this.addOperation("orderByRaw", {
|
|
166
|
-
expression: `${quotedCol} <=> ?::vector`,
|
|
167
|
-
bindings: [literal],
|
|
168
|
-
});
|
|
169
|
-
return this;
|
|
170
|
-
}
|
|
171
|
-
/** Set a hydration callback that transforms each result row. */
|
|
172
|
-
hydrate(callback) {
|
|
173
|
-
this.hydrateCallback = callback;
|
|
174
|
-
return this;
|
|
175
|
-
}
|
|
176
|
-
/** Register a callback invoked before query execution. */
|
|
177
|
-
onFetching(callback) {
|
|
178
|
-
this.fetchingCallback = callback;
|
|
179
|
-
return () => {
|
|
180
|
-
this.fetchingCallback = undefined;
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
/** Register a callback invoked after fetch but before hydration. */
|
|
184
|
-
onHydrating(callback) {
|
|
185
|
-
this.hydratingCallback = callback;
|
|
186
|
-
return () => {
|
|
187
|
-
this.hydratingCallback = undefined;
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
/** Register a callback invoked after fetch and hydration. */
|
|
191
|
-
onFetched(callback) {
|
|
192
|
-
this.fetchedCallback = callback;
|
|
193
|
-
return () => {
|
|
194
|
-
this.fetchedCallback = undefined;
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
// ============================================================================
|
|
198
|
-
// SCOPES
|
|
199
|
-
// ============================================================================
|
|
200
|
-
/** Apply pending global scopes to the operations list. */
|
|
201
|
-
applyPendingScopes() {
|
|
202
|
-
if (!this.pendingGlobalScopes || this.scopesApplied)
|
|
203
|
-
return;
|
|
204
|
-
const beforeOps = [];
|
|
205
|
-
const afterOps = [];
|
|
206
|
-
for (const [name, { callback, timing }] of this.pendingGlobalScopes) {
|
|
207
|
-
if (this.disabledGlobalScopes.has(name))
|
|
208
|
-
continue;
|
|
209
|
-
const temp = new PostgresQueryBuilder(this.table, this.dataSource);
|
|
210
|
-
callback(temp);
|
|
211
|
-
if (timing === "before") {
|
|
212
|
-
beforeOps.push(...temp.operations);
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
afterOps.push(...temp.operations);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
this.operations = [...beforeOps, ...this.operations, ...afterOps];
|
|
219
|
-
this.scopesApplied = true;
|
|
220
|
-
}
|
|
221
|
-
// ============================================================================
|
|
222
|
-
// WHERE — POSTGRES-SPECIFIC (driver.dialect required)
|
|
223
|
-
// ============================================================================
|
|
224
|
-
/** Array field contains a value (or object with key). */
|
|
225
|
-
whereArrayContains(field, value, key) {
|
|
226
|
-
const quotedField = this.driver.dialect.quoteIdentifier(field);
|
|
227
|
-
if (key) {
|
|
228
|
-
this.addOperation("whereRaw", {
|
|
229
|
-
expression: `${quotedField} @> ?::jsonb`,
|
|
230
|
-
bindings: [JSON.stringify([{ [key]: value }])],
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
this.addOperation("whereRaw", {
|
|
235
|
-
expression: `? = ANY(${quotedField})`,
|
|
236
|
-
bindings: [value],
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
return this;
|
|
240
|
-
}
|
|
241
|
-
/** Array field does NOT contain a value (or object with key). */
|
|
242
|
-
whereArrayNotContains(field, value, key) {
|
|
243
|
-
const quotedField = this.driver.dialect.quoteIdentifier(field);
|
|
244
|
-
if (key) {
|
|
245
|
-
this.addOperation("whereRaw", {
|
|
246
|
-
expression: `NOT (${quotedField} @> ?::jsonb)`,
|
|
247
|
-
bindings: [JSON.stringify([{ [key]: value }])],
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
this.addOperation("whereRaw", {
|
|
252
|
-
expression: `NOT (? = ANY(${quotedField}))`,
|
|
253
|
-
bindings: [value],
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
return this;
|
|
257
|
-
}
|
|
258
|
-
/** Array field contains value OR is empty. */
|
|
259
|
-
whereArrayHasOrEmpty(field, value, key) {
|
|
260
|
-
const quotedField = this.driver.dialect.quoteIdentifier(field);
|
|
261
|
-
if (key) {
|
|
262
|
-
this.addOperation("whereRaw", {
|
|
263
|
-
expression: `(${quotedField} @> ?::jsonb OR ${quotedField} = '[]'::jsonb OR ${quotedField} IS NULL)`,
|
|
264
|
-
bindings: [JSON.stringify([{ [key]: value }])],
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
this.addOperation("whereRaw", {
|
|
269
|
-
expression: `(? = ANY(${quotedField}) OR array_length(${quotedField}, 1) IS NULL)`,
|
|
270
|
-
bindings: [value],
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
return this;
|
|
274
|
-
}
|
|
275
|
-
/** Array field does NOT contain value OR is empty. */
|
|
276
|
-
whereArrayNotHaveOrEmpty(field, value, key) {
|
|
277
|
-
const quotedField = this.driver.dialect.quoteIdentifier(field);
|
|
278
|
-
if (key) {
|
|
279
|
-
this.addOperation("whereRaw", {
|
|
280
|
-
expression: `(NOT (${quotedField} @> ?::jsonb) OR ${quotedField} = '[]'::jsonb OR ${quotedField} IS NULL)`,
|
|
281
|
-
bindings: [JSON.stringify([{ [key]: value }])],
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
this.addOperation("whereRaw", {
|
|
286
|
-
expression: `(NOT (? = ANY(${quotedField})) OR array_length(${quotedField}, 1) IS NULL)`,
|
|
287
|
-
bindings: [value],
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
return this;
|
|
291
|
-
}
|
|
292
|
-
// ============================================================================
|
|
293
|
-
// joinWith — RESOLVE RELATION DEFINITIONS
|
|
294
|
-
// ============================================================================
|
|
295
|
-
/**
|
|
296
|
-
* Load relations via SQL JOINs (single query) with optional per-relation constraints.
|
|
297
|
-
*
|
|
298
|
-
* Supports:
|
|
299
|
-
* - `joinWith("author")` / `joinWith(["author", "category"])`
|
|
300
|
-
* - `joinWith({ actions: q => q.where("status", "pending").limit(5) })`
|
|
301
|
-
* - `joinWith({ organizationAiModel: "id,name", actions: q => q.orderBy("sort_order") })`
|
|
302
|
-
*
|
|
303
|
-
* @example
|
|
304
|
-
* ChatMessage.joinWith({
|
|
305
|
-
* actions: q => q.where("status", "pending").orderBy("sort_order", "asc").limit(5),
|
|
306
|
-
* organizationAiModel: "id,createdAt",
|
|
307
|
-
* })
|
|
308
|
-
*/
|
|
309
|
-
joinWith(...args) {
|
|
310
|
-
const entries = [];
|
|
311
|
-
for (const arg of args) {
|
|
312
|
-
if (typeof arg === "string") {
|
|
313
|
-
entries.push({ path: arg });
|
|
314
|
-
}
|
|
315
|
-
else if (Array.isArray(arg)) {
|
|
316
|
-
for (const rel of arg) {
|
|
317
|
-
entries.push({ path: rel });
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
else if (typeof arg === "object" && arg !== null) {
|
|
321
|
-
for (const [rel, val] of Object.entries(arg)) {
|
|
322
|
-
entries.push({ path: rel, constraint: val });
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
for (const { path, constraint } of entries) {
|
|
327
|
-
// Parse each dot-notation path segment (supports "rel1.rel2" nesting)
|
|
328
|
-
const segments = path.split(".");
|
|
329
|
-
let currentModel = this.modelClass;
|
|
330
|
-
let currentPath = "";
|
|
331
|
-
for (let i = 0; i < segments.length; i++) {
|
|
332
|
-
const rawSeg = segments[i];
|
|
333
|
-
// String shorthand: "relName:col1,col2"
|
|
334
|
-
const colonIdx = rawSeg.indexOf(":");
|
|
335
|
-
const segName = colonIdx === -1 ? rawSeg : rawSeg.slice(0, colonIdx);
|
|
336
|
-
const segColumns = colonIdx === -1
|
|
337
|
-
? undefined
|
|
338
|
-
: rawSeg
|
|
339
|
-
.slice(colonIdx + 1)
|
|
340
|
-
.split(",")
|
|
341
|
-
.filter(Boolean);
|
|
342
|
-
currentPath = currentPath ? `${currentPath}.${segName}` : segName;
|
|
343
|
-
// If already registered, update if new select columns given; advance model
|
|
344
|
-
if (this.joinRelations.has(currentPath)) {
|
|
345
|
-
const existing = this.joinRelations.get(currentPath);
|
|
346
|
-
if (segColumns)
|
|
347
|
-
existing.select = segColumns;
|
|
348
|
-
// Apply constraint only on the deepest segment
|
|
349
|
-
if (i === segments.length - 1 && constraint !== undefined) {
|
|
350
|
-
existing.constraintOps = this._resolveConstraintOps(constraint);
|
|
351
|
-
}
|
|
352
|
-
currentModel =
|
|
353
|
-
typeof existing.model === "string"
|
|
354
|
-
? registerModel.getModelFromRegistry(existing.model)
|
|
355
|
-
: existing.model;
|
|
356
|
-
continue;
|
|
357
|
-
}
|
|
358
|
-
if (!this.relationDefinitions)
|
|
359
|
-
continue;
|
|
360
|
-
const def = (i === 0
|
|
361
|
-
? this.relationDefinitions
|
|
362
|
-
: currentModel?.relations)?.[segName];
|
|
363
|
-
if (!def) {
|
|
364
|
-
throw new Error(`Relation "${segName}" not found on model ${currentModel?.name ?? "unknown"}`);
|
|
365
|
-
}
|
|
366
|
-
// Resolve select columns: colon shorthand > constraint string > def.select
|
|
367
|
-
let selectColumns = segColumns ?? def.select;
|
|
368
|
-
let constraintOps;
|
|
369
|
-
if (i === segments.length - 1 && constraint !== undefined) {
|
|
370
|
-
if (typeof constraint === "string") {
|
|
371
|
-
selectColumns = constraint.split(",").filter(Boolean);
|
|
372
|
-
}
|
|
373
|
-
else {
|
|
374
|
-
constraintOps = this._resolveConstraintOps(constraint);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
const alias = currentPath.replace(/\./g, "_");
|
|
378
|
-
this.joinRelations.set(currentPath, {
|
|
379
|
-
alias,
|
|
380
|
-
type: def.type,
|
|
381
|
-
model: def.model,
|
|
382
|
-
localKey: def.localKey,
|
|
383
|
-
foreignKey: def.foreignKey,
|
|
384
|
-
ownerKey: def.ownerKey,
|
|
385
|
-
parentPath: i > 0 ? currentPath.substring(0, currentPath.lastIndexOf(".")) : null,
|
|
386
|
-
relationName: segName,
|
|
387
|
-
parentModel: currentModel,
|
|
388
|
-
select: selectColumns,
|
|
389
|
-
constraintOps,
|
|
390
|
-
});
|
|
391
|
-
currentModel =
|
|
392
|
-
typeof def.model === "string" ? registerModel.getModelFromRegistry(def.model) : def.model;
|
|
393
|
-
if (!currentModel) {
|
|
394
|
-
throw new Error(`Relation model not found for "${segName}" in "${currentPath}"`);
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
return this;
|
|
399
|
-
}
|
|
400
|
-
/** Run a joinWith constraint callback against a sub-QB and capture its operations. */
|
|
401
|
-
_resolveConstraintOps(constraint) {
|
|
402
|
-
if (typeof constraint === "string")
|
|
403
|
-
return [];
|
|
404
|
-
const sub = new PostgresQueryBuilder("__sub__", this.dataSource);
|
|
405
|
-
constraint(sub);
|
|
406
|
-
return sub.operations;
|
|
407
|
-
}
|
|
408
|
-
// ============================================================================
|
|
409
|
-
// EXECUTION METHODS
|
|
410
|
-
// ============================================================================
|
|
411
|
-
/**
|
|
412
|
-
* Execute the query and return all matching rows.
|
|
413
|
-
*/
|
|
414
|
-
async get() {
|
|
415
|
-
this.applyPendingScopes();
|
|
416
|
-
this._processJoinWithOps();
|
|
417
|
-
this.applyJoinRelations();
|
|
418
|
-
if (this.fetchingCallback) {
|
|
419
|
-
await this.fetchingCallback(this);
|
|
420
|
-
}
|
|
421
|
-
const parser = new postgresQueryParser.PostgresQueryParser({
|
|
422
|
-
table: this.table,
|
|
423
|
-
operations: toParserOps(this.operations),
|
|
424
|
-
});
|
|
425
|
-
const { query = "", bindings = [] } = parser.parse();
|
|
426
|
-
try {
|
|
427
|
-
const result = await this.driver.query(query, bindings);
|
|
428
|
-
let records = result.rows;
|
|
429
|
-
const joinedData = this.extractJoinedRelationData(records);
|
|
430
|
-
if (this.hydratingCallback) {
|
|
431
|
-
await this.hydratingCallback(records, {});
|
|
432
|
-
}
|
|
433
|
-
if (this.hydrateCallback) {
|
|
434
|
-
records = records.map((row, index) => this.hydrateCallback(row, index));
|
|
435
|
-
}
|
|
436
|
-
this.attachJoinedRelations(records, joinedData);
|
|
437
|
-
if (this.fetchedCallback) {
|
|
438
|
-
await this.fetchedCallback(records, {});
|
|
439
|
-
}
|
|
440
|
-
this.operations = [];
|
|
441
|
-
return records;
|
|
442
|
-
}
|
|
443
|
-
catch (error) {
|
|
444
|
-
console.log("Error while executing:", query, bindings);
|
|
445
|
-
console.log("Query Builder Error:", error);
|
|
446
|
-
throw error;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
/** Get first result. */
|
|
450
|
-
async first() {
|
|
451
|
-
const results = await this.limit(1).get();
|
|
452
|
-
return results[0] ?? null;
|
|
453
|
-
}
|
|
454
|
-
/** Get last result (by id desc). */
|
|
455
|
-
async last() {
|
|
456
|
-
const results = await this.orderByDesc("id").limit(1).get();
|
|
457
|
-
return results[0] ?? null;
|
|
458
|
-
}
|
|
459
|
-
/** Get random results. */
|
|
460
|
-
async random(limit) {
|
|
461
|
-
this.orderByRaw("RANDOM()");
|
|
462
|
-
if (limit)
|
|
463
|
-
this.limit(limit);
|
|
464
|
-
return this.get();
|
|
465
|
-
}
|
|
466
|
-
/** Get first or throw. */
|
|
467
|
-
async firstOrFail() {
|
|
468
|
-
const result = await this.first();
|
|
469
|
-
if (!result)
|
|
470
|
-
throw new Error("No records found");
|
|
471
|
-
return result;
|
|
472
|
-
}
|
|
473
|
-
/** Get first or call callback. */
|
|
474
|
-
async firstOr(callback) {
|
|
475
|
-
const result = await this.first();
|
|
476
|
-
return result ?? (await callback());
|
|
477
|
-
}
|
|
478
|
-
/** Get first or return null. */
|
|
479
|
-
async firstOrNull() {
|
|
480
|
-
return this.first();
|
|
481
|
-
}
|
|
482
|
-
/** Get first or return default. */
|
|
483
|
-
async firstOrNew(defaults) {
|
|
484
|
-
const result = await this.first();
|
|
485
|
-
return result ?? defaults;
|
|
486
|
-
}
|
|
487
|
-
/** Find by primary key. */
|
|
488
|
-
async find(id) {
|
|
489
|
-
return this.where("id", id).first();
|
|
490
|
-
}
|
|
491
|
-
/** Count matching rows. */
|
|
492
|
-
async count() {
|
|
493
|
-
this.applyPendingScopes();
|
|
494
|
-
const countOps = toParserOps([
|
|
495
|
-
...this.operations.filter((op) => op.type.includes("where") || op.type.includes("join")),
|
|
496
|
-
{ type: "selectRaw", data: { expression: 'COUNT(*) AS "count"' } },
|
|
497
|
-
]);
|
|
498
|
-
const parser = new postgresQueryParser.PostgresQueryParser({ table: this.table, operations: countOps });
|
|
499
|
-
const { query = "", bindings = [] } = parser.parse();
|
|
500
|
-
const result = await this.driver.query(query, bindings);
|
|
501
|
-
return parseInt(result.rows[0]?.count ?? "0", 10);
|
|
502
|
-
}
|
|
503
|
-
/** SUM a numeric field. */
|
|
504
|
-
async sum(field) {
|
|
505
|
-
this.applyPendingScopes();
|
|
506
|
-
const result = await this.selectRaw(`SUM(${field}) as sum`).first();
|
|
507
|
-
return parseFloat(result?.sum ?? "0");
|
|
508
|
-
}
|
|
509
|
-
/** AVG of a numeric field. */
|
|
510
|
-
async avg(field) {
|
|
511
|
-
this.applyPendingScopes();
|
|
512
|
-
const result = await this.selectRaw(`AVG(${field}) as avg`).first();
|
|
513
|
-
return parseFloat(result?.avg ?? "0");
|
|
514
|
-
}
|
|
515
|
-
/** MIN of a numeric field. */
|
|
516
|
-
async min(field) {
|
|
517
|
-
this.applyPendingScopes();
|
|
518
|
-
const result = await this.selectRaw(`MIN(${field}) as min`).first();
|
|
519
|
-
return parseFloat(result?.min ?? "0");
|
|
520
|
-
}
|
|
521
|
-
/** MAX of a numeric field. */
|
|
522
|
-
async max(field) {
|
|
523
|
-
this.applyPendingScopes();
|
|
524
|
-
const result = await this.selectRaw(`MAX(${field}) as max`).first();
|
|
525
|
-
return parseFloat(result?.max ?? "0");
|
|
526
|
-
}
|
|
527
|
-
/** Get distinct values for a field. */
|
|
528
|
-
async distinct(field) {
|
|
529
|
-
this.distinctValues(field);
|
|
530
|
-
const results = await this.get();
|
|
531
|
-
return results.map((row) => row[field]);
|
|
532
|
-
}
|
|
533
|
-
/** Get array of all values for a single field. */
|
|
534
|
-
async pluck(field) {
|
|
535
|
-
const results = await this.select([field]).get();
|
|
536
|
-
return results.map((row) => row[field]);
|
|
537
|
-
}
|
|
538
|
-
/** Get a single scalar value. */
|
|
539
|
-
async value(field) {
|
|
540
|
-
const result = await this.select([field]).first();
|
|
541
|
-
return result?.[field] ?? null;
|
|
542
|
-
}
|
|
543
|
-
/** Check whether any matching rows exist. */
|
|
544
|
-
async exists() {
|
|
545
|
-
const count = await this.limit(1).count();
|
|
546
|
-
return count > 0;
|
|
547
|
-
}
|
|
548
|
-
/** Check whether NO matching rows exist. */
|
|
549
|
-
async notExists() {
|
|
550
|
-
return !(await this.exists());
|
|
551
|
-
}
|
|
552
|
-
/** COUNT DISTINCT a field. */
|
|
553
|
-
async countDistinct(field) {
|
|
554
|
-
const result = await this.selectRaw(`COUNT(DISTINCT ${field}) as count`).first();
|
|
555
|
-
return parseInt(result?.count ?? "0", 10);
|
|
556
|
-
}
|
|
557
|
-
// ─── Aggregation shortcuts via latest/oldest ─────────────────
|
|
558
|
-
/** Get latest records ordered by a column. */
|
|
559
|
-
async latest(column = "createdAt") {
|
|
560
|
-
return this.orderBy(column, "desc").get();
|
|
561
|
-
}
|
|
562
|
-
// ─── Increment / Decrement ───────────────────────────────────
|
|
563
|
-
/** Increment a numeric field. Returns new value. */
|
|
564
|
-
async increment(field, amount = 1) {
|
|
565
|
-
this.applyPendingScopes();
|
|
566
|
-
const { sql: filterSql, params: filterParams } = this.buildFilter();
|
|
567
|
-
const updateSql = `UPDATE ${this.driver.dialect.quoteIdentifier(this.table)} ` +
|
|
568
|
-
`SET ${this.driver.dialect.quoteIdentifier(field)} = COALESCE(${this.driver.dialect.quoteIdentifier(field)}, 0) + $1 ` +
|
|
569
|
-
(filterSql ? `WHERE ${filterSql.replace("WHERE ", "")} ` : "") +
|
|
570
|
-
`RETURNING ${this.driver.dialect.quoteIdentifier(field)}`;
|
|
571
|
-
const result = await this.driver.query(updateSql, [
|
|
572
|
-
amount,
|
|
573
|
-
...filterParams,
|
|
574
|
-
]);
|
|
575
|
-
return result.rows[0]?.[field] ?? 0;
|
|
576
|
-
}
|
|
577
|
-
/** Decrement a numeric field. Returns new value. */
|
|
578
|
-
async decrement(field, amount = 1) {
|
|
579
|
-
return this.increment(field, -amount);
|
|
580
|
-
}
|
|
581
|
-
/** Increment a field for all matching rows. Returns affected row count. */
|
|
582
|
-
async incrementMany(field, amount = 1) {
|
|
583
|
-
this.applyPendingScopes();
|
|
584
|
-
const { sql: filterSql, params: filterParams } = this.buildFilter();
|
|
585
|
-
const updateSql = `UPDATE ${this.driver.dialect.quoteIdentifier(this.table)} ` +
|
|
586
|
-
`SET ${this.driver.dialect.quoteIdentifier(field)} = COALESCE(${this.driver.dialect.quoteIdentifier(field)}, 0) + $1` +
|
|
587
|
-
(filterSql ? ` WHERE ${filterSql.replace("WHERE ", "")}` : "");
|
|
588
|
-
const result = await this.driver.query(updateSql, [amount, ...filterParams]);
|
|
589
|
-
return result.rowCount ?? 0;
|
|
590
|
-
}
|
|
591
|
-
/** Decrement a field for all matching rows. Returns affected row count. */
|
|
592
|
-
async decrementMany(field, amount = 1) {
|
|
593
|
-
return this.incrementMany(field, -amount);
|
|
594
|
-
}
|
|
595
|
-
// ─── Chunking / Pagination ───────────────────────────────────
|
|
596
|
-
/**
|
|
597
|
-
* Process results in memory-efficient chunks.
|
|
598
|
-
*
|
|
599
|
-
* @example
|
|
600
|
-
* await User.query().chunk(100, async (rows, idx) => { ... })
|
|
601
|
-
*/
|
|
602
|
-
async chunk(size, callback) {
|
|
603
|
-
let chunkIndex = 0;
|
|
604
|
-
let hasMore = true;
|
|
605
|
-
while (hasMore) {
|
|
606
|
-
const chunk = await this.clone()
|
|
607
|
-
.skip(chunkIndex * size)
|
|
608
|
-
.limit(size)
|
|
609
|
-
.get();
|
|
610
|
-
if (chunk.length === 0)
|
|
611
|
-
break;
|
|
612
|
-
const shouldContinue = await callback(chunk, chunkIndex);
|
|
613
|
-
if (shouldContinue === false)
|
|
614
|
-
break;
|
|
615
|
-
hasMore = chunk.length === size;
|
|
616
|
-
chunkIndex++;
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
/** Page-based pagination. */
|
|
620
|
-
async paginate(options) {
|
|
621
|
-
const page = options?.page ?? 1;
|
|
622
|
-
const limit = options?.limit ?? 10;
|
|
623
|
-
const skip = (page - 1) * limit;
|
|
624
|
-
const [data, total] = await Promise.all([
|
|
625
|
-
this.clone().skip(skip).limit(limit).get(),
|
|
626
|
-
this.count(),
|
|
627
|
-
]);
|
|
628
|
-
return {
|
|
629
|
-
data,
|
|
630
|
-
pagination: {
|
|
631
|
-
total,
|
|
632
|
-
page,
|
|
633
|
-
limit,
|
|
634
|
-
pages: Math.ceil(total / limit),
|
|
635
|
-
},
|
|
636
|
-
};
|
|
637
|
-
}
|
|
638
|
-
/**
|
|
639
|
-
* Set cursor pagination hints fluently.
|
|
640
|
-
* The recorded values are picked up by `cursorPaginate()` when no explicit
|
|
641
|
-
* options are passed.
|
|
642
|
-
*
|
|
643
|
-
* @example
|
|
644
|
-
* User.query().cursor(lastId).cursorPaginate({ limit: 20 })
|
|
645
|
-
*/
|
|
646
|
-
cursor(after, before) {
|
|
647
|
-
this.addOperation("cursor", { after, before });
|
|
648
|
-
return this;
|
|
649
|
-
}
|
|
650
|
-
/** Cursor-based pagination. */
|
|
651
|
-
async cursorPaginate(options) {
|
|
652
|
-
// Fall back to fluently-recorded cursor op if options.cursor not provided
|
|
653
|
-
const cursorOp = this.getOps("cursor")[0];
|
|
654
|
-
const recordedCursor = cursorOp?.data.after;
|
|
655
|
-
const { limit = 10, cursor = recordedCursor, column = "id", direction = "next", } = options ?? {};
|
|
656
|
-
if (cursor) {
|
|
657
|
-
this.where(column, direction === "next" ? ">" : "<", cursor);
|
|
658
|
-
}
|
|
659
|
-
this.orderBy(column, direction === "next" ? "asc" : "desc");
|
|
660
|
-
const results = await this.limit(limit + 1).get();
|
|
661
|
-
const hasMore = results.length > limit;
|
|
662
|
-
let data = hasMore ? results.slice(0, limit) : results;
|
|
663
|
-
if (direction === "prev")
|
|
664
|
-
data = data.reverse();
|
|
665
|
-
let nextCursor;
|
|
666
|
-
let prevCursor;
|
|
667
|
-
let hasPrev = false;
|
|
668
|
-
if (data.length > 0) {
|
|
669
|
-
const firstItem = data[0][column];
|
|
670
|
-
const lastItem = data[data.length - 1][column];
|
|
671
|
-
if (direction === "next") {
|
|
672
|
-
nextCursor = hasMore ? lastItem : undefined;
|
|
673
|
-
if (cursor) {
|
|
674
|
-
hasPrev = true;
|
|
675
|
-
prevCursor = firstItem;
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
else {
|
|
679
|
-
prevCursor = hasMore ? firstItem : undefined;
|
|
680
|
-
hasPrev = hasMore;
|
|
681
|
-
if (cursor)
|
|
682
|
-
nextCursor = lastItem;
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
return { data, pagination: { hasMore, hasPrev, nextCursor, prevCursor } };
|
|
686
|
-
}
|
|
687
|
-
// ─── Mutation methods ────────────────────────────────────────
|
|
688
|
-
/** Delete matching rows. Returns deleted count. */
|
|
689
|
-
async delete() {
|
|
690
|
-
this.applyPendingScopes();
|
|
691
|
-
const { sql, params } = this.buildFilter();
|
|
692
|
-
const deleteSql = `DELETE FROM ${this.driver.dialect.quoteIdentifier(this.table)} ${sql}`;
|
|
693
|
-
const result = await this.driver.query(deleteSql, params);
|
|
694
|
-
return result.rowCount ?? 0;
|
|
695
|
-
}
|
|
696
|
-
/** Delete the first matching row. */
|
|
697
|
-
async deleteOne() {
|
|
698
|
-
return this.limit(1).delete();
|
|
699
|
-
}
|
|
700
|
-
/** Update matching rows. */
|
|
701
|
-
async update(fields) {
|
|
702
|
-
this.applyPendingScopes();
|
|
703
|
-
const result = await this.driver.updateMany(this.table, {}, { $set: fields });
|
|
704
|
-
return result.modifiedCount;
|
|
705
|
-
}
|
|
706
|
-
/** Unset fields from matching rows. */
|
|
707
|
-
async unset(...fields) {
|
|
708
|
-
this.applyPendingScopes();
|
|
709
|
-
const updateObj = {};
|
|
710
|
-
for (const field of fields)
|
|
711
|
-
updateObj[field] = 1;
|
|
712
|
-
const result = await this.driver.updateMany(this.table, {}, { $unset: updateObj });
|
|
713
|
-
return result.modifiedCount;
|
|
714
|
-
}
|
|
715
|
-
// ─── Inspection / Debugging ───────────────────────────────────
|
|
716
|
-
/** Return the SQL + bindings without executing. */
|
|
717
|
-
parse() {
|
|
718
|
-
this.applyPendingScopes();
|
|
719
|
-
const parser = new postgresQueryParser.PostgresQueryParser({
|
|
720
|
-
table: this.table,
|
|
721
|
-
operations: toParserOps(this.operations),
|
|
722
|
-
});
|
|
723
|
-
return parser.parse();
|
|
724
|
-
}
|
|
725
|
-
/** Formatted SQL string (for logging/debugging). */
|
|
726
|
-
pretty() {
|
|
727
|
-
const { query = "", bindings } = this.parse();
|
|
728
|
-
return `${query}\n-- Bindings: ${JSON.stringify(bindings ?? [])}`;
|
|
729
|
-
}
|
|
730
|
-
/** Run EXPLAIN ANALYZE on the query. */
|
|
731
|
-
async explain() {
|
|
732
|
-
const { query = "", bindings = [] } = this.parse();
|
|
733
|
-
const result = await this.driver.query(`EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) ${query}`, bindings);
|
|
734
|
-
return result.rows;
|
|
735
|
-
}
|
|
736
|
-
// ─── Utility ──────────────────────────────────────────────────
|
|
737
|
-
/** Extend the builder with a driver-specific extension. */
|
|
738
|
-
extend(extension, ..._args) {
|
|
739
|
-
throw new Error(`Extension "${extension}" is not supported by PostgresQueryBuilder`);
|
|
740
|
-
}
|
|
741
|
-
/** Pluck scalar values for a single field (alias for pluck). */
|
|
742
|
-
async pluckOne(field) {
|
|
743
|
-
const results = await this.select([field]).get();
|
|
744
|
-
return results.map((row) => row[field]);
|
|
745
|
-
}
|
|
746
|
-
// ============================================================================
|
|
747
|
-
// JOIN RELATIONS — INTERNAL PIPELINE
|
|
748
|
-
// ============================================================================
|
|
749
|
-
/**
|
|
750
|
-
* Before `get()` runs the parser, consume any joinWith ops recorded by the base
|
|
751
|
-
* class and expand them into the joinRelations Map.
|
|
752
|
-
*/
|
|
753
|
-
_processJoinWithOps() {
|
|
754
|
-
const joinWithOps = this.operations.filter((op) => op.type === "joinWith");
|
|
755
|
-
if (joinWithOps.length === 0)
|
|
756
|
-
return;
|
|
757
|
-
// Remove joinWith ops from main operations — they are consumed here
|
|
758
|
-
this.operations = this.operations.filter((op) => op.type !== "joinWith");
|
|
759
|
-
for (const op of joinWithOps) {
|
|
760
|
-
const constraints = op.data.constraints;
|
|
761
|
-
for (const [path, constraint] of Object.entries(constraints)) {
|
|
762
|
-
// Re-delegate to the extended joinWith implementation
|
|
763
|
-
if (!constraint || constraint === "") {
|
|
764
|
-
this.joinWith(path);
|
|
765
|
-
}
|
|
766
|
-
else {
|
|
767
|
-
this.joinWith({ [path]: constraint });
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
/**
|
|
773
|
-
* Translate each entry in `joinRelations` into actual JOIN + selectRelatedColumns operations.
|
|
774
|
-
*/
|
|
775
|
-
applyJoinRelations() {
|
|
776
|
-
if (this.joinRelations.size === 0)
|
|
777
|
-
return;
|
|
778
|
-
for (const [path, config] of this.joinRelations) {
|
|
779
|
-
const RelatedModel = typeof config.model === "string"
|
|
780
|
-
? registerModel.getModelFromRegistry(config.model)
|
|
781
|
-
: config.model;
|
|
782
|
-
if (!RelatedModel) {
|
|
783
|
-
throw new Error(`Relation model not found for ${path}`);
|
|
784
|
-
}
|
|
785
|
-
const relatedTable = RelatedModel.table;
|
|
786
|
-
const alias = config.alias;
|
|
787
|
-
const parentTable = config.parentPath
|
|
788
|
-
? this.joinRelations.get(config.parentPath).alias
|
|
789
|
-
: this.table;
|
|
790
|
-
const parentDefTable = config.parentModel?.table ?? this.table;
|
|
791
|
-
let localField;
|
|
792
|
-
let foreignField;
|
|
793
|
-
if (config.type === "belongsTo") {
|
|
794
|
-
localField = config.foreignKey ?? `${config.relationName}Id`;
|
|
795
|
-
foreignField = config.ownerKey ?? "id";
|
|
796
|
-
}
|
|
797
|
-
else {
|
|
798
|
-
localField = config.localKey ?? "id";
|
|
799
|
-
foreignField = config.foreignKey ?? `${parentDefTable.slice(0, -1)}Id`;
|
|
800
|
-
}
|
|
801
|
-
// hasMany uses a correlated subquery in SELECT (no JOIN) to avoid row explosion
|
|
802
|
-
if (config.type !== "hasMany") {
|
|
803
|
-
this.addOperation("leftJoin", {
|
|
804
|
-
table: relatedTable,
|
|
805
|
-
alias,
|
|
806
|
-
localField: `${parentTable}.${localField}`,
|
|
807
|
-
foreignField,
|
|
808
|
-
});
|
|
809
|
-
}
|
|
810
|
-
this.addOperation("selectRelatedColumns", {
|
|
811
|
-
alias,
|
|
812
|
-
relationName: config.relationName,
|
|
813
|
-
path,
|
|
814
|
-
table: relatedTable,
|
|
815
|
-
select: config.select,
|
|
816
|
-
type: config.type,
|
|
817
|
-
foreignKey: foreignField,
|
|
818
|
-
localKey: localField,
|
|
819
|
-
parentTable,
|
|
820
|
-
constraintOps: config.constraintOps, // passed through to parser
|
|
821
|
-
});
|
|
822
|
-
}
|
|
823
|
-
}
|
|
824
|
-
/**
|
|
825
|
-
* Extract per-relation data from raw DB rows (before hydration).
|
|
826
|
-
* Returns a Map of row index → nested relation data tree.
|
|
827
|
-
*/
|
|
828
|
-
extractJoinedRelationData(records) {
|
|
829
|
-
const result = new Map();
|
|
830
|
-
if (this.joinRelations.size === 0)
|
|
831
|
-
return result;
|
|
832
|
-
records.forEach((record, index) => {
|
|
833
|
-
const relationData = {};
|
|
834
|
-
// Process shallower paths first so parents exist before children
|
|
835
|
-
const sortedPaths = Array.from(this.joinRelations.keys()).sort((a, b) => a.split(".").length - b.split(".").length);
|
|
836
|
-
for (const path of sortedPaths) {
|
|
837
|
-
const config = this.joinRelations.get(path);
|
|
838
|
-
const columnName = config.alias;
|
|
839
|
-
const relatedData = record[columnName];
|
|
840
|
-
delete record[columnName];
|
|
841
|
-
const parsedData = relatedData !== null &&
|
|
842
|
-
!(typeof relatedData === "object" &&
|
|
843
|
-
Object.values(relatedData).every((v) => v === null))
|
|
844
|
-
? relatedData
|
|
845
|
-
: null;
|
|
846
|
-
const parts = path.split(".");
|
|
847
|
-
const lastPart = parts.pop();
|
|
848
|
-
let current = relationData;
|
|
849
|
-
for (const part of parts) {
|
|
850
|
-
if (!current[part])
|
|
851
|
-
current[part] = {};
|
|
852
|
-
current = current[part];
|
|
853
|
-
}
|
|
854
|
-
current[lastPart] = parsedData;
|
|
855
|
-
}
|
|
856
|
-
result.set(index, relationData);
|
|
857
|
-
});
|
|
858
|
-
return result;
|
|
859
|
-
}
|
|
860
|
-
/**
|
|
861
|
-
* Attach extracted relation data to hydrated model instances.
|
|
862
|
-
*/
|
|
863
|
-
attachJoinedRelations(records, joinedData) {
|
|
864
|
-
if (this.joinRelations.size === 0)
|
|
865
|
-
return;
|
|
866
|
-
const attachNested = (model, dataTree, currentPath = "") => {
|
|
867
|
-
if (!dataTree || typeof dataTree !== "object")
|
|
868
|
-
return;
|
|
869
|
-
for (const [key, data] of Object.entries(dataTree)) {
|
|
870
|
-
const path = currentPath ? `${currentPath}.${key}` : key;
|
|
871
|
-
const config = this.joinRelations.get(path);
|
|
872
|
-
if (!config)
|
|
873
|
-
continue;
|
|
874
|
-
const m = model;
|
|
875
|
-
if (data === null) {
|
|
876
|
-
m[key] = null;
|
|
877
|
-
m.loadedRelations?.set(key, null);
|
|
878
|
-
continue;
|
|
879
|
-
}
|
|
880
|
-
const RelatedModel = registerModel.resolveModelClass(config.model);
|
|
881
|
-
if (!RelatedModel)
|
|
882
|
-
continue;
|
|
883
|
-
const childKeys = Array.from(this.joinRelations.keys())
|
|
884
|
-
.filter((p) => p.startsWith(`${path}.`))
|
|
885
|
-
.map((p) => p.split(".")[path.split(".").length]);
|
|
886
|
-
if (config.type === "hasMany") {
|
|
887
|
-
const rows = Array.isArray(data) ? data : [];
|
|
888
|
-
const instances = rows.map((row) => {
|
|
889
|
-
const rowData = { ...row };
|
|
890
|
-
for (const childKey of childKeys)
|
|
891
|
-
delete rowData[childKey];
|
|
892
|
-
return RelatedModel.hydrate(rowData);
|
|
893
|
-
});
|
|
894
|
-
m[key] = instances;
|
|
895
|
-
m.loadedRelations?.set(key, instances);
|
|
896
|
-
}
|
|
897
|
-
else {
|
|
898
|
-
const modelData = { ...data };
|
|
899
|
-
for (const childKey of childKeys)
|
|
900
|
-
delete modelData[childKey];
|
|
901
|
-
const relatedInstance = RelatedModel.hydrate(modelData);
|
|
902
|
-
attachNested(relatedInstance, data, path);
|
|
903
|
-
m[key] = relatedInstance;
|
|
904
|
-
m.loadedRelations?.set(key, relatedInstance);
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
-
};
|
|
908
|
-
records.forEach((model, index) => {
|
|
909
|
-
const relationData = joinedData.get(index);
|
|
910
|
-
if (relationData)
|
|
911
|
-
attachNested(model, relationData);
|
|
912
|
-
});
|
|
913
|
-
}
|
|
914
|
-
// ============================================================================
|
|
915
|
-
// INTERNAL HELPERS
|
|
916
|
-
// ============================================================================
|
|
917
|
-
/**
|
|
918
|
-
* Build a WHERE-only SQL fragment from `where*` operations on the current builder.
|
|
919
|
-
* Used by DELETE / UPDATE / increment paths.
|
|
920
|
-
*/
|
|
921
|
-
buildFilter() {
|
|
922
|
-
const whereOps = this.operations.filter((op) => op.type.includes("where") || op.type.includes("Where"));
|
|
923
|
-
if (whereOps.length === 0)
|
|
924
|
-
return { sql: "", params: [] };
|
|
925
|
-
const parser = new postgresQueryParser.PostgresQueryParser({
|
|
926
|
-
table: this.table,
|
|
927
|
-
operations: toParserOps(whereOps),
|
|
928
|
-
});
|
|
929
|
-
const { query = "", bindings = [] } = parser.parse();
|
|
930
|
-
const whereMatch = query.match(/WHERE .+$/);
|
|
931
|
-
return { sql: whereMatch ? whereMatch[0] : "", params: bindings };
|
|
932
|
-
}
|
|
933
|
-
}exports.PostgresQueryBuilder=PostgresQueryBuilder;//# sourceMappingURL=postgres-query-builder.js.map
|