@warlock.js/cascade 5.29.0 → 5.31.0
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/CHANGELOG.md +12 -0
- package/README.md +1 -5
- package/cjs/index.cjs +101 -102
- package/cjs/index.cjs.map +1 -1
- package/esm/context/database-data-source-context.d.mts +1 -1
- package/esm/context/database-data-source-context.d.mts.map +1 -1
- package/esm/context/database-data-source-context.mjs +1 -1
- package/esm/context/database-data-source-context.mjs.map +1 -1
- package/esm/context/database-transaction-context.d.mts +1 -1
- package/esm/context/database-transaction-context.d.mts.map +1 -1
- package/esm/context/database-transaction-context.mjs +1 -1
- package/esm/context/database-transaction-context.mjs.map +1 -1
- package/esm/contracts/database-driver.contract.d.mts +1 -1
- package/esm/contracts/database-driver.contract.d.mts.map +1 -1
- package/esm/contracts/database-id-generator.contract.d.mts +1 -1
- package/esm/contracts/database-id-generator.contract.d.mts.map +1 -1
- package/esm/contracts/database-remover.contract.d.mts +1 -1
- package/esm/contracts/database-remover.contract.d.mts.map +1 -1
- package/esm/contracts/database-restorer.contract.d.mts +1 -1
- package/esm/contracts/database-restorer.contract.d.mts.map +1 -1
- package/esm/contracts/database-writer.contract.d.mts +1 -1
- package/esm/contracts/database-writer.contract.d.mts.map +1 -1
- package/esm/contracts/driver-blueprint.contract.d.mts +1 -1
- package/esm/contracts/driver-blueprint.contract.d.mts.map +1 -1
- package/esm/contracts/migration-driver.contract.d.mts +1 -1
- package/esm/contracts/migration-driver.contract.d.mts.map +1 -1
- package/esm/contracts/query-builder.contract.d.mts +1 -1
- package/esm/contracts/query-builder.contract.d.mts.map +1 -1
- package/esm/contracts/sync-adapter.contract.d.mts +1 -1
- package/esm/contracts/sync-adapter.contract.d.mts.map +1 -1
- package/esm/data-source/data-source-registry.d.mts +1 -1
- package/esm/data-source/data-source-registry.d.mts.map +1 -1
- package/esm/data-source/data-source-registry.mjs +1 -1
- package/esm/data-source/data-source-registry.mjs.map +1 -1
- package/esm/data-source/data-source.d.mts +1 -1
- package/esm/data-source/data-source.d.mts.map +1 -1
- package/esm/data-source/data-source.mjs +1 -1
- package/esm/data-source/data-source.mjs.map +1 -1
- package/esm/database-dirty-tracker.d.mts +1 -1
- package/esm/database-dirty-tracker.d.mts.map +1 -1
- package/esm/database-dirty-tracker.mjs +1 -1
- package/esm/database-dirty-tracker.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-blueprint.mjs +1 -1
- package/esm/drivers/mongodb/mongodb-blueprint.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-driver.d.mts +1 -1
- package/esm/drivers/mongodb/mongodb-driver.d.mts.map +1 -1
- package/esm/drivers/mongodb/mongodb-driver.mjs +1 -1
- package/esm/drivers/mongodb/mongodb-driver.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-id-generator.d.mts +1 -1
- package/esm/drivers/mongodb/mongodb-id-generator.d.mts.map +1 -1
- package/esm/drivers/mongodb/mongodb-id-generator.mjs +1 -1
- package/esm/drivers/mongodb/mongodb-id-generator.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-migration-driver.d.mts +1 -1
- package/esm/drivers/mongodb/mongodb-migration-driver.d.mts.map +1 -1
- package/esm/drivers/mongodb/mongodb-migration-driver.mjs +1 -1
- package/esm/drivers/mongodb/mongodb-migration-driver.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-query-builder.d.mts +1 -1
- package/esm/drivers/mongodb/mongodb-query-builder.d.mts.map +1 -1
- package/esm/drivers/mongodb/mongodb-query-builder.mjs +1 -1
- package/esm/drivers/mongodb/mongodb-query-builder.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-query-operations.d.mts +1 -1
- package/esm/drivers/mongodb/mongodb-query-operations.d.mts.map +1 -1
- package/esm/drivers/mongodb/mongodb-query-operations.mjs +1 -1
- package/esm/drivers/mongodb/mongodb-query-operations.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-query-parser.d.mts +1 -1
- package/esm/drivers/mongodb/mongodb-query-parser.d.mts.map +1 -1
- package/esm/drivers/mongodb/mongodb-query-parser.mjs +1 -1
- package/esm/drivers/mongodb/mongodb-query-parser.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-sync-adapter.d.mts +1 -1
- package/esm/drivers/mongodb/mongodb-sync-adapter.d.mts.map +1 -1
- package/esm/drivers/mongodb/mongodb-sync-adapter.mjs +1 -1
- package/esm/drivers/mongodb/mongodb-sync-adapter.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-update-translator.mjs +1 -1
- package/esm/drivers/mongodb/mongodb-update-translator.mjs.map +1 -1
- package/esm/drivers/mongodb/pipeline-stage-object.mjs +1 -1
- package/esm/drivers/mongodb/pipeline-stage-object.mjs.map +1 -1
- package/esm/drivers/mongodb/types.d.mts +1 -1
- package/esm/drivers/mongodb/types.d.mts.map +1 -1
- package/esm/drivers/postgres/naming.mjs +1 -1
- package/esm/drivers/postgres/naming.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-blueprint.d.mts +1 -1
- package/esm/drivers/postgres/postgres-blueprint.d.mts.map +1 -1
- package/esm/drivers/postgres/postgres-blueprint.mjs +1 -1
- package/esm/drivers/postgres/postgres-blueprint.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-dialect.d.mts +1 -1
- package/esm/drivers/postgres/postgres-dialect.d.mts.map +1 -1
- package/esm/drivers/postgres/postgres-dialect.mjs +1 -1
- package/esm/drivers/postgres/postgres-dialect.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-driver.d.mts +1 -1
- package/esm/drivers/postgres/postgres-driver.d.mts.map +1 -1
- package/esm/drivers/postgres/postgres-driver.mjs +1 -1
- package/esm/drivers/postgres/postgres-driver.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-migration-driver.d.mts +1 -1
- package/esm/drivers/postgres/postgres-migration-driver.d.mts.map +1 -1
- package/esm/drivers/postgres/postgres-migration-driver.mjs +1 -1
- package/esm/drivers/postgres/postgres-migration-driver.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-query-builder.d.mts +1 -1
- package/esm/drivers/postgres/postgres-query-builder.d.mts.map +1 -1
- package/esm/drivers/postgres/postgres-query-builder.mjs +1 -1
- package/esm/drivers/postgres/postgres-query-builder.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-query-parser.d.mts +1 -1
- package/esm/drivers/postgres/postgres-query-parser.d.mts.map +1 -1
- package/esm/drivers/postgres/postgres-query-parser.mjs +1 -2
- package/esm/drivers/postgres/postgres-query-parser.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-sql-serializer.mjs +1 -1
- package/esm/drivers/postgres/postgres-sql-serializer.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-ttl-purge.mjs +1 -1
- package/esm/drivers/postgres/postgres-ttl-purge.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-type-converters.mjs +1 -1
- package/esm/drivers/postgres/postgres-type-converters.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-update-validator.mjs +1 -1
- package/esm/drivers/postgres/postgres-update-validator.mjs.map +1 -1
- package/esm/drivers/postgres/types.d.mts +1 -1
- package/esm/drivers/postgres/types.d.mts.map +1 -1
- package/esm/drivers/sql/sql-dialect.contract.d.mts +1 -1
- package/esm/drivers/sql/sql-dialect.contract.d.mts.map +1 -1
- package/esm/drivers/sql/sql-types.d.mts +1 -1
- package/esm/drivers/sql/sql-types.d.mts.map +1 -1
- package/esm/errors/missing-data-source.error.d.mts +1 -1
- package/esm/errors/missing-data-source.error.d.mts.map +1 -1
- package/esm/errors/missing-data-source.error.mjs +1 -1
- package/esm/errors/missing-data-source.error.mjs.map +1 -1
- package/esm/errors/transaction-rollback.error.d.mts +1 -1
- package/esm/errors/transaction-rollback.error.d.mts.map +1 -1
- package/esm/errors/transaction-rollback.error.mjs +1 -1
- package/esm/errors/transaction-rollback.error.mjs.map +1 -1
- package/esm/errors/undefined-where-value.error.d.mts +1 -1
- package/esm/errors/undefined-where-value.error.d.mts.map +1 -1
- package/esm/errors/undefined-where-value.error.mjs +1 -1
- package/esm/errors/undefined-where-value.error.mjs.map +1 -1
- package/esm/errors/unsafe-filter.error.d.mts +1 -1
- package/esm/errors/unsafe-filter.error.d.mts.map +1 -1
- package/esm/errors/unsafe-filter.error.mjs +1 -1
- package/esm/errors/unsafe-filter.error.mjs.map +1 -1
- package/esm/errors/unsafe-raw-expression.error.d.mts +1 -1
- package/esm/errors/unsafe-raw-expression.error.d.mts.map +1 -1
- package/esm/errors/unsafe-raw-expression.error.mjs +1 -1
- package/esm/errors/unsafe-raw-expression.error.mjs.map +1 -1
- package/esm/errors/unsupported-lean-operation.error.d.mts +1 -1
- package/esm/errors/unsupported-lean-operation.error.d.mts.map +1 -1
- package/esm/errors/unsupported-lean-operation.error.mjs +1 -1
- package/esm/errors/unsupported-lean-operation.error.mjs.map +1 -1
- package/esm/errors/unsupported-lock-for-update.error.d.mts +1 -1
- package/esm/errors/unsupported-lock-for-update.error.d.mts.map +1 -1
- package/esm/errors/unsupported-lock-for-update.error.mjs +1 -1
- package/esm/errors/unsupported-lock-for-update.error.mjs.map +1 -1
- package/esm/errors/unsupported-query-operation.error.d.mts +1 -1
- package/esm/errors/unsupported-query-operation.error.d.mts.map +1 -1
- package/esm/errors/unsupported-query-operation.error.mjs +1 -1
- package/esm/errors/unsupported-query-operation.error.mjs.map +1 -1
- package/esm/errors/unsupported-update-operation.error.d.mts +1 -1
- package/esm/errors/unsupported-update-operation.error.d.mts.map +1 -1
- package/esm/errors/unsupported-update-operation.error.mjs +1 -1
- package/esm/errors/unsupported-update-operation.error.mjs.map +1 -1
- package/esm/events/model-events.d.mts +1 -1
- package/esm/events/model-events.d.mts.map +1 -1
- package/esm/events/model-events.mjs +1 -1
- package/esm/events/model-events.mjs.map +1 -1
- package/esm/expressions/aggregate-expressions.d.mts +1 -1
- package/esm/expressions/aggregate-expressions.d.mts.map +1 -1
- package/esm/expressions/aggregate-expressions.mjs +1 -1
- package/esm/expressions/aggregate-expressions.mjs.map +1 -1
- package/esm/expressions/column-expressions.d.mts +1 -1
- package/esm/expressions/column-expressions.d.mts.map +1 -1
- package/esm/expressions/column-expressions.mjs +1 -1
- package/esm/expressions/column-expressions.mjs.map +1 -1
- package/esm/migration/column-builder.d.mts +1 -1
- package/esm/migration/column-builder.d.mts.map +1 -1
- package/esm/migration/column-builder.mjs +1 -1
- package/esm/migration/column-builder.mjs.map +1 -1
- package/esm/migration/column-helpers.d.mts +1 -1
- package/esm/migration/column-helpers.d.mts.map +1 -1
- package/esm/migration/column-helpers.mjs +1 -1
- package/esm/migration/column-helpers.mjs.map +1 -1
- package/esm/migration/foreign-key-builder.d.mts +1 -1
- package/esm/migration/foreign-key-builder.d.mts.map +1 -1
- package/esm/migration/foreign-key-builder.mjs +1 -1
- package/esm/migration/foreign-key-builder.mjs.map +1 -1
- package/esm/migration/migration-order.mjs +1 -1
- package/esm/migration/migration-order.mjs.map +1 -1
- package/esm/migration/migration-runner.d.mts +1 -1
- package/esm/migration/migration-runner.d.mts.map +1 -1
- package/esm/migration/migration-runner.mjs +1 -1
- package/esm/migration/migration-runner.mjs.map +1 -1
- package/esm/migration/migration.d.mts +1 -1
- package/esm/migration/migration.d.mts.map +1 -1
- package/esm/migration/migration.mjs +1 -1
- package/esm/migration/migration.mjs.map +1 -1
- package/esm/migration/parse-created-at.mjs +1 -1
- package/esm/migration/parse-created-at.mjs.map +1 -1
- package/esm/migration/sql-grammar.mjs +1 -1
- package/esm/migration/sql-grammar.mjs.map +1 -1
- package/esm/migration/sql-serializer.d.mts +1 -1
- package/esm/migration/sql-serializer.d.mts.map +1 -1
- package/esm/migration/sql-serializer.mjs +1 -1
- package/esm/migration/sql-serializer.mjs.map +1 -1
- package/esm/migration/types.d.mts +1 -1
- package/esm/migration/types.d.mts.map +1 -1
- package/esm/model/generate-model-id.mjs +1 -1
- package/esm/model/generate-model-id.mjs.map +1 -1
- package/esm/model/methods/accessor-methods.mjs +1 -1
- package/esm/model/methods/accessor-methods.mjs.map +1 -1
- package/esm/model/methods/delete-methods.mjs +1 -1
- package/esm/model/methods/delete-methods.mjs.map +1 -1
- package/esm/model/methods/dirty-methods.mjs +1 -1
- package/esm/model/methods/dirty-methods.mjs.map +1 -1
- package/esm/model/methods/hydration-methods.mjs +1 -1
- package/esm/model/methods/hydration-methods.mjs.map +1 -1
- package/esm/model/methods/instance-event-methods.mjs +1 -1
- package/esm/model/methods/instance-event-methods.mjs.map +1 -1
- package/esm/model/methods/meta-methods.mjs +1 -1
- package/esm/model/methods/meta-methods.mjs.map +1 -1
- package/esm/model/methods/pivot-methods.mjs +1 -1
- package/esm/model/methods/pivot-methods.mjs.map +1 -1
- package/esm/model/methods/query-methods.mjs +1 -1
- package/esm/model/methods/query-methods.mjs.map +1 -1
- package/esm/model/methods/restore-methods.mjs +1 -1
- package/esm/model/methods/restore-methods.mjs.map +1 -1
- package/esm/model/methods/scope-methods.mjs +1 -1
- package/esm/model/methods/scope-methods.mjs.map +1 -1
- package/esm/model/methods/serialization-methods.mjs +1 -1
- package/esm/model/methods/serialization-methods.mjs.map +1 -1
- package/esm/model/methods/static-event-methods.mjs +1 -1
- package/esm/model/methods/static-event-methods.mjs.map +1 -1
- package/esm/model/methods/write-methods.d.mts +1 -1
- package/esm/model/methods/write-methods.d.mts.map +1 -1
- package/esm/model/methods/write-methods.mjs +1 -1
- package/esm/model/methods/write-methods.mjs.map +1 -1
- package/esm/model/model.d.mts +1 -1
- package/esm/model/model.d.mts.map +1 -1
- package/esm/model/model.mjs +1 -1
- package/esm/model/model.mjs.map +1 -1
- package/esm/model/model.types.d.mts +1 -1
- package/esm/model/model.types.d.mts.map +1 -1
- package/esm/model/register-model.d.mts +1 -1
- package/esm/model/register-model.d.mts.map +1 -1
- package/esm/model/register-model.mjs +1 -1
- package/esm/model/register-model.mjs.map +1 -1
- package/esm/model/relation-decorators.d.mts +1 -1
- package/esm/model/relation-decorators.d.mts.map +1 -1
- package/esm/model/relation-decorators.mjs +1 -1
- package/esm/model/relation-decorators.mjs.map +1 -1
- package/esm/operations/database.d.mts +1 -1
- package/esm/operations/database.d.mts.map +1 -1
- package/esm/operations/database.mjs +1 -1
- package/esm/operations/database.mjs.map +1 -1
- package/esm/operations/migrations.d.mts +1 -1
- package/esm/operations/migrations.d.mts.map +1 -1
- package/esm/operations/migrations.mjs +1 -1
- package/esm/operations/migrations.mjs.map +1 -1
- package/esm/query-builder/lean-records.mjs +1 -1
- package/esm/query-builder/lean-records.mjs.map +1 -1
- package/esm/query-builder/query-builder.d.mts +1 -1
- package/esm/query-builder/query-builder.d.mts.map +1 -1
- package/esm/query-builder/query-builder.mjs +1 -1
- package/esm/query-builder/query-builder.mjs.map +1 -1
- package/esm/relations/key-conventions.mjs +1 -1
- package/esm/relations/key-conventions.mjs.map +1 -1
- package/esm/relations/pivot-operations.d.mts +1 -1
- package/esm/relations/pivot-operations.d.mts.map +1 -1
- package/esm/relations/pivot-operations.mjs +1 -1
- package/esm/relations/pivot-operations.mjs.map +1 -1
- package/esm/relations/relation-hydrator.d.mts +1 -1
- package/esm/relations/relation-hydrator.d.mts.map +1 -1
- package/esm/relations/relation-hydrator.mjs +1 -1
- package/esm/relations/relation-hydrator.mjs.map +1 -1
- package/esm/relations/relation-loader.d.mts +1 -1
- package/esm/relations/relation-loader.d.mts.map +1 -1
- package/esm/relations/relation-loader.mjs +1 -1
- package/esm/relations/relation-loader.mjs.map +1 -1
- package/esm/relations/types.d.mts +1 -1
- package/esm/relations/types.d.mts.map +1 -1
- package/esm/remover/database-remover.d.mts +1 -1
- package/esm/remover/database-remover.d.mts.map +1 -1
- package/esm/remover/database-remover.mjs +1 -1
- package/esm/remover/database-remover.mjs.map +1 -1
- package/esm/restorer/database-restorer.d.mts +1 -1
- package/esm/restorer/database-restorer.d.mts.map +1 -1
- package/esm/restorer/database-restorer.mjs +1 -1
- package/esm/restorer/database-restorer.mjs.map +1 -1
- package/esm/sql-database-dirty-tracker.d.mts +1 -1
- package/esm/sql-database-dirty-tracker.d.mts.map +1 -1
- package/esm/sql-database-dirty-tracker.mjs +1 -1
- package/esm/sql-database-dirty-tracker.mjs.map +1 -1
- package/esm/sync/model-events.mjs +1 -1
- package/esm/sync/model-events.mjs.map +1 -1
- package/esm/sync/model-sync-operation.d.mts +1 -1
- package/esm/sync/model-sync-operation.d.mts.map +1 -1
- package/esm/sync/model-sync-operation.mjs +1 -1
- package/esm/sync/model-sync-operation.mjs.map +1 -1
- package/esm/sync/model-sync.d.mts +1 -1
- package/esm/sync/model-sync.d.mts.map +1 -1
- package/esm/sync/model-sync.mjs +1 -1
- package/esm/sync/model-sync.mjs.map +1 -1
- package/esm/sync/sync-context.d.mts +1 -1
- package/esm/sync/sync-context.d.mts.map +1 -1
- package/esm/sync/sync-context.mjs +1 -1
- package/esm/sync/sync-context.mjs.map +1 -1
- package/esm/sync/sync-fanout.mjs +1 -1
- package/esm/sync/sync-fanout.mjs.map +1 -1
- package/esm/sync/sync-manager.d.mts +1 -1
- package/esm/sync/sync-manager.d.mts.map +1 -1
- package/esm/sync/sync-manager.mjs +1 -1
- package/esm/sync/sync-manager.mjs.map +1 -1
- package/esm/sync/types.d.mts +1 -1
- package/esm/sync/types.d.mts.map +1 -1
- package/esm/transactions/after-commit.d.mts +1 -1
- package/esm/transactions/after-commit.d.mts.map +1 -1
- package/esm/transactions/after-commit.mjs +1 -1
- package/esm/transactions/after-commit.mjs.map +1 -1
- package/esm/types.d.mts +1 -1
- package/esm/types.d.mts.map +1 -1
- package/esm/utils/connect-to-database.d.mts +1 -1
- package/esm/utils/connect-to-database.d.mts.map +1 -1
- package/esm/utils/connect-to-database.mjs +1 -1
- package/esm/utils/connect-to-database.mjs.map +1 -1
- package/esm/utils/database-writer.utils.d.mts +1 -1
- package/esm/utils/database-writer.utils.d.mts.map +1 -1
- package/esm/utils/database-writer.utils.mjs +1 -1
- package/esm/utils/database-writer.utils.mjs.map +1 -1
- package/esm/utils/define-model.d.mts +1 -1
- package/esm/utils/define-model.d.mts.map +1 -1
- package/esm/utils/define-model.mjs +1 -1
- package/esm/utils/define-model.mjs.map +1 -1
- package/esm/utils/escape-regex.d.mts +1 -1
- package/esm/utils/escape-regex.d.mts.map +1 -1
- package/esm/utils/escape-regex.mjs +1 -1
- package/esm/utils/escape-regex.mjs.map +1 -1
- package/esm/utils/is-valid-date-value.mjs +1 -1
- package/esm/utils/is-valid-date-value.mjs.map +1 -1
- package/esm/utils/once-connected.d.mts +1 -1
- package/esm/utils/once-connected.d.mts.map +1 -1
- package/esm/utils/once-connected.mjs +1 -1
- package/esm/utils/once-connected.mjs.map +1 -1
- package/esm/utils/prune-empty-parents.mjs +1 -1
- package/esm/utils/prune-empty-parents.mjs.map +1 -1
- package/esm/utils/sanitize-filter.d.mts +1 -1
- package/esm/utils/sanitize-filter.d.mts.map +1 -1
- package/esm/utils/sanitize-filter.mjs +1 -1
- package/esm/utils/sanitize-filter.mjs.map +1 -1
- package/esm/validation/database-seal-plugins.mjs +1 -1
- package/esm/validation/database-seal-plugins.mjs.map +1 -1
- package/esm/validation/database-writer-validation-error.d.mts +1 -1
- package/esm/validation/database-writer-validation-error.d.mts.map +1 -1
- package/esm/validation/database-writer-validation-error.mjs +1 -1
- package/esm/validation/database-writer-validation-error.mjs.map +1 -1
- package/esm/validation/mutators/embed-mutator.mjs +1 -1
- package/esm/validation/mutators/embed-mutator.mjs.map +1 -1
- package/esm/validation/plugins/database-rules-plugin.d.mts +1 -1
- package/esm/validation/plugins/database-rules-plugin.d.mts.map +1 -1
- package/esm/validation/plugins/database-rules-plugin.mjs +1 -1
- package/esm/validation/plugins/database-rules-plugin.mjs.map +1 -1
- package/esm/validation/plugins/embed-validator-plugin.d.mts +1 -1
- package/esm/validation/plugins/embed-validator-plugin.d.mts.map +1 -1
- package/esm/validation/plugins/embed-validator-plugin.mjs +1 -1
- package/esm/validation/plugins/embed-validator-plugin.mjs.map +1 -1
- package/esm/validation/rules/database-model-rule.mjs +1 -1
- package/esm/validation/rules/database-model-rule.mjs.map +1 -1
- package/esm/validation/rules/exists-rule.mjs +1 -1
- package/esm/validation/rules/exists-rule.mjs.map +1 -1
- package/esm/validation/rules/unique-rule.mjs +1 -1
- package/esm/validation/rules/unique-rule.mjs.map +1 -1
- package/esm/validation/transformers/embed-model-transformer.mjs +1 -1
- package/esm/validation/transformers/embed-model-transformer.mjs.map +1 -1
- package/esm/validation/types.d.mts +1 -1
- package/esm/validation/types.d.mts.map +1 -1
- package/esm/validation/validators/embed-validator.d.mts +1 -1
- package/esm/validation/validators/embed-validator.d.mts.map +1 -1
- package/esm/validation/validators/embed-validator.mjs +1 -1
- package/esm/validation/validators/embed-validator.mjs.map +1 -1
- package/esm/writer/database-writer.d.mts +1 -1
- package/esm/writer/database-writer.d.mts.map +1 -1
- package/esm/writer/database-writer.mjs +1 -1
- package/esm/writer/database-writer.mjs.map +1 -1
- package/llms-full.txt +541 -434
- package/package.json +7 -6
- package/skills/aggregate-data/SKILL.md +28 -17
- package/skills/alter-migration/SKILL.md +325 -233
- package/skills/cascade-basics/SKILL.md +19 -19
- package/skills/configure-delete-strategy/SKILL.md +11 -11
- package/skills/define-model/SKILL.md +19 -17
- package/skills/define-relations/SKILL.md +13 -18
- package/skills/index.md +3 -0
- package/skills/manage-transactions/SKILL.md +18 -12
- package/skills/paginate-results/SKILL.md +6 -8
- package/skills/perform-atomic-ops/SKILL.md +26 -21
- package/skills/query-data/SKILL.md +27 -33
- package/skills/run-cascade-cli/SKILL.md +11 -10
- package/skills/search-by-vector/SKILL.md +8 -5
- package/skills/subscribe-to-model-events/SKILL.md +17 -17
- package/skills/track-changes/SKILL.md +9 -9
- package/skills/write-migration/SKILL.md +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb-sync-adapter.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"mongodb-sync-adapter.d.mts","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/mongodb/mongodb-sync-adapter.ts"],"mappings":";;;;;;;;;cAca,gBAAA,YAA4B,mBAAA;EAAA,iBACtB,MAAA;EADsB;;;;;cAQpB,MAAA,EAAQ,aAAA;EAAA;;;;;;EAUd,YAAA,CAAa,YAAA,EAAc,eAAA,KAAoB,OAAA;EAqBvB;;;;;;;EAAxB,UAAA,CAAW,WAAA,EAAa,eAAA,GAAkB,OAAA;EA0DzC;;;;AAkEwB;;;EA3GzB,kBAAA,CAAmB,WAAA,EAAa,eAAA,GAAkB,OAAA;;;;;;;;UA4BvD,wBAAA;;;;;;;;UAaM,uBAAA;;;;;;;;;;UAyCN,oBAAA;;;;;;;;UAyBA,8BAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb-sync-adapter.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"mongodb-sync-adapter.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/mongodb/mongodb-sync-adapter.ts"],"sourcesContent":["/**\n * MongoDB-specific sync adapter implementation.\n *\n * @module cascade-next/drivers/mongodb/mongodb-sync-adapter\n */\n\nimport type { SyncAdapterContract, SyncInstruction } from \"../../contracts/sync-adapter.contract\";\nimport type { MongoDbDriver } from \"./mongodb-driver\";\n\n/**\n * MongoDB implementation of the sync adapter.\n * Handles array updates using positional operators and arrayFilters.\n * Automatically participates in active transactions via the driver's session context.\n */\nexport class MongoSyncAdapter implements SyncAdapterContract {\n private readonly driver: MongoDbDriver;\n\n /**\n * Creates a new MongoDB sync adapter.\n *\n * @param driver - The MongoDB driver instance (provides session-aware operations)\n */\n public constructor(driver: MongoDbDriver) {\n this.driver = driver;\n }\n\n /**\n * Executes a batch of sync instructions.\n *\n * @param instructions - Array of sync instructions\n * @returns Total number of documents affected\n */\n public async executeBatch(instructions: SyncInstruction[]): Promise<number> {\n let totalAffected = 0;\n\n for (const instruction of instructions) {\n const affected = instruction.isArrayUpdate\n ? await this.executeArrayUpdate(instruction)\n : await this.executeOne(instruction);\n\n totalAffected += affected;\n }\n\n return totalAffected;\n }\n\n /**\n * Executes a single sync instruction.\n * Uses the driver's updateMany to automatically participate in active transactions.\n *\n * @param instruction - The sync instruction\n * @returns Number of documents affected\n */\n public async executeOne(instruction: SyncInstruction): Promise<number> {\n const result = await this.driver.updateMany(\n instruction.targetTable,\n instruction.filter,\n instruction.update,\n );\n\n return result.modifiedCount;\n }\n\n /**\n * Executes an array update using MongoDB positional operators.\n * Uses the driver's updateMany to automatically participate in active transactions.\n *\n * @param instruction - The sync instruction with array info\n * @returns Number of documents affected\n */\n public async executeArrayUpdate(instruction: SyncInstruction): Promise<number> {\n if (!instruction.arrayField || !instruction.identifierField) {\n throw new Error(\"Array update requires arrayField and identifierField to be specified\");\n }\n\n // Strategy 1: Try positional operator $ (simpler, faster)\n // Works when filter already identifies the array element\n if (this.canUsePositionalOperator(instruction)) {\n const result = await this.driver.updateMany(\n instruction.targetTable,\n instruction.filter,\n instruction.update,\n );\n return result.modifiedCount;\n }\n\n // Strategy 2: Use arrayFilters (more flexible)\n // Works for any array update scenario\n return await this.executeWithArrayFilters(instruction);\n }\n\n /**\n * Checks if positional operator $ can be used.\n * Requires filter to already match the array element.\n *\n * @param instruction - The sync instruction\n * @returns True if positional operator can be used\n */\n private canUsePositionalOperator(instruction: SyncInstruction): boolean {\n // Check if filter already includes array element match\n const arrayElementFilter = `${instruction.arrayField}.${instruction.identifierField}`;\n return arrayElementFilter in instruction.filter;\n }\n\n /**\n * Executes array update using arrayFilters.\n * Uses the driver's updateMany with arrayFilters option to participate in transactions.\n *\n * @param instruction - The sync instruction\n * @returns Number of documents affected\n */\n private async executeWithArrayFilters(instruction: SyncInstruction): Promise<number> {\n // Build arrayFilters to match array elements\n const arrayFilters = [\n {\n [`elem.${instruction.identifierField}`]: instruction.identifierValue,\n },\n ];\n\n // Transform update to use array filter placeholder\n const transformedUpdate = this.transformUpdateForArrayFilters(\n instruction.update,\n instruction.arrayField!,\n );\n\n // Build optimized filter to reduce documents scanned\n const optimizedFilter = this.buildOptimizedFilter(\n instruction.filter,\n instruction.arrayField!,\n instruction.identifierField!,\n );\n\n // Use driver's updateMany (session-aware) with arrayFilters\n const result = await this.driver.updateMany(\n instruction.targetTable,\n optimizedFilter,\n transformedUpdate,\n { arrayFilters },\n );\n\n return result.modifiedCount;\n }\n\n /**\n * Builds an optimized filter to reduce the number of documents scanned.\n * Adds array existence check when filter doesn't already match array elements.\n *\n * @param originalFilter - The original filter from the instruction\n * @param arrayField - The array field path\n * @param identifierField - The identifier field within array elements\n * @returns Optimized filter\n */\n private buildOptimizedFilter(\n originalFilter: Record<string, unknown>,\n arrayField: string,\n identifierField: string,\n ): Record<string, unknown> {\n // If filter already has array element match, use it as-is\n const arrayElementFilter = `${arrayField}.${identifierField}`;\n if (arrayElementFilter in originalFilter) {\n return originalFilter;\n }\n\n // Otherwise, add array existence check to avoid full collection scan\n return {\n ...originalFilter,\n [arrayField]: { $exists: true, $ne: [] }, // Array exists and not empty\n };\n }\n\n /**\n * Transforms update operation to use arrayFilters placeholder.\n *\n * @param update - Original update operation\n * @param arrayField - Array field path\n * @returns Transformed update operation\n */\n private transformUpdateForArrayFilters(\n update: Record<string, unknown>,\n arrayField: string,\n ): Record<string, unknown> {\n const transformed: Record<string, unknown> = {};\n\n for (const [operator, fields] of Object.entries(update)) {\n if (typeof fields === \"object\" && fields !== null) {\n const transformedFields: Record<string, unknown> = {};\n\n for (const [field, value] of Object.entries(fields)) {\n // Replace positional $ with arrayFilters placeholder $[elem]\n const transformedField = field.replace(`${arrayField}.$`, `${arrayField}.$[elem]`);\n transformedFields[transformedField] = value;\n }\n\n transformed[operator] = transformedFields;\n }\n }\n\n return transformed;\n }\n}\n"],"mappings":";;;;;;AAcA,IAAa,mBAAb,MAA6D;CAC3D,AAAiB;;;;;;CAOjB,AAAO,YAAY,QAAuB;EACxC,KAAK,SAAS;CAChB;;;;;;;CAQA,MAAa,aAAa,cAAkD;EAC1E,IAAI,gBAAgB;EAEpB,KAAK,MAAM,eAAe,cAAc;GACtC,MAAM,WAAW,YAAY,gBACzB,MAAM,KAAK,mBAAmB,WAAW,IACzC,MAAM,KAAK,WAAW,WAAW;GAErC,iBAAiB;EACnB;EAEA,OAAO;CACT;;;;;;;;CASA,MAAa,WAAW,aAA+C;EAOrE,QAAO,MANc,KAAK,OAAO,WAC/B,YAAY,aACZ,YAAY,QACZ,YAAY,MACd,EAEa,CAAC;CAChB;;;;;;;;CASA,MAAa,mBAAmB,aAA+C;EAC7E,IAAI,CAAC,YAAY,cAAc,CAAC,YAAY,iBAC1C,MAAM,IAAI,MAAM,sEAAsE;EAKxF,IAAI,KAAK,yBAAyB,WAAW,GAM3C,QAAO,MALc,KAAK,OAAO,WAC/B,YAAY,aACZ,YAAY,QACZ,YAAY,MACd,EACa,CAAC;EAKhB,OAAO,MAAM,KAAK,wBAAwB,WAAW;CACvD;;;;;;;;CASA,AAAQ,yBAAyB,aAAuC;EAGtE,OAAO,GADuB,YAAY,WAAW,GAAG,YAAY,qBACvC,YAAY;CAC3C;;;;;;;;CASA,MAAc,wBAAwB,aAA+C;EAEnF,MAAM,eAAe,CACnB,GACG,QAAQ,YAAY,oBAAoB,YAAY,gBACvD,CACF;EAGA,MAAM,oBAAoB,KAAK,+BAC7B,YAAY,QACZ,YAAY,UACd;EAGA,MAAM,kBAAkB,KAAK,qBAC3B,YAAY,QACZ,YAAY,YACZ,YAAY,eACd;EAUA,QAAO,MAPc,KAAK,OAAO,WAC/B,YAAY,aACZ,iBACA,mBACA,EAAE,aAAa,CACjB,EAEa,CAAC;CAChB;;;;;;;;;;CAWA,AAAQ,qBACN,gBACA,YACA,iBACyB;EAGzB,IAAI,GAD0B,WAAW,GAAG,qBAClB,gBACxB,OAAO;EAIT,OAAO;GACL,GAAG;IACF,aAAa;IAAE,SAAS;IAAM,KAAK,CAAC;GAAE;EACzC;CACF;;;;;;;;CASA,AAAQ,+BACN,QACA,YACyB;EACzB,MAAM,cAAuC,CAAC;EAE9C,KAAK,MAAM,CAAC,UAAU,WAAW,OAAO,QAAQ,MAAM,GACpD,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM;GACjD,MAAM,oBAA6C,CAAC;GAEpD,KAAK,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ,MAAM,GAAG;IAEnD,MAAM,mBAAmB,MAAM,QAAQ,GAAG,WAAW,KAAK,GAAG,WAAW,SAAS;IACjF,kBAAkB,oBAAoB;GACxC;GAEA,YAAY,YAAY;EAC1B;EAGF,OAAO;CACT;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb-update-translator.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"mongodb-update-translator.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/mongodb/mongodb-update-translator.ts"],"sourcesContent":["import type { AtomicUpdate } from \"../../contracts\";\n\n/**\n * Translate cascade's driver-agnostic update into MongoDB's native form.\n *\n * Every operator is native except `$dec`, which MongoDB does not have: it is\n * folded into `$inc` with negated amounts. A pipeline (array-form) update is\n * returned untouched.\n *\n * @param update - Operator object or aggregation pipeline\n * @returns The update MongoDB accepts\n */\nexport function toMongoUpdate(\n update: AtomicUpdate,\n): Record<string, unknown> | Record<string, unknown>[] {\n if (Array.isArray(update) || !update.$dec) {\n return update as Record<string, unknown> | Record<string, unknown>[];\n }\n\n const { $dec, ...rest } = update;\n const increments: Record<string, number> = { ...rest.$inc };\n\n for (const [field, amount] of Object.entries($dec)) {\n increments[field] = (increments[field] ?? 0) - amount;\n }\n\n return { ...rest, $inc: increments };\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,cACd,QACqD;CACrD,IAAI,MAAM,QAAQ,MAAM,KAAK,CAAC,OAAO,MACnC,OAAO;CAGT,MAAM,EAAE,MAAM,GAAG,SAAS;CAC1B,MAAM,aAAqC,EAAE,GAAG,KAAK,KAAK;CAE1D,KAAK,MAAM,CAAC,OAAO,WAAW,OAAO,QAAQ,IAAI,GAC/C,WAAW,UAAU,WAAW,UAAU,KAAK;CAGjD,OAAO;EAAE,GAAG;EAAM,MAAM;CAAW;AACrC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region
|
|
1
|
+
//#region ../../packages/cascade/src/drivers/mongodb/pipeline-stage-object.ts
|
|
2
2
|
/**
|
|
3
3
|
* Whether a value looks like one MongoDB aggregation stage: a plain object
|
|
4
4
|
* with exactly one key, and that key is a `$`-prefixed stage name
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-stage-object.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"pipeline-stage-object.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/mongodb/pipeline-stage-object.ts"],"sourcesContent":["/**\n * Whether a value looks like one MongoDB aggregation stage: a plain object\n * with exactly one key, and that key is a `$`-prefixed stage name\n * (`{ $lookup: { ... } }`, `{ $addFields: { ... } }`).\n *\n * Used to validate caller-built stages (`joinRaw()`, `raw()` results) before\n * they reach the pipeline, so a SQL string or a filter object is rejected with\n * a named error instead of failing at execution time or being ignored.\n *\n * @param value - The candidate stage\n * @returns `true` when the value is a single-stage object\n */\nexport function isPipelineStageObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n if (prototype !== Object.prototype && prototype !== null) {\n return false;\n }\n\n const keys = Object.keys(value);\n\n return keys.length === 1 && keys[0]!.startsWith(\"$\");\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,SAAgB,sBAAsB,OAAkD;CACtF,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GACpE,OAAO;CAGT,MAAM,YAAY,OAAO,eAAe,KAAK;CAE7C,IAAI,cAAc,OAAO,aAAa,cAAc,MAClD,OAAO;CAGT,MAAM,OAAO,OAAO,KAAK,KAAK;CAE9B,OAAO,KAAK,WAAW,KAAK,KAAK,EAAE,CAAE,WAAW,GAAG;AACrD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/mongodb/types.ts"],"mappings":";;;;;AAKA;KAAY,aAAA;;;AAAa;AAsBzB;;;;;;KAAY,SAAA;EAMV,8DAJA,KAAA,EAAO,aAAa,EAMhB;EAJJ,SAAA,WAaU;EAXV,IAAA;EAEA,IAAA;AAAA;;;;;AA2BuC;;KAlB7B,kBAAA;;;;;;EAMV,cAAA;;;;;EAMA,iBAAA;;;;;EAMA,kBAAA,GAAqB,kBAAkB;AAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region
|
|
1
|
+
//#region ../../packages/cascade/src/drivers/postgres/naming.ts
|
|
2
2
|
/** Convert a JavaScript camelCase key to a PostgreSQL snake_case column name. */
|
|
3
3
|
function camelToSnake(value) {
|
|
4
4
|
if (value === "*" || value.includes("_")) return value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"naming.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/naming.ts"],"sourcesContent":["/** Convert a JavaScript camelCase key to a PostgreSQL snake_case column name. */\nexport function camelToSnake(value: string): string {\n if (value === \"*\" || value.includes(\"_\")) return value;\n\n return (value.match(/[A-Z]+(?=[A-Z][a-z]|\\d|$)|[A-Z]?[a-z]+|\\d+/g) ?? [value])\n .map((part) => part.toLowerCase())\n .join(\"_\");\n}\n\n/** Convert a PostgreSQL snake_case column name to a JavaScript camelCase key. */\nexport function snakeToCamel(value: string): string {\n return value.replace(/_([a-z0-9])/g, (_match, character: string) => character.toUpperCase());\n}\n\n/** Convert top-level database row keys without rewriting nested JSON values. */\nexport function snakeKeysToCamel<T extends Record<string, unknown>>(\n row: T,\n): Record<string, unknown> {\n return Object.fromEntries(Object.entries(row).map(([key, value]) => [snakeToCamel(key), value]));\n}\n"],"mappings":";;AACA,SAAgB,aAAa,OAAuB;CAClD,IAAI,UAAU,OAAO,MAAM,SAAS,GAAG,GAAG,OAAO;CAEjD,QAAQ,MAAM,MAAM,6CAA6C,KAAK,CAAC,KAAK,EAAC,CAC1E,KAAK,SAAS,KAAK,YAAY,CAAC,CAAC,CACjC,KAAK,GAAG;AACb;;AAGA,SAAgB,aAAa,OAAuB;CAClD,OAAO,MAAM,QAAQ,iBAAiB,QAAQ,cAAsB,UAAU,YAAY,CAAC;AAC7F;;AAGA,SAAgB,iBACd,KACyB;CACzB,OAAO,OAAO,YAAY,OAAO,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,aAAa,GAAG,GAAG,KAAK,CAAC,CAAC;AACjG"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DriverBlueprintContract, TableIndexInformation } from "../../contracts/driver-blueprint.contract.mjs";
|
|
2
2
|
import { PostgresDriver } from "./postgres-driver.mjs";
|
|
3
3
|
|
|
4
|
-
//#region
|
|
4
|
+
//#region ../../packages/cascade/src/drivers/postgres/postgres-blueprint.d.ts
|
|
5
5
|
/**
|
|
6
6
|
* PostgreSQL Blueprint.
|
|
7
7
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-blueprint.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"postgres-blueprint.d.mts","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/postgres-blueprint.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;cAgCa,iBAAA,YAA6B,uBAAA;EAAA,iBAMJ,MAAA;EAiFK;;;;;cAjFL,MAAA,EAAQ,cAAA;;;;;;EAO/B,UAAA,IAAc,OAAA;;;;;;;EAkBd,WAAA,CAAY,KAAA,WAAgB,OAAA,CAAQ,qBAAA;;;;;;;EAwDpC,WAAA,CAAY,KAAA,WAAgB,OAAA;;;;;;;EAmB5B,WAAA,CAAY,KAAA,WAAgB,OAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-blueprint.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"postgres-blueprint.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/postgres-blueprint.ts"],"sourcesContent":["/**\n * PostgreSQL Blueprint\n *\n * Implements the DriverBlueprintContract for querying PostgreSQL\n * information schema metadata.\n *\n * @module cascade/drivers/postgres\n */\n\nimport type {\n DriverBlueprintContract,\n TableIndexInformation,\n} from \"../../contracts/driver-blueprint.contract\";\nimport type { PostgresDriver } from \"./postgres-driver\";\n\n/**\n * PostgreSQL Blueprint.\n *\n * Provides methods for introspecting the database schema\n * via PostgreSQL's information_schema and pg_catalog.\n *\n * @example\n * ```typescript\n * const blueprint = driver.blueprint;\n *\n * // Get all tables\n * const tables = await blueprint.listTables();\n *\n * // Get columns for a table\n * const columns = await blueprint.listColumns('users');\n * ```\n */\nexport class PostgresBlueprint implements DriverBlueprintContract {\n /**\n * Create a new blueprint.\n *\n * @param driver - The PostgreSQL driver instance\n */\n public constructor(private readonly driver: PostgresDriver) {}\n\n /**\n * Get all table names in the database.\n *\n * @returns Array of table names\n */\n public async listTables(): Promise<string[]> {\n const result = await this.driver.query<{ table_name: string }>(\n `SELECT table_name \n FROM information_schema.tables \n WHERE table_schema = current_schema() \n AND table_type = 'BASE TABLE'\n ORDER BY table_name`,\n );\n\n return result.rows.map((row) => row.table_name);\n }\n\n /**\n * Get all indexes for a table.\n *\n * @param table - Table name\n * @returns Array of index information\n */\n public async listIndexes(table: string): Promise<TableIndexInformation[]> {\n const result = await this.driver.query<{\n indexname: string;\n indexdef: string;\n }>(\n `SELECT indexname, indexdef\n FROM pg_indexes\n WHERE schemaname = current_schema()\n AND tablename = $1`,\n [table],\n );\n\n return result.rows.map((row) => {\n const isUnique = row.indexdef.includes(\"UNIQUE\");\n const isPrimary = row.indexname.endsWith(\"_pkey\");\n\n // Extract columns from indexdef\n const columnsMatch = row.indexdef.match(/\\(([^)]+)\\)/);\n // Capture group 1 is present whenever the pattern matched, but that is a\n // property of the regex literal rather than of this expression. `?? \"\"`\n // yields the empty column list the `: []` branch already gives.\n const columns = (columnsMatch?.[1] ?? \"\")\n .split(\",\")\n .map((c) => c.trim().replace(/\"/g, \"\"))\n .filter(Boolean);\n\n // Determine index type\n let type = \"btree\"; // default\n if (row.indexdef.includes(\"USING GIN\")) type = \"gin\";\n else if (row.indexdef.includes(\"USING GIST\")) type = \"gist\";\n else if (row.indexdef.includes(\"USING HASH\")) type = \"hash\";\n else if (row.indexdef.includes(\"USING ivfflat\")) type = \"ivfflat\";\n\n // Check for partial index\n const isPartial = row.indexdef.includes(\"WHERE\");\n\n return {\n name: row.indexname,\n columns,\n type,\n unique: isUnique || isPrimary,\n partial: isPartial,\n options: {\n primary: isPrimary,\n definition: row.indexdef,\n },\n };\n });\n }\n\n /**\n * Get all column names for a table.\n *\n * @param table - Table name\n * @returns Array of column names\n */\n public async listColumns(table: string): Promise<string[]> {\n const result = await this.driver.query<{ column_name: string }>(\n `SELECT column_name\n FROM information_schema.columns\n WHERE table_schema = current_schema()\n AND table_name = $1\n ORDER BY ordinal_position`,\n [table],\n );\n\n return result.rows.map((row) => row.column_name);\n }\n\n /**\n * Check if a table exists.\n *\n * @param table - Table name\n * @returns Whether the table exists\n */\n public async tableExists(table: string): Promise<boolean> {\n const result = await this.driver.query<{ exists: boolean }>(\n `SELECT EXISTS (\n SELECT FROM information_schema.tables \n WHERE table_schema = current_schema() \n AND table_name = $1\n )`,\n [table],\n );\n\n return result.rows[0]?.exists ?? false;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAgCA,IAAa,oBAAb,MAAkE;CAM5B;;;;;;CAApC,AAAO,YAAY,AAAiB,QAAwB;EAAxB;CAAyB;;;;;;CAO7D,MAAa,aAAgC;EAS3C,QAAO,MARc,KAAK,OAAO,MAC/B;;;;2BAKF,EAEa,CAAC,KAAK,KAAK,QAAQ,IAAI,UAAU;CAChD;;;;;;;CAQA,MAAa,YAAY,OAAiD;EAYxE,QAAO,MAXc,KAAK,OAAO,MAI/B;;;4BAIA,CAAC,KAAK,CACR,EAEa,CAAC,KAAK,KAAK,QAAQ;GAC9B,MAAM,WAAW,IAAI,SAAS,SAAS,QAAQ;GAC/C,MAAM,YAAY,IAAI,UAAU,SAAS,OAAO;GAOhD,MAAM,WAJe,IAAI,SAAS,MAAM,aAIZ,CAAC,GAAG,MAAM,GAAE,CACrC,MAAM,GAAG,CAAC,CACV,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CACtC,OAAO,OAAO;GAGjB,IAAI,OAAO;GACX,IAAI,IAAI,SAAS,SAAS,WAAW,GAAG,OAAO;QAC1C,IAAI,IAAI,SAAS,SAAS,YAAY,GAAG,OAAO;QAChD,IAAI,IAAI,SAAS,SAAS,YAAY,GAAG,OAAO;QAChD,IAAI,IAAI,SAAS,SAAS,eAAe,GAAG,OAAO;GAGxD,MAAM,YAAY,IAAI,SAAS,SAAS,OAAO;GAE/C,OAAO;IACL,MAAM,IAAI;IACV;IACA;IACA,QAAQ,YAAY;IACpB,SAAS;IACT,SAAS;KACP,SAAS;KACT,YAAY,IAAI;IAClB;GACF;EACF,CAAC;CACH;;;;;;;CAQA,MAAa,YAAY,OAAkC;EAUzD,QAAO,MATc,KAAK,OAAO,MAC/B;;;;mCAKA,CAAC,KAAK,CACR,EAEa,CAAC,KAAK,KAAK,QAAQ,IAAI,WAAW;CACjD;;;;;;;CAQA,MAAa,YAAY,OAAiC;EAUxD,QAAO,MATc,KAAK,OAAO,MAC/B;;;;UAKA,CAAC,KAAK,CACR,EAEa,CAAC,KAAK,EAAE,EAAE,UAAU;CACnC;AACF"}
|
|
@@ -2,7 +2,7 @@ import { ColumnExpression } from "../../expressions/column-expressions.mjs";
|
|
|
2
2
|
import { AggregateExpression } from "../../expressions/aggregate-expressions.mjs";
|
|
3
3
|
import { SqlDialectContract } from "../sql/sql-dialect.contract.mjs";
|
|
4
4
|
|
|
5
|
-
//#region
|
|
5
|
+
//#region ../../packages/cascade/src/drivers/postgres/postgres-dialect.d.ts
|
|
6
6
|
type PostgresNaming = "preserve" | "snake_case";
|
|
7
7
|
type PostgresDialectOptions = {
|
|
8
8
|
readonly naming?: PostgresNaming;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-dialect.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"postgres-dialect.d.mts","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/postgres-dialect.ts"],"mappings":";;;;;KAcY,cAAA;AAAA,KAEA,sBAAA;EAAA,SAAoC,MAAA,GAAS,cAAc;AAAA;AAqBvE;;;;;;;;;;;;;;;;;;;AAAA,cAAa,eAAA,YAA2B,kBAAA;EAAA,iBACrB,MAAA;cAEE,OAAA,GAAS,sBAAA;EAmDA;;;EAAA,SA7CZ,IAAA;EAqEG;;;EAAA,SAhEH,iBAAA;EAwFmB;;;EAAA,SAnFnB,aAAA;EA+GoC;;;;;;;;EArG7C,WAAA,CAAY,KAAA;EA6JZ;;;;;;;;;EAhJA,eAAA,CAAgB,UAAA;EAkThB;EAtSA,oBAAA,CAAqB,UAAA;EAsSC;;;;;AAoC8C;EA7TpE,cAAA,CAAe,KAAA;EAyUQ;;;AAAc;;;;EA9TrC,WAAA,CAAY,KAAA,WAAgB,MAAA;;;;;;;;;;;EAwB5B,WAAA,CAAY,MAAA,UAAgB,IAAA;;;;;;;;;;;EA4B5B,YAAA,CAAa,MAAA,UAAgB,KAAA,WAAgB,IAAA;;;;;;;;;;EAuB7C,WAAA,CACL,OAAA,UACA,eAAA;IACG,QAAA;IAAkB,OAAA;EAAA;;;;;;;;;;EAmBhB,aAAA,CAAc,MAAA,UAAgB,UAAA;;;;;;;;EAW9B,UAAA,CACL,IAAA,UACA,OAAA;IAAY,MAAA;IAAiB,SAAA;IAAoB,KAAA;IAAgB,UAAA;EAAA;;;;;;;;;;;;;EA8G5D,cAAA,CAAe,UAAA,EAAY,mBAAA;;;;;;;;;;;;EAkD3B,qBAAA,CAAsB,UAAA,EAAY,gBAAA;;;;;;;;;;;;;;EAoClC,YAAA,CAAa,MAAA,UAAgB,IAAA;AAAA;;;;iBAYtB,gBAAA,CAAiB,KAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-dialect.mjs","names":[],"sources":["../../../../../../../../cascade/src/drivers/postgres/postgres-dialect.ts"],"sourcesContent":["/**\n * PostgreSQL Dialect Implementation\n *\n * Implements the SqlDialectContract for PostgreSQL-specific SQL syntax.\n * Handles parameter placeholders ($1, $2), identifier quoting, and\n * PostgreSQL-specific features like JSONB operators.\n *\n * @module cascade/drivers/postgres\n */\n\nimport type { AggregateExpression, ColumnExpression } from \"../../expressions\";\nimport type { SqlDialectContract } from \"../sql/sql-dialect.contract\";\nimport { camelToSnake } from \"./naming\";\n\nexport type PostgresNaming = \"preserve\" | \"snake_case\";\n\nexport type PostgresDialectOptions = { readonly naming?: PostgresNaming };\n\n/**\n * PostgreSQL-specific SQL dialect implementation.\n *\n * Provides PostgreSQL syntax for:\n * - Parameter placeholders ($1, $2, $3...)\n * - Identifier quoting with double quotes\n * - JSONB operators (->, ->>, @>)\n * - ILIKE for case-insensitive matching\n * - RETURNING clause support\n *\n * @example\n * ```typescript\n * const dialect = new PostgresDialect();\n *\n * dialect.placeholder(1); // \"$1\"\n * dialect.quoteIdentifier('user'); // '\"user\"'\n * dialect.jsonExtract('data', 'name'); // \"data\"->>'name'\n * ```\n */\nexport class PostgresDialect implements SqlDialectContract {\n private readonly naming: PostgresNaming;\n\n public constructor(options: PostgresDialectOptions = {}) {\n this.naming = options.naming ?? \"preserve\";\n }\n /**\n * Dialect name identifier.\n */\n public readonly name = \"postgres\" as const;\n\n /**\n * PostgreSQL supports the RETURNING clause for INSERT/UPDATE/DELETE.\n */\n public readonly supportsReturning = true;\n\n /**\n * PostgreSQL uses ON CONFLICT for upsert operations.\n */\n public readonly upsertKeyword = \"ON CONFLICT\" as const;\n\n /**\n * Generate a PostgreSQL parameter placeholder.\n *\n * PostgreSQL uses numbered placeholders: $1, $2, $3, etc.\n *\n * @param index - The 1-based parameter index\n * @returns The placeholder string (e.g., \"$1\")\n */\n public placeholder(index: number): string {\n return `$${index}`;\n }\n\n /**\n * Quote an identifier using PostgreSQL's double-quote syntax.\n *\n * Handles escaping of embedded double quotes by doubling them.\n * This is necessary for reserved words and special characters.\n *\n * @param identifier - The identifier (table/column name) to quote\n * @returns The quoted identifier (e.g., '\"user\"')\n */\n public quoteIdentifier(identifier: string): string {\n // Split on dots for qualified names (schema.table.column)\n const parts = identifier.split(\".\");\n return parts\n .map((part) => `\"${(this.naming === \"snake_case\" ? camelToSnake(part) : part).replace(/\"/g, '\"\"')}\"`)\n .join(\".\");\n }\n\n /** Quote a table identifier without applying the column naming policy. */\n public quoteTableIdentifier(identifier: string): string {\n return identifier.split(\".\").map((part) => `\"${part.replace(/\"/g, '\"\"')}\"`).join(\".\");\n }\n\n /**\n * Convert a boolean to PostgreSQL literal.\n *\n * @param value - The boolean value\n * @returns \"TRUE\" or \"FALSE\"\n */\n public booleanLiteral(value: boolean): string {\n return value ? \"TRUE\" : \"FALSE\";\n }\n\n /**\n * Build LIMIT/OFFSET clause for PostgreSQL.\n *\n * @param limit - Maximum rows to return\n * @param offset - Rows to skip\n * @returns The SQL clause (e.g., \"LIMIT 10 OFFSET 20\")\n */\n public limitOffset(limit?: number, offset?: number): string {\n const parts: string[] = [];\n\n if (limit !== undefined) {\n parts.push(`LIMIT ${toSafeInteger(limit, \"LIMIT\")}`);\n }\n\n if (offset !== undefined) {\n parts.push(`OFFSET ${toSafeInteger(offset, \"OFFSET\")}`);\n }\n\n return parts.join(\" \");\n }\n\n /**\n * Build a JSON path extraction expression for PostgreSQL.\n *\n * Uses the ->> operator for text extraction from JSONB columns.\n * Supports nested paths using chained operators.\n *\n * @param column - The JSONB column name\n * @param path - The path to extract (dot notation: \"user.name\")\n * @returns The SQL expression (e.g., \"data\"->>'user'->>'name')\n */\n public jsonExtract(column: string, path: string): string {\n const quotedColumn = this.quoteIdentifier(column);\n const pathParts = path.split(\".\");\n\n if (pathParts.length === 1) {\n return `${quotedColumn}->>'${escapeSqlLiteral(pathParts[0] as string)}'`;\n }\n\n // For nested paths: data->'user'->>'name' (last one gets text extraction)\n const jsonPath = pathParts\n .slice(0, -1)\n .map((p) => `'${escapeSqlLiteral(p)}'`)\n .join(\"->\");\n const lastKey = pathParts[pathParts.length - 1];\n\n return `${quotedColumn}->${jsonPath}->>'${escapeSqlLiteral(lastKey as string)}'`;\n }\n\n /**\n * Build a JSON contains expression for PostgreSQL.\n *\n * Uses the @> containment operator for JSONB columns.\n *\n * @param column - The JSONB column name\n * @param value - The value to check for\n * @param path - Optional path within the JSON\n * @returns The SQL expression\n */\n public jsonContains(column: string, value: unknown, path?: string): string {\n const quotedColumn = this.quoteIdentifier(column);\n\n if (path) {\n // Check if a specific path contains the value\n const jsonValue = JSON.stringify({ [path]: value });\n return `${quotedColumn} @> '${escapeSqlLiteral(jsonValue)}'::jsonb`;\n }\n\n // Check if the column contains the value (for arrays or objects)\n const jsonValue = JSON.stringify(value);\n return `${quotedColumn} @> '${escapeSqlLiteral(jsonValue)}'::jsonb`;\n }\n\n /**\n * Build a LIKE pattern expression for PostgreSQL.\n *\n * Uses ILIKE for case-insensitive matching, LIKE for case-sensitive.\n *\n * @param pattern - The pattern to match\n * @param caseInsensitive - Whether to use case-insensitive matching\n * @returns Object with operator and pattern\n */\n public likePattern(\n pattern: string,\n caseInsensitive = true,\n ): { operator: string; pattern: string } {\n // Escape special characters in the pattern (%, _, \\)\n const escapedPattern = pattern.replace(/\\\\/g, \"\\\\\\\\\").replace(/%/g, \"\\\\%\").replace(/_/g, \"\\\\_\");\n\n return {\n operator: caseInsensitive ? \"ILIKE\" : \"LIKE\",\n pattern: escapedPattern,\n };\n }\n\n /**\n * Build an array contains expression for PostgreSQL.\n *\n * Uses ANY() for checking if a value is in an array column.\n *\n * @param column - The array column name\n * @param paramIndex - The parameter index\n * @returns The SQL expression\n */\n public arrayContains(column: string, paramIndex: number): string {\n return `${this.placeholder(paramIndex)} = ANY(${this.quoteIdentifier(column)})`;\n }\n\n /**\n * Get the PostgreSQL SQL type for an abstract type.\n *\n * @param type - The abstract type name\n * @param options - Type-specific options\n * @returns The PostgreSQL type string\n */\n public getSqlType(\n type: string,\n options?: { length?: number; precision?: number; scale?: number; dimensions?: number },\n ): string {\n switch (type) {\n case \"string\":\n return options?.length ? `VARCHAR(${options.length})` : \"TEXT\";\n case \"char\":\n return `CHAR(${options?.length ?? 1})`;\n case \"text\":\n return \"TEXT\";\n case \"mediumText\":\n case \"longText\":\n return \"TEXT\"; // PostgreSQL doesn't distinguish text sizes\n case \"integer\":\n return \"INTEGER\";\n case \"smallInteger\":\n return \"SMALLINT\";\n case \"tinyInteger\":\n return \"SMALLINT\"; // PostgreSQL doesn't have TINYINT\n case \"bigInteger\":\n return \"BIGINT\";\n case \"float\":\n return \"REAL\";\n case \"double\":\n return \"DOUBLE PRECISION\";\n case \"decimal\":\n if (options?.precision !== undefined) {\n const scale = options.scale ?? 0;\n return `DECIMAL(${options.precision}, ${scale})`;\n }\n return \"DECIMAL\";\n case \"boolean\":\n return \"BOOLEAN\";\n case \"date\":\n return \"DATE\";\n case \"dateTime\":\n return \"TIMESTAMP\";\n case \"timestamp\":\n return \"TIMESTAMPTZ\"; // With timezone\n case \"time\":\n return \"TIME\";\n case \"year\":\n return \"SMALLINT\"; // PostgreSQL doesn't have YEAR type\n case \"json\":\n return \"JSONB\"; // Prefer JSONB for indexing and operators\n case \"binary\":\n return \"BYTEA\";\n case \"uuid\":\n return \"UUID\";\n case \"ulid\":\n return \"CHAR(26)\"; // ULIDs are 26 characters\n case \"ipAddress\":\n return \"INET\";\n case \"macAddress\":\n return \"MACADDR\";\n case \"point\":\n return \"POINT\";\n case \"polygon\":\n return \"POLYGON\";\n case \"lineString\":\n return \"PATH\";\n case \"geometry\":\n return \"GEOMETRY\"; // Requires PostGIS\n case \"vector\":\n return options?.dimensions ? `VECTOR(${options.dimensions})` : \"VECTOR\"; // Requires pgvector\n case \"enum\":\n return \"TEXT\"; // PostgreSQL enums need CREATE TYPE first\n case \"set\":\n return \"TEXT[]\"; // Use array for set-like behavior\n // PostgreSQL native array types\n case \"arrayInt\":\n return \"INTEGER[]\";\n case \"arrayBigInt\":\n return \"BIGINT[]\";\n case \"arrayFloat\":\n return \"REAL[]\";\n case \"arrayDecimal\":\n if (options?.precision !== undefined) {\n const scale = options.scale ?? 0;\n return `DECIMAL(${options.precision}, ${scale})[]`;\n }\n return \"DECIMAL[]\";\n case \"arrayBoolean\":\n return \"BOOLEAN[]\";\n case \"arrayText\":\n return \"TEXT[]\";\n case \"arrayDate\":\n return \"DATE[]\";\n case \"arrayTimestamp\":\n return \"TIMESTAMPTZ[]\";\n case \"arrayUuid\":\n return \"UUID[]\";\n case \"arrayJson\":\n return \"JSONB[]\";\n default:\n return type.toUpperCase();\n }\n }\n\n /**\n * Translate a database-agnostic aggregate expression to PostgreSQL SQL.\n *\n * The scalar aggregates map to their ANSI SQL function, and `countDistinct`\n * maps to `COUNT(DISTINCT …)`. `distinct`, `floor`, `first` and `last` are\n * MongoDB-only for v1 — none has a single-scalar `GROUP BY` equivalent on\n * PostgreSQL, so they throw instead of emitting a silently-different semantic\n * (the footgun this guards).\n *\n * @param expression - The abstract aggregate (`$agg.*`) to translate\n * @returns The SQL fragment (e.g. `SUM(\"amount\")`, `COUNT(*)`)\n */\n public aggregateToSql(expression: AggregateExpression): string {\n // When a composed column expression is present, the aggregate operates on\n // it instead of a bare column (e.g. SUM(price * quantity)). Only `sum`\n // supports the expression form in v1.\n if (expression.__expr) {\n if (expression.__agg !== \"sum\") {\n throw new Error(\n `$agg.${expression.__agg} does not support a composed column ` +\n `expression yet — only $agg.sum(...) does. Use a bare column name here.`,\n );\n }\n\n return `SUM(${this.columnExpressionToSql(expression.__expr)})`;\n }\n\n const column = expression.__field === null ? \"*\" : this.quoteIdentifier(expression.__field);\n\n switch (expression.__agg) {\n case \"count\":\n return \"COUNT(*)\";\n case \"countDistinct\":\n return `COUNT(DISTINCT ${column})`;\n case \"sum\":\n return `SUM(${column})`;\n case \"avg\":\n return `AVG(${column})`;\n case \"min\":\n return `MIN(${column})`;\n case \"max\":\n return `MAX(${column})`;\n default:\n throw new Error(\n `$agg.${expression.__agg} is MongoDB-only and not supported on a ` +\n `PostgreSQL groupBy. Use selectRaw / havingRaw with the equivalent ` +\n `SQL (window function / DISTINCT / FLOOR) if you need it here.`,\n );\n }\n }\n\n /**\n * Compile a typed {@link ColumnExpression} tree into a SQL fragment.\n *\n * Column references flow through {@link quoteIdentifier} (so user-supplied\n * names are quoted/escaped, never raw-interpolated); literals are emitted as\n * numeric/boolean SQL constants; arithmetic ops are parenthesised. The `raw`\n * node is the only path that emits a string verbatim — it is opt-in by name.\n *\n * @param expression - The expression tree to compile\n * @returns A SQL fragment (e.g. `(\"price\" * \"quantity\")`)\n */\n public columnExpressionToSql(expression: ColumnExpression): string {\n switch (expression.__expr) {\n case \"column\":\n return this.quoteIdentifier(expression.column);\n case \"literal\":\n return typeof expression.value === \"boolean\"\n ? this.booleanLiteral(expression.value)\n : String(toFiniteNumber(expression.value));\n case \"raw\":\n return expression.expression;\n case \"add\":\n case \"subtract\":\n case \"multiply\":\n case \"divide\": {\n const operator = { add: \"+\", subtract: \"-\", multiply: \"*\", divide: \"/\" }[expression.__expr];\n const parts = expression.operands.map((operand) => this.columnExpressionToSql(operand));\n return `(${parts.join(` ${operator} `)})`;\n }\n default:\n throw new Error(`Unsupported column expression node: ${JSON.stringify(expression)}`);\n }\n }\n\n /**\n * Build a `date_trunc` bucket expression for a portable `groupByDate`.\n *\n * @param column - The date/timestamp column to truncate\n * @param unit - The bucket granularity\n * @returns The SQL fragment (e.g. `date_trunc('month', \"created_at\")`)\n *\n * @example\n * ```typescript\n * dialect.dateTruncSql(\"created_at\", \"month\");\n * // date_trunc('month', \"created_at\")\n * ```\n */\n public dateTruncSql(column: string, unit: \"day\" | \"week\" | \"month\" | \"year\"): string {\n if (![\"day\", \"week\", \"month\", \"year\"].includes(unit)) {\n throw new Error(`PostgresDialect: invalid date_trunc unit \"${unit}\"`);\n }\n\n return `date_trunc('${unit}', ${this.quoteIdentifier(column)})`;\n }\n}\n\n/**\n * Escape a string for use inside a single-quoted SQL literal (`'` doubled).\n */\nexport function escapeSqlLiteral(value: string): string {\n return String(value).replace(/'/g, \"''\");\n}\n\n/**\n * Coerce a LIMIT/OFFSET value to a non-negative safe integer or throw.\n * Numeric strings (e.g. from query params) are accepted; anything else is not.\n */\nfunction toSafeInteger(value: unknown, label: string): number {\n const number = typeof value === \"string\" && /^\\d+$/.test(value) ? Number(value) : value;\n\n if (typeof number !== \"number\" || !Number.isSafeInteger(number) || number < 0) {\n throw new Error(`PostgresDialect: ${label} must be a non-negative safe integer`);\n }\n\n return number;\n}\n\n/**\n * Literals in column expressions are emitted verbatim, so only finite numbers pass.\n */\nfunction toFiniteNumber(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(\"PostgresDialect: column expression literal must be a finite number or boolean\");\n }\n\n return value;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"postgres-dialect.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/postgres-dialect.ts"],"sourcesContent":["/**\n * PostgreSQL Dialect Implementation\n *\n * Implements the SqlDialectContract for PostgreSQL-specific SQL syntax.\n * Handles parameter placeholders ($1, $2), identifier quoting, and\n * PostgreSQL-specific features like JSONB operators.\n *\n * @module cascade/drivers/postgres\n */\n\nimport type { AggregateExpression, ColumnExpression } from \"../../expressions\";\nimport type { SqlDialectContract } from \"../sql/sql-dialect.contract\";\nimport { camelToSnake } from \"./naming\";\n\nexport type PostgresNaming = \"preserve\" | \"snake_case\";\n\nexport type PostgresDialectOptions = { readonly naming?: PostgresNaming };\n\n/**\n * PostgreSQL-specific SQL dialect implementation.\n *\n * Provides PostgreSQL syntax for:\n * - Parameter placeholders ($1, $2, $3...)\n * - Identifier quoting with double quotes\n * - JSONB operators (->, ->>, @>)\n * - ILIKE for case-insensitive matching\n * - RETURNING clause support\n *\n * @example\n * ```typescript\n * const dialect = new PostgresDialect();\n *\n * dialect.placeholder(1); // \"$1\"\n * dialect.quoteIdentifier('user'); // '\"user\"'\n * dialect.jsonExtract('data', 'name'); // \"data\"->>'name'\n * ```\n */\nexport class PostgresDialect implements SqlDialectContract {\n private readonly naming: PostgresNaming;\n\n public constructor(options: PostgresDialectOptions = {}) {\n this.naming = options.naming ?? \"preserve\";\n }\n /**\n * Dialect name identifier.\n */\n public readonly name = \"postgres\" as const;\n\n /**\n * PostgreSQL supports the RETURNING clause for INSERT/UPDATE/DELETE.\n */\n public readonly supportsReturning = true;\n\n /**\n * PostgreSQL uses ON CONFLICT for upsert operations.\n */\n public readonly upsertKeyword = \"ON CONFLICT\" as const;\n\n /**\n * Generate a PostgreSQL parameter placeholder.\n *\n * PostgreSQL uses numbered placeholders: $1, $2, $3, etc.\n *\n * @param index - The 1-based parameter index\n * @returns The placeholder string (e.g., \"$1\")\n */\n public placeholder(index: number): string {\n return `$${index}`;\n }\n\n /**\n * Quote an identifier using PostgreSQL's double-quote syntax.\n *\n * Handles escaping of embedded double quotes by doubling them.\n * This is necessary for reserved words and special characters.\n *\n * @param identifier - The identifier (table/column name) to quote\n * @returns The quoted identifier (e.g., '\"user\"')\n */\n public quoteIdentifier(identifier: string): string {\n // Split on dots for qualified names (schema.table.column)\n const parts = identifier.split(\".\");\n return parts\n .map(\n (part) =>\n `\"${(this.naming === \"snake_case\" ? camelToSnake(part) : part).replace(/\"/g, '\"\"')}\"`,\n )\n .join(\".\");\n }\n\n /** Quote a table identifier without applying the column naming policy. */\n public quoteTableIdentifier(identifier: string): string {\n return identifier\n .split(\".\")\n .map((part) => `\"${part.replace(/\"/g, '\"\"')}\"`)\n .join(\".\");\n }\n\n /**\n * Convert a boolean to PostgreSQL literal.\n *\n * @param value - The boolean value\n * @returns \"TRUE\" or \"FALSE\"\n */\n public booleanLiteral(value: boolean): string {\n return value ? \"TRUE\" : \"FALSE\";\n }\n\n /**\n * Build LIMIT/OFFSET clause for PostgreSQL.\n *\n * @param limit - Maximum rows to return\n * @param offset - Rows to skip\n * @returns The SQL clause (e.g., \"LIMIT 10 OFFSET 20\")\n */\n public limitOffset(limit?: number, offset?: number): string {\n const parts: string[] = [];\n\n if (limit !== undefined) {\n parts.push(`LIMIT ${toSafeInteger(limit, \"LIMIT\")}`);\n }\n\n if (offset !== undefined) {\n parts.push(`OFFSET ${toSafeInteger(offset, \"OFFSET\")}`);\n }\n\n return parts.join(\" \");\n }\n\n /**\n * Build a JSON path extraction expression for PostgreSQL.\n *\n * Uses the ->> operator for text extraction from JSONB columns.\n * Supports nested paths using chained operators.\n *\n * @param column - The JSONB column name\n * @param path - The path to extract (dot notation: \"user.name\")\n * @returns The SQL expression (e.g., \"data\"->>'user'->>'name')\n */\n public jsonExtract(column: string, path: string): string {\n const quotedColumn = this.quoteIdentifier(column);\n const pathParts = path.split(\".\");\n\n if (pathParts.length === 1) {\n return `${quotedColumn}->>'${escapeSqlLiteral(pathParts[0] as string)}'`;\n }\n\n // For nested paths: data->'user'->>'name' (last one gets text extraction)\n const jsonPath = pathParts\n .slice(0, -1)\n .map((p) => `'${escapeSqlLiteral(p)}'`)\n .join(\"->\");\n const lastKey = pathParts[pathParts.length - 1];\n\n return `${quotedColumn}->${jsonPath}->>'${escapeSqlLiteral(lastKey as string)}'`;\n }\n\n /**\n * Build a JSON contains expression for PostgreSQL.\n *\n * Uses the @> containment operator for JSONB columns.\n *\n * @param column - The JSONB column name\n * @param value - The value to check for\n * @param path - Optional path within the JSON\n * @returns The SQL expression\n */\n public jsonContains(column: string, value: unknown, path?: string): string {\n const quotedColumn = this.quoteIdentifier(column);\n\n if (path) {\n // Check if a specific path contains the value\n const jsonValue = JSON.stringify({ [path]: value });\n return `${quotedColumn} @> '${escapeSqlLiteral(jsonValue)}'::jsonb`;\n }\n\n // Check if the column contains the value (for arrays or objects)\n const jsonValue = JSON.stringify(value);\n return `${quotedColumn} @> '${escapeSqlLiteral(jsonValue)}'::jsonb`;\n }\n\n /**\n * Build a LIKE pattern expression for PostgreSQL.\n *\n * Uses ILIKE for case-insensitive matching, LIKE for case-sensitive.\n *\n * @param pattern - The pattern to match\n * @param caseInsensitive - Whether to use case-insensitive matching\n * @returns Object with operator and pattern\n */\n public likePattern(\n pattern: string,\n caseInsensitive = true,\n ): { operator: string; pattern: string } {\n // Escape special characters in the pattern (%, _, \\)\n const escapedPattern = pattern.replace(/\\\\/g, \"\\\\\\\\\").replace(/%/g, \"\\\\%\").replace(/_/g, \"\\\\_\");\n\n return {\n operator: caseInsensitive ? \"ILIKE\" : \"LIKE\",\n pattern: escapedPattern,\n };\n }\n\n /**\n * Build an array contains expression for PostgreSQL.\n *\n * Uses ANY() for checking if a value is in an array column.\n *\n * @param column - The array column name\n * @param paramIndex - The parameter index\n * @returns The SQL expression\n */\n public arrayContains(column: string, paramIndex: number): string {\n return `${this.placeholder(paramIndex)} = ANY(${this.quoteIdentifier(column)})`;\n }\n\n /**\n * Get the PostgreSQL SQL type for an abstract type.\n *\n * @param type - The abstract type name\n * @param options - Type-specific options\n * @returns The PostgreSQL type string\n */\n public getSqlType(\n type: string,\n options?: { length?: number; precision?: number; scale?: number; dimensions?: number },\n ): string {\n switch (type) {\n case \"string\":\n return options?.length ? `VARCHAR(${options.length})` : \"TEXT\";\n case \"char\":\n return `CHAR(${options?.length ?? 1})`;\n case \"text\":\n return \"TEXT\";\n case \"mediumText\":\n case \"longText\":\n return \"TEXT\"; // PostgreSQL doesn't distinguish text sizes\n case \"integer\":\n return \"INTEGER\";\n case \"smallInteger\":\n return \"SMALLINT\";\n case \"tinyInteger\":\n return \"SMALLINT\"; // PostgreSQL doesn't have TINYINT\n case \"bigInteger\":\n return \"BIGINT\";\n case \"float\":\n return \"REAL\";\n case \"double\":\n return \"DOUBLE PRECISION\";\n case \"decimal\":\n if (options?.precision !== undefined) {\n const scale = options.scale ?? 0;\n return `DECIMAL(${options.precision}, ${scale})`;\n }\n return \"DECIMAL\";\n case \"boolean\":\n return \"BOOLEAN\";\n case \"date\":\n return \"DATE\";\n case \"dateTime\":\n return \"TIMESTAMP\";\n case \"timestamp\":\n return \"TIMESTAMPTZ\"; // With timezone\n case \"time\":\n return \"TIME\";\n case \"year\":\n return \"SMALLINT\"; // PostgreSQL doesn't have YEAR type\n case \"json\":\n return \"JSONB\"; // Prefer JSONB for indexing and operators\n case \"binary\":\n return \"BYTEA\";\n case \"uuid\":\n return \"UUID\";\n case \"ulid\":\n return \"CHAR(26)\"; // ULIDs are 26 characters\n case \"ipAddress\":\n return \"INET\";\n case \"macAddress\":\n return \"MACADDR\";\n case \"point\":\n return \"POINT\";\n case \"polygon\":\n return \"POLYGON\";\n case \"lineString\":\n return \"PATH\";\n case \"geometry\":\n return \"GEOMETRY\"; // Requires PostGIS\n case \"vector\":\n return options?.dimensions ? `VECTOR(${options.dimensions})` : \"VECTOR\"; // Requires pgvector\n case \"enum\":\n return \"TEXT\"; // PostgreSQL enums need CREATE TYPE first\n case \"set\":\n return \"TEXT[]\"; // Use array for set-like behavior\n // PostgreSQL native array types\n case \"arrayInt\":\n return \"INTEGER[]\";\n case \"arrayBigInt\":\n return \"BIGINT[]\";\n case \"arrayFloat\":\n return \"REAL[]\";\n case \"arrayDecimal\":\n if (options?.precision !== undefined) {\n const scale = options.scale ?? 0;\n return `DECIMAL(${options.precision}, ${scale})[]`;\n }\n return \"DECIMAL[]\";\n case \"arrayBoolean\":\n return \"BOOLEAN[]\";\n case \"arrayText\":\n return \"TEXT[]\";\n case \"arrayDate\":\n return \"DATE[]\";\n case \"arrayTimestamp\":\n return \"TIMESTAMPTZ[]\";\n case \"arrayUuid\":\n return \"UUID[]\";\n case \"arrayJson\":\n return \"JSONB[]\";\n default:\n return type.toUpperCase();\n }\n }\n\n /**\n * Translate a database-agnostic aggregate expression to PostgreSQL SQL.\n *\n * The scalar aggregates map to their ANSI SQL function, and `countDistinct`\n * maps to `COUNT(DISTINCT …)`. `distinct`, `floor`, `first` and `last` are\n * MongoDB-only for v1 — none has a single-scalar `GROUP BY` equivalent on\n * PostgreSQL, so they throw instead of emitting a silently-different semantic\n * (the footgun this guards).\n *\n * @param expression - The abstract aggregate (`$agg.*`) to translate\n * @returns The SQL fragment (e.g. `SUM(\"amount\")`, `COUNT(*)`)\n */\n public aggregateToSql(expression: AggregateExpression): string {\n // When a composed column expression is present, the aggregate operates on\n // it instead of a bare column (e.g. SUM(price * quantity)). Only `sum`\n // supports the expression form in v1.\n if (expression.__expr) {\n if (expression.__agg !== \"sum\") {\n throw new Error(\n `$agg.${expression.__agg} does not support a composed column ` +\n `expression yet — only $agg.sum(...) does. Use a bare column name here.`,\n );\n }\n\n return `SUM(${this.columnExpressionToSql(expression.__expr)})`;\n }\n\n const column = expression.__field === null ? \"*\" : this.quoteIdentifier(expression.__field);\n\n switch (expression.__agg) {\n case \"count\":\n return \"COUNT(*)\";\n case \"countDistinct\":\n return `COUNT(DISTINCT ${column})`;\n case \"sum\":\n return `SUM(${column})`;\n case \"avg\":\n return `AVG(${column})`;\n case \"min\":\n return `MIN(${column})`;\n case \"max\":\n return `MAX(${column})`;\n default:\n throw new Error(\n `$agg.${expression.__agg} is MongoDB-only and not supported on a ` +\n `PostgreSQL groupBy. Use selectRaw / havingRaw with the equivalent ` +\n `SQL (window function / DISTINCT / FLOOR) if you need it here.`,\n );\n }\n }\n\n /**\n * Compile a typed {@link ColumnExpression} tree into a SQL fragment.\n *\n * Column references flow through {@link quoteIdentifier} (so user-supplied\n * names are quoted/escaped, never raw-interpolated); literals are emitted as\n * numeric/boolean SQL constants; arithmetic ops are parenthesised. The `raw`\n * node is the only path that emits a string verbatim — it is opt-in by name.\n *\n * @param expression - The expression tree to compile\n * @returns A SQL fragment (e.g. `(\"price\" * \"quantity\")`)\n */\n public columnExpressionToSql(expression: ColumnExpression): string {\n switch (expression.__expr) {\n case \"column\":\n return this.quoteIdentifier(expression.column);\n case \"literal\":\n return typeof expression.value === \"boolean\"\n ? this.booleanLiteral(expression.value)\n : String(toFiniteNumber(expression.value));\n case \"raw\":\n return expression.expression;\n case \"add\":\n case \"subtract\":\n case \"multiply\":\n case \"divide\": {\n const operator = { add: \"+\", subtract: \"-\", multiply: \"*\", divide: \"/\" }[expression.__expr];\n const parts = expression.operands.map((operand) => this.columnExpressionToSql(operand));\n return `(${parts.join(` ${operator} `)})`;\n }\n default:\n throw new Error(`Unsupported column expression node: ${JSON.stringify(expression)}`);\n }\n }\n\n /**\n * Build a `date_trunc` bucket expression for a portable `groupByDate`.\n *\n * @param column - The date/timestamp column to truncate\n * @param unit - The bucket granularity\n * @returns The SQL fragment (e.g. `date_trunc('month', \"created_at\")`)\n *\n * @example\n * ```typescript\n * dialect.dateTruncSql(\"created_at\", \"month\");\n * // date_trunc('month', \"created_at\")\n * ```\n */\n public dateTruncSql(column: string, unit: \"day\" | \"week\" | \"month\" | \"year\"): string {\n if (![\"day\", \"week\", \"month\", \"year\"].includes(unit)) {\n throw new Error(`PostgresDialect: invalid date_trunc unit \"${unit}\"`);\n }\n\n return `date_trunc('${unit}', ${this.quoteIdentifier(column)})`;\n }\n}\n\n/**\n * Escape a string for use inside a single-quoted SQL literal (`'` doubled).\n */\nexport function escapeSqlLiteral(value: string): string {\n return String(value).replace(/'/g, \"''\");\n}\n\n/**\n * Coerce a LIMIT/OFFSET value to a non-negative safe integer or throw.\n * Numeric strings (e.g. from query params) are accepted; anything else is not.\n */\nfunction toSafeInteger(value: unknown, label: string): number {\n const number = typeof value === \"string\" && /^\\d+$/.test(value) ? Number(value) : value;\n\n if (typeof number !== \"number\" || !Number.isSafeInteger(number) || number < 0) {\n throw new Error(`PostgresDialect: ${label} must be a non-negative safe integer`);\n }\n\n return number;\n}\n\n/**\n * Literals in column expressions are emitted verbatim, so only finite numbers pass.\n */\nfunction toFiniteNumber(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(\n \"PostgresDialect: column expression literal must be a finite number or boolean\",\n );\n }\n\n return value;\n}\n"],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { SqlDatabaseDirtyTracker } from "../../sql-database-dirty-tracker.mjs";
|
|
|
10
10
|
import { PostgresDialect } from "./postgres-dialect.mjs";
|
|
11
11
|
import { PostgresPoolConfig, PostgresQueryResult, PostgresTransactionOptions } from "./types.mjs";
|
|
12
12
|
|
|
13
|
-
//#region
|
|
13
|
+
//#region ../../packages/cascade/src/drivers/postgres/postgres-driver.d.ts
|
|
14
14
|
/**
|
|
15
15
|
* Lazily loaded pg module types.
|
|
16
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-driver.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"postgres-driver.d.mts","names":[],"sources":["../../../../../../../../../packages/cascade/src/drivers/postgres/postgres-driver.ts"],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ import { assertPostgresUpdate } from "./postgres-update-validator.mjs";
|
|
|
15
15
|
import { log } from "@warlock.js/logger";
|
|
16
16
|
import { colors } from "@mongez/copper";
|
|
17
17
|
|
|
18
|
-
//#region
|
|
18
|
+
//#region ../../packages/cascade/src/drivers/postgres/postgres-driver.ts
|
|
19
19
|
/**
|
|
20
20
|
* PostgreSQL Driver
|
|
21
21
|
*
|