ts-prorm-orm 1.1.0 → 1.2.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 +83 -0
- package/README.md +194 -72
- package/dist/audit/history-query.d.ts +35 -0
- package/dist/audit/index.d.ts +16 -0
- package/dist/audit/logger.d.ts +126 -0
- package/dist/cache/cache-manager.d.ts +341 -0
- package/dist/cache/index.d.ts +8 -0
- package/dist/cache/redis-cluster-cache.d.ts +164 -0
- package/dist/cache/redis-cluster-cache.js +19 -36
- package/dist/cli/cloud.d.ts +55 -0
- package/dist/cli/cloud.js +318 -0
- package/dist/cli/commands/auth.d.ts +2 -0
- package/dist/cli/commands/auth.js +345 -0
- package/dist/cli/commands/billing.d.ts +2 -0
- package/dist/cli/commands/billing.js +135 -0
- package/dist/cli/commands/code.d.ts +2 -0
- package/dist/cli/commands/code.js +168 -0
- package/dist/cli/commands/config.d.ts +2 -0
- package/dist/cli/commands/config.js +154 -0
- package/dist/cli/commands/db.d.ts +2 -0
- package/dist/cli/commands/db.js +189 -0
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.js +22 -0
- package/dist/cli/commands/keys.d.ts +2 -0
- package/dist/cli/commands/keys.js +100 -0
- package/dist/cli/commands/misc.d.ts +2 -0
- package/dist/cli/commands/misc.js +282 -0
- package/dist/cli/commands/pull.d.ts +2 -0
- package/dist/cli/commands/pull.js +306 -0
- package/dist/cli/commands/runners.d.ts +2 -0
- package/dist/cli/commands/runners.js +218 -0
- package/dist/cli/commands/scaffold.d.ts +2 -0
- package/dist/cli/commands/scaffold.js +383 -0
- package/dist/cli/commands/secrets.d.ts +2 -0
- package/dist/cli/commands/secrets.js +162 -0
- package/dist/cli/commands/store.d.ts +2 -0
- package/dist/cli/commands/store.js +274 -0
- package/dist/cli/commands/system.d.ts +10 -0
- package/dist/cli/commands/system.js +169 -0
- package/dist/cli/commands/teams.d.ts +2 -0
- package/dist/cli/commands/teams.js +189 -0
- package/dist/cli/commands/user.d.ts +2 -0
- package/dist/cli/commands/user.js +171 -0
- package/dist/cli/framework.d.ts +103 -0
- package/dist/cli/framework.js +436 -0
- package/dist/cli/io.d.ts +26 -0
- package/dist/cli/io.js +181 -0
- package/dist/cli/keychain.d.ts +10 -0
- package/dist/cli/keychain.js +101 -0
- package/dist/cli/prompt.d.ts +20 -0
- package/dist/cli/prompt.js +111 -0
- package/dist/cli.d.ts +214 -0
- package/dist/cli.js +72 -5
- package/dist/compliance/audit-trail.d.ts +66 -0
- package/dist/compliance/backup-verification.d.ts +279 -0
- package/dist/compliance/breach-detector.d.ts +197 -0
- package/dist/compliance/consent-record.d.ts +107 -0
- package/dist/compliance/consent-versioning.d.ts +169 -0
- package/dist/compliance/cross-border-log.d.ts +254 -0
- package/dist/compliance/data-classifier.d.ts +127 -0
- package/dist/compliance/data-lineage.d.ts +268 -0
- package/dist/compliance/data-masker.d.ts +110 -0
- package/dist/compliance/data-portability.d.ts +98 -0
- package/dist/compliance/data-retention.d.ts +108 -0
- package/dist/compliance/dsar-workflow.d.ts +175 -0
- package/dist/compliance/field-encryption.d.ts +84 -0
- package/dist/compliance/immutable-record.d.ts +84 -0
- package/dist/compliance/index.d.ts +93 -0
- package/dist/compliance/privacy-impact-assessment.d.ts +196 -0
- package/dist/compliance/pseudonymization.d.ts +96 -0
- package/dist/compliance/query-firewall.d.ts +661 -0
- package/dist/compliance/rate-limiter.d.ts +203 -0
- package/dist/compliance/right-to-erasure.d.ts +96 -0
- package/dist/compliance/row-level-security.d.ts +152 -0
- package/dist/compliance/security-decorator.d.ts +388 -0
- package/dist/compliance/security-monitor.d.ts +170 -0
- package/dist/compliance/sensitive-data-discovery.d.ts +151 -0
- package/dist/compliance/session-isolation.d.ts +286 -0
- package/dist/compliance/tls-enforcer.d.ts +51 -0
- package/dist/compliance/worm-storage.d.ts +225 -0
- package/dist/connection-manager.d.ts +130 -0
- package/dist/connection-pool.d.ts +311 -0
- package/dist/decorators/audit.d.ts +49 -0
- package/dist/decorators/check.d.ts +218 -0
- package/dist/decorators/collate.d.ts +346 -0
- package/dist/decorators/comment.d.ts +51 -0
- package/dist/decorators/database-settings.d.ts +193 -0
- package/dist/decorators/default.d.ts +148 -0
- package/dist/decorators/encryption.d.ts +175 -0
- package/dist/decorators/engine.d.ts +97 -0
- package/dist/decorators/fk-constraints.d.ts +387 -0
- package/dist/decorators/foreign-table.d.ts +57 -0
- package/dist/decorators/generated.d.ts +232 -0
- package/dist/decorators/hstore.d.ts +96 -0
- package/dist/decorators/index.d.ts +57 -0
- package/dist/decorators/index.js +14 -30
- package/dist/decorators/json-column.d.ts +47 -0
- package/dist/decorators/jsonb.d.ts +83 -0
- package/dist/decorators/orm-decorators.d.ts +274 -0
- package/dist/decorators/permissions.d.ts +192 -0
- package/dist/decorators/procedure.d.ts +168 -0
- package/dist/decorators/procedure.js +31 -7
- package/dist/decorators/query-options.d.ts +527 -0
- package/dist/decorators/range.d.ts +122 -0
- package/dist/decorators/set-column.d.ts +43 -0
- package/dist/decorators/spatial.d.ts +60 -0
- package/dist/decorators/storage.d.ts +561 -0
- package/dist/decorators/timezone.d.ts +319 -0
- package/dist/decorators/trigger.d.ts +50 -0
- package/dist/decorators/uuid.d.ts +102 -0
- package/dist/decorators/view.d.ts +213 -0
- package/dist/diagrams/chen-diagram.d.ts +70 -0
- package/dist/diagrams/chen-diagram.js +33 -31
- package/dist/diagrams/class-diagram.d.ts +78 -0
- package/dist/diagrams/class-diagram.js +23 -27
- package/dist/diagrams/dependency-diagram.d.ts +82 -0
- package/dist/diagrams/dependency-diagram.js +18 -9
- package/dist/diagrams/er-diagram.d.ts +82 -0
- package/dist/diagrams/er-diagram.js +174 -231
- package/dist/diagrams/flow-diagram.d.ts +70 -0
- package/dist/diagrams/flow-diagram.js +23 -18
- package/dist/diagrams/gantt-diagram.d.ts +67 -0
- package/dist/diagrams/gantt-diagram.js +20 -18
- package/dist/diagrams/index-diagram.d.ts +61 -0
- package/dist/diagrams/index-diagram.js +36 -31
- package/dist/diagrams/index.d.ts +155 -0
- package/dist/diagrams/index.js +7 -1
- package/dist/diagrams/migration-diagram.d.ts +67 -0
- package/dist/diagrams/migration-diagram.js +45 -57
- package/dist/diagrams/model-diagram.d.ts +85 -0
- package/dist/diagrams/model-diagram.js +225 -287
- package/dist/diagrams/package-diagram.d.ts +69 -0
- package/dist/diagrams/package-diagram.js +30 -32
- package/dist/diagrams/palette.d.ts +138 -0
- package/dist/diagrams/palette.js +134 -25
- package/dist/diagrams/relational-diagram.d.ts +82 -0
- package/dist/diagrams/relational-diagram.js +51 -59
- package/dist/diagrams/schemadoc-diagram.d.ts +57 -0
- package/dist/diagrams/schemadoc-diagram.js +36 -28
- package/dist/diagrams/sequence-diagram.d.ts +61 -0
- package/dist/diagrams/sequence-diagram.js +20 -11
- package/dist/diagrams/state-diagram.d.ts +85 -0
- package/dist/diagrams/state-diagram.js +21 -17
- package/dist/diagrams/svg-dom.d.ts +62 -0
- package/dist/diagrams/svg-dom.js +11 -0
- package/dist/diagrams/tree-diagram.d.ts +47 -0
- package/dist/diagrams/tree-diagram.js +19 -10
- package/dist/dialects/clickhouse/index.d.ts +660 -0
- package/dist/dialects/clickhouse/index.js +107 -2
- package/dist/dialects/cockroachdb/index.d.ts +1708 -0
- package/dist/dialects/cockroachdb/index.js +139 -10
- package/dist/dialects/cratedb/index.d.ts +262 -0
- package/dist/dialects/cratedb/index.js +148 -0
- package/dist/dialects/databricks/index.d.ts +397 -0
- package/dist/dialects/databricks/index.js +233 -11
- package/dist/dialects/db2/index.d.ts +729 -0
- package/dist/dialects/db2/index.js +152 -2
- package/dist/dialects/dialect.d.ts +1653 -0
- package/dist/dialects/duckdb/index.d.ts +440 -0
- package/dist/dialects/duckdb/index.js +21 -37
- package/dist/dialects/exasol/index.d.ts +197 -0
- package/dist/dialects/exasol/index.js +14 -0
- package/dist/dialects/firebird/index.d.ts +286 -0
- package/dist/dialects/firebird/index.js +135 -0
- package/dist/dialects/greenplum/index.d.ts +336 -0
- package/dist/dialects/greenplum/index.js +168 -0
- package/dist/dialects/hana/index.d.ts +512 -0
- package/dist/dialects/hana/index.js +17 -35
- package/dist/dialects/mariadb/index.d.ts +1241 -0
- package/dist/dialects/mariadb/index.js +181 -43
- package/dist/dialects/mssql/index.d.ts +729 -0
- package/dist/dialects/mssql/index.js +76 -7
- package/dist/dialects/mysql/index.d.ts +1233 -0
- package/dist/dialects/mysql/index.js +87 -19
- package/dist/dialects/oracle/index.d.ts +1222 -0
- package/dist/dialects/oracle/index.js +210 -9
- package/dist/dialects/postgres/index.d.ts +1598 -0
- package/dist/dialects/postgres/index.js +34 -13
- package/dist/dialects/query-stream-helper.d.ts +58 -0
- package/dist/dialects/questdb/index.d.ts +430 -0
- package/dist/dialects/questdb/index.js +292 -0
- package/dist/dialects/redshift/index.d.ts +933 -0
- package/dist/dialects/redshift/index.js +17 -5
- package/dist/dialects/singlestore/index.d.ts +233 -0
- package/dist/dialects/singlestore/index.js +53 -0
- package/dist/dialects/snowflake/index.d.ts +727 -0
- package/dist/dialects/snowflake/index.js +154 -5
- package/dist/dialects/spanner/index.d.ts +660 -0
- package/dist/dialects/spanner/index.js +43 -21
- package/dist/dialects/sqlite/index.d.ts +1133 -0
- package/dist/dialects/sqlite/index.js +168 -30
- package/dist/dialects/tidb/index.d.ts +226 -0
- package/dist/dialects/tidb/index.js +10 -0
- package/dist/dialects/timescaledb/index.d.ts +286 -0
- package/dist/dialects/timescaledb/index.js +179 -0
- package/dist/dialects/trino/index.d.ts +230 -0
- package/dist/dialects/trino/index.js +85 -10
- package/dist/dialects/turso/index.d.ts +98 -0
- package/dist/dialects/turso/index.js +10 -0
- package/dist/dialects/vertica/index.d.ts +321 -0
- package/dist/dialects/vertica/index.js +161 -0
- package/dist/dialects/yugabytedb/index.d.ts +276 -0
- package/dist/dialects/yugabytedb/index.js +121 -0
- package/dist/errors/index.d.ts +378 -0
- package/dist/errors/index.js +29 -1
- package/dist/errors/utils.d.ts +53 -0
- package/dist/errors.d.ts +5 -0
- package/dist/extensions/catalog/cloud-warehouse-features.d.ts +27 -0
- package/dist/extensions/catalog/mssql-features.d.ts +20 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.d.ts +18 -0
- package/dist/extensions/catalog/oracle-db2-features.d.ts +17 -0
- package/dist/extensions/catalog/postgres-extensions.d.ts +15 -0
- package/dist/extensions/index.d.ts +34 -0
- package/dist/extensions/types.d.ts +43 -0
- package/dist/external-fields/adapters.d.ts +50 -0
- package/dist/external-fields/adapters.js +227 -0
- package/dist/external-fields/decorator.d.ts +77 -0
- package/dist/external-fields/decorator.js +80 -0
- package/dist/external-fields/index.d.ts +10 -0
- package/dist/external-fields/index.js +19 -0
- package/dist/external-fields/runtime.d.ts +39 -0
- package/dist/external-fields/runtime.js +221 -0
- package/dist/foreign-data.d.ts +168 -0
- package/dist/graph/base-graph-dialect.d.ts +250 -0
- package/dist/graph/base-graph-dialect.js +539 -0
- package/dist/graph/dgraph/index.d.ts +65 -0
- package/dist/graph/dgraph/index.js +559 -0
- package/dist/graph/gremlin/index.d.ts +59 -0
- package/dist/graph/gremlin/index.js +378 -0
- package/dist/graph/index.d.ts +60 -0
- package/dist/graph/index.js +67 -0
- package/dist/graph/neo4j/index.d.ts +50 -0
- package/dist/graph/neo4j/index.js +462 -0
- package/dist/graph/types.d.ts +213 -0
- package/dist/graph/types.js +234 -0
- package/dist/hooks/hooks-manager.d.ts +189 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/index.d.ts +711 -0
- package/dist/index.js +19 -4
- package/dist/logging.d.ts +183 -0
- package/dist/migrations/index.d.ts +9 -0
- package/dist/migrations/migration.d.ts +143 -0
- package/dist/migrations/migrator.d.ts +199 -0
- package/dist/migrations/prormmigration.d.ts +131 -0
- package/dist/migrations/query-interface.d.ts +335 -0
- package/dist/migrations/seeder.d.ts +167 -0
- package/dist/models/associations.d.ts +131 -0
- package/dist/models/associations.js +7 -2
- package/dist/models/constraints.d.ts +175 -0
- package/dist/models/data-types.d.ts +1656 -0
- package/dist/models/decorators.d.ts +328 -0
- package/dist/models/decorators.js +61 -82
- package/dist/models/eager-load.d.ts +86 -0
- package/dist/models/eager-load.js +369 -0
- package/dist/models/index.d.ts +13 -0
- package/dist/models/indexes.d.ts +325 -0
- package/dist/models/methods.d.ts +419 -0
- package/dist/models/model-manager.d.ts +76 -0
- package/dist/models/model.d.ts +820 -0
- package/dist/models/model.js +15 -101
- package/dist/models/operators.d.ts +29 -0
- package/dist/models/scopes.d.ts +71 -0
- package/dist/models/typescript-types.d.ts +177 -0
- package/dist/nosql/aerospike/index.d.ts +126 -0
- package/dist/nosql/allegrograph/index.d.ts +86 -0
- package/dist/nosql/arangodb/index.d.ts +285 -0
- package/dist/nosql/arangodb/index.js +274 -2
- package/dist/nosql/arangodb/where.d.ts +38 -0
- package/dist/nosql/arangodb/where.js +94 -0
- package/dist/nosql/azure-blob/index.d.ts +104 -0
- package/dist/nosql/beanstalkd/index.d.ts +88 -0
- package/dist/nosql/beequeue/index.d.ts +99 -0
- package/dist/nosql/bigchaindb/index.d.ts +113 -0
- package/dist/nosql/bigtable/index.d.ts +144 -0
- package/dist/nosql/blazegraph/index.d.ts +88 -0
- package/dist/nosql/bullmq/index.d.ts +83 -0
- package/dist/nosql/cassandra/index.d.ts +119 -0
- package/dist/nosql/chroma/index.d.ts +151 -0
- package/dist/nosql/cloudflare-kv/index.d.ts +120 -0
- package/dist/nosql/coherence/index.d.ts +91 -0
- package/dist/nosql/cosmosdb/index.d.ts +78 -0
- package/dist/nosql/couchbase/index.d.ts +103 -0
- package/dist/nosql/dax/index.d.ts +118 -0
- package/dist/nosql/deno-kv/index.d.ts +109 -0
- package/dist/nosql/dgraph/index.d.ts +80 -0
- package/dist/nosql/doris/index.d.ts +88 -0
- package/dist/nosql/druid/index.d.ts +95 -0
- package/dist/nosql/dynamodb/index.d.ts +643 -0
- package/dist/nosql/dynamodb/index.js +423 -0
- package/dist/nosql/elasticsearch/index.d.ts +239 -0
- package/dist/nosql/etcd/index.d.ts +243 -0
- package/dist/nosql/eventhubs/index.d.ts +89 -0
- package/dist/nosql/eventstore/index.d.ts +102 -0
- package/dist/nosql/faunadb/index.d.ts +141 -0
- package/dist/nosql/faunadb/index.js +329 -0
- package/dist/nosql/firestore/index.d.ts +67 -0
- package/dist/nosql/fluree/index.d.ts +88 -0
- package/dist/nosql/fuseki/index.d.ts +94 -0
- package/dist/nosql/gcs/index.d.ts +62 -0
- package/dist/nosql/gearman/index.d.ts +77 -0
- package/dist/nosql/geode/index.d.ts +93 -0
- package/dist/nosql/graphdb/index.d.ts +86 -0
- package/dist/nosql/graylog/index.d.ts +118 -0
- package/dist/nosql/gridgain/index.d.ts +78 -0
- package/dist/nosql/hazelcast/index.d.ts +73 -0
- package/dist/nosql/hbase/index.d.ts +123 -0
- package/dist/nosql/ignite/index.d.ts +80 -0
- package/dist/nosql/immudb/index.d.ts +131 -0
- package/dist/nosql/index.d.ts +215 -0
- package/dist/nosql/infinispan/index.d.ts +95 -0
- package/dist/nosql/influxdb/flux-compiler.d.ts +23 -0
- package/dist/nosql/influxdb/flux-compiler.js +170 -0
- package/dist/nosql/influxdb/index.d.ts +300 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.d.ts +113 -0
- package/dist/nosql/keyspaces/index.d.ts +122 -0
- package/dist/nosql/kinesis/index.d.ts +121 -0
- package/dist/nosql/leveldb/index.d.ts +112 -0
- package/dist/nosql/leveldb/index.js +103 -1
- package/dist/nosql/lmdb/index.d.ts +76 -0
- package/dist/nosql/loki/index.d.ts +126 -0
- package/dist/nosql/marklogic/index.d.ts +76 -0
- package/dist/nosql/materialize/index.d.ts +91 -0
- package/dist/nosql/meilisearch/index.d.ts +76 -0
- package/dist/nosql/memcached/index.d.ts +138 -0
- package/dist/nosql/milvus/index.d.ts +167 -0
- package/dist/nosql/minio/index.d.ts +122 -0
- package/dist/nosql/momento/index.d.ts +99 -0
- package/dist/nosql/mongodb/index.d.ts +265 -0
- package/dist/nosql/mongodb/index.js +139 -0
- package/dist/nosql/mongodb/where.d.ts +8 -0
- package/dist/nosql/mongodb/where.js +181 -0
- package/dist/nosql/nats/index.d.ts +139 -0
- package/dist/nosql/nedb/index.d.ts +79 -0
- package/dist/nosql/neo4j/index.d.ts +217 -0
- package/dist/nosql/neo4j/index.js +26 -14
- package/dist/nosql/neptune/index.d.ts +234 -0
- package/dist/nosql/neptune/index.js +23 -9
- package/dist/nosql/nsq/index.d.ts +93 -0
- package/dist/nosql/opensearch/index.d.ts +97 -0
- package/dist/nosql/orientdb/index.d.ts +72 -0
- package/dist/nosql/papertrail/index.d.ts +120 -0
- package/dist/nosql/pinecone/index.d.ts +148 -0
- package/dist/nosql/pinot/index.d.ts +90 -0
- package/dist/nosql/pouchdb/index.d.ts +95 -0
- package/dist/nosql/prometheus/index.d.ts +112 -0
- package/dist/nosql/provendb/index.d.ts +143 -0
- package/dist/nosql/provendb/index.js +262 -0
- package/dist/nosql/pubsub/index.d.ts +83 -0
- package/dist/nosql/pulsar/index.d.ts +105 -0
- package/dist/nosql/qdrant/index.d.ts +231 -0
- package/dist/nosql/qldb/index.d.ts +182 -0
- package/dist/nosql/qldb/index.js +302 -1
- package/dist/nosql/r2/index.d.ts +160 -0
- package/dist/nosql/rabbitmq/index.d.ts +131 -0
- package/dist/nosql/ravendb/index.d.ts +138 -0
- package/dist/nosql/ravendb/index.js +323 -9
- package/dist/nosql/ravendb/where.d.ts +38 -0
- package/dist/nosql/ravendb/where.js +94 -0
- package/dist/nosql/redis/index.d.ts +267 -0
- package/dist/nosql/redis/index.js +19 -5
- package/dist/nosql/redpanda/index.d.ts +117 -0
- package/dist/nosql/resque/index.d.ts +91 -0
- package/dist/nosql/rethinkdb/index.d.ts +194 -0
- package/dist/nosql/rethinkdb/index.js +290 -0
- package/dist/nosql/rethinkdb/where.d.ts +38 -0
- package/dist/nosql/rethinkdb/where.js +94 -0
- package/dist/nosql/rocksdb/document-layer.d.ts +162 -0
- package/dist/nosql/rocksdb/document-layer.js +338 -0
- package/dist/nosql/rocksdb/index.d.ts +112 -0
- package/dist/nosql/rocksdb/index.js +103 -1
- package/dist/nosql/rocksdb/where-match.d.ts +21 -0
- package/dist/nosql/rocksdb/where-match.js +238 -0
- package/dist/nosql/rockset/index.d.ts +84 -0
- package/dist/nosql/s3/index.d.ts +170 -0
- package/dist/nosql/scylladb/index.d.ts +117 -0
- package/dist/nosql/signoz/index.d.ts +116 -0
- package/dist/nosql/sns/index.d.ts +99 -0
- package/dist/nosql/solr/index.d.ts +129 -0
- package/dist/nosql/splunk/index.d.ts +125 -0
- package/dist/nosql/sqs/index.d.ts +116 -0
- package/dist/nosql/stardog/index.d.ts +86 -0
- package/dist/nosql/starrocks/index.d.ts +89 -0
- package/dist/nosql/store.d.ts +23 -0
- package/dist/nosql/sumologic/index.d.ts +119 -0
- package/dist/nosql/surrealdb/index.d.ts +156 -0
- package/dist/nosql/surrealdb/index.js +174 -1
- package/dist/nosql/surrealdb/query-compiler.d.ts +26 -0
- package/dist/nosql/surrealdb/query-compiler.js +193 -0
- package/dist/nosql/terminusdb/index.d.ts +95 -0
- package/dist/nosql/tigergraph/index.d.ts +314 -0
- package/dist/nosql/typesense/index.d.ts +82 -0
- package/dist/nosql/unqlite/index.d.ts +68 -0
- package/dist/nosql/upstash/index.d.ts +80 -0
- package/dist/nosql/vercel-kv/index.d.ts +82 -0
- package/dist/nosql/victoriametrics/index.d.ts +129 -0
- package/dist/nosql/virtuoso/index.d.ts +87 -0
- package/dist/nosql/weaviate/index.d.ts +196 -0
- package/dist/operators/index.d.ts +7 -0
- package/dist/operators.d.ts +2947 -0
- package/dist/operators.js +46 -1
- package/dist/prisma-migrate/index.d.ts +28 -0
- package/dist/prisma-migrate/migration-generator.d.ts +21 -0
- package/dist/prisma-migrate/model-generator.d.ts +12 -0
- package/dist/prisma-migrate/relations.d.ts +28 -0
- package/dist/prisma-migrate/schema-parser.d.ts +42 -0
- package/dist/prisma-migrate/type-mapper.d.ts +20 -0
- package/dist/prorm.d.ts +2093 -0
- package/dist/prorm.js +721 -302
- package/dist/query-builders/cte-builder.d.ts +104 -0
- package/dist/query-builders/functions/aggregate.d.ts +199 -0
- package/dist/query-builders/functions/conditional.d.ts +195 -0
- package/dist/query-builders/functions/datetime.d.ts +202 -0
- package/dist/query-builders/functions/fulltext.d.ts +220 -0
- package/dist/query-builders/functions/index.d.ts +17 -0
- package/dist/query-builders/functions/json.d.ts +157 -0
- package/dist/query-builders/functions/math.d.ts +215 -0
- package/dist/query-builders/functions/string.d.ts +233 -0
- package/dist/query-builders/functions/window.d.ts +209 -0
- package/dist/query-builders/include-builder.d.ts +85 -0
- package/dist/query-builders/index-expression-builder.d.ts +153 -0
- package/dist/query-builders/index.d.ts +121 -0
- package/dist/query-builders/index.js +10 -0
- package/dist/query-builders/insert-builder.d.ts +62 -0
- package/dist/query-builders/model-helpers.d.ts +28 -0
- package/dist/query-builders/order-limit-builder.d.ts +84 -0
- package/dist/query-builders/sql-compiler.d.ts +562 -0
- package/dist/query-builders/subquery-builder.d.ts +133 -0
- package/dist/query-builders/update-builder.d.ts +71 -0
- package/dist/query-builders/view-builder.d.ts +189 -0
- package/dist/query-builders/where-builder.d.ts +124 -0
- package/dist/query-interface.d.ts +407 -0
- package/dist/query-interface.js +84 -0
- package/dist/query-optimizers/batch-optimizer.d.ts +175 -0
- package/dist/query-optimizers/explain-plans.d.ts +187 -0
- package/dist/query-optimizers/index.d.ts +27 -0
- package/dist/query-optimizers/prepared-statement-cache.d.ts +252 -0
- package/dist/query-optimizers/query-hints.d.ts +201 -0
- package/dist/query-optimizers/query-optimizer.d.ts +162 -0
- package/dist/query-optimizers/slow-query-logger.d.ts +186 -0
- package/dist/replica-manager.d.ts +235 -0
- package/dist/schema/index.d.ts +7 -0
- package/dist/schema/migration-generator.d.ts +74 -0
- package/dist/schema/schema-differ.d.ts +114 -0
- package/dist/schema/types.d.ts +246 -0
- package/dist/schema-objects.d.ts +78 -0
- package/dist/schema-objects.js +203 -0
- package/dist/sql-constants.d.ts +240 -0
- package/dist/sqlite-advanced.d.ts +572 -0
- package/dist/streams/index.d.ts +5 -0
- package/dist/streams/transforms.d.ts +120 -0
- package/dist/transaction.d.ts +221 -0
- package/dist/types/index.d.ts +3123 -0
- package/dist/user-management.d.ts +141 -0
- package/dist/utils/date.d.ts +149 -0
- package/dist/utils/index.d.ts +359 -0
- package/dist/utils/string.d.ts +88 -0
- package/dist/validators/index.d.ts +7 -0
- package/dist/validators/validator.d.ts +306 -0
- package/package.json +20 -5
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RethinkDB store implementation.
|
|
3
|
+
*
|
|
4
|
+
* RethinkDB is a document store whose queries are built by chaining methods
|
|
5
|
+
* on a term-builder (`r`) and executed with a trailing `.run()` - e.g.
|
|
6
|
+
* `r.table('users').filter({ active: true }).run(conn)`. That fluent,
|
|
7
|
+
* function-composition query model is nothing like the SQL-shaped `Dialect`
|
|
8
|
+
* interface (no `query(sql)`, no identifier escaping, no relational DDL), so
|
|
9
|
+
* this class implements the minimal `NoSqlStore` marker interface for
|
|
10
|
+
* connection lifecycle and otherwise exposes RethinkDB's real surface
|
|
11
|
+
* directly: document CRUD, ReQL `filter` predicates, table/database
|
|
12
|
+
* creation, and a `run()` escape hatch for arbitrary ReQL terms.
|
|
13
|
+
*
|
|
14
|
+
* Uses the `rethinkdb-ts` driver. The driver is lazily `require`d inside
|
|
15
|
+
* `connect()` so importing this module never forces `rethinkdb-ts` to be
|
|
16
|
+
* installed; the term-builder (`r`) and/or a `connection` can also be
|
|
17
|
+
* injected via the constructor options (used by the tests, and handy when a
|
|
18
|
+
* pool is managed elsewhere), in which case `connect()` skips the require.
|
|
19
|
+
*/
|
|
20
|
+
import { NoSqlStore } from '../store';
|
|
21
|
+
/**
|
|
22
|
+
* Connection options for `RethinkDBStore`.
|
|
23
|
+
*
|
|
24
|
+
* `host`/`port`/`db` configure the connection made by the lazily-required
|
|
25
|
+
* `rethinkdb-ts` driver. Alternatively, an already-built term-builder (`r`)
|
|
26
|
+
* and/or an established `connection` can be injected: when `r` is provided,
|
|
27
|
+
* `connect()` uses it as-is and does not `require('rethinkdb-ts')`; when
|
|
28
|
+
* `connection` is provided, queries run against it (single-connection mode)
|
|
29
|
+
* instead of a driver-managed pool.
|
|
30
|
+
*/
|
|
31
|
+
export interface RethinkDBStoreOptions {
|
|
32
|
+
/** RethinkDB host. Defaults to `'localhost'`. */
|
|
33
|
+
host?: string;
|
|
34
|
+
/** RethinkDB client-driver port. Defaults to `28015`. */
|
|
35
|
+
port?: number;
|
|
36
|
+
/** Default database queries run against. Defaults to `'test'`. */
|
|
37
|
+
db?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Injected `rethinkdb-ts` term-builder. When provided, `connect()` uses
|
|
40
|
+
* it directly and skips `require('rethinkdb-ts')` (used by tests to inject
|
|
41
|
+
* a mock, and to share an `r` configured elsewhere).
|
|
42
|
+
*/
|
|
43
|
+
r?: any;
|
|
44
|
+
/**
|
|
45
|
+
* Injected connection. When provided, queries `.run(connection)` against
|
|
46
|
+
* it (single-connection mode) rather than relying on the driver's pool.
|
|
47
|
+
*/
|
|
48
|
+
connection?: any;
|
|
49
|
+
}
|
|
50
|
+
/** One `[field, direction]` ordering term, e.g. `['createdAt', 'DESC']`. */
|
|
51
|
+
export type OrderTerm = [string, 'ASC' | 'DESC'] | string;
|
|
52
|
+
/** Options for {@link RethinkDBStore.findAll}/{@link RethinkDBStore.findOne}. */
|
|
53
|
+
export interface RethinkFindOptions {
|
|
54
|
+
/** Ordering terms applied in sequence. A bare string sorts ascending. */
|
|
55
|
+
order?: OrderTerm | OrderTerm[];
|
|
56
|
+
/** Maximum number of documents to return. */
|
|
57
|
+
limit?: number;
|
|
58
|
+
/** Number of leading documents to skip (offset). */
|
|
59
|
+
offset?: number;
|
|
60
|
+
}
|
|
61
|
+
/** A group-aggregation request for {@link RethinkDBStore.aggregate}. */
|
|
62
|
+
export interface RethinkAggregateOptions {
|
|
63
|
+
/** ORM `where` filter applied before grouping. */
|
|
64
|
+
where?: Record<string | symbol, unknown>;
|
|
65
|
+
/** Field(s) to group by. Omit for a single whole-table group. */
|
|
66
|
+
groupBy?: string | string[];
|
|
67
|
+
/** Emit a `count` per group. */
|
|
68
|
+
count?: boolean;
|
|
69
|
+
/** Fields to `sum` per group, keyed by output name → source field. */
|
|
70
|
+
sum?: Record<string, string>;
|
|
71
|
+
/** Fields to `avg` per group, keyed by output name → source field. */
|
|
72
|
+
avg?: Record<string, string>;
|
|
73
|
+
/** Fields to `min` per group, keyed by output name → source field. */
|
|
74
|
+
min?: Record<string, string>;
|
|
75
|
+
/** Fields to `max` per group, keyed by output name → source field. */
|
|
76
|
+
max?: Record<string, string>;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* `RethinkDBStore` wraps the `rethinkdb-ts` term-builder (`r`) in a small,
|
|
80
|
+
* promise-based convenience layer over document CRUD, ReQL `filter`
|
|
81
|
+
* queries, and table/database creation, plus a `run()` escape hatch for
|
|
82
|
+
* arbitrary ReQL terms.
|
|
83
|
+
*/
|
|
84
|
+
export declare class RethinkDBStore implements NoSqlStore {
|
|
85
|
+
readonly name = "rethinkdb";
|
|
86
|
+
readonly library = "rethinkdb-ts";
|
|
87
|
+
private readonly options;
|
|
88
|
+
/** The `rethinkdb-ts` term-builder (`r`) once connected. */
|
|
89
|
+
private r;
|
|
90
|
+
/** A single connection, when in single-connection (injected) mode. */
|
|
91
|
+
private connection;
|
|
92
|
+
private connected;
|
|
93
|
+
constructor(options?: RethinkDBStoreOptions);
|
|
94
|
+
connect(): Promise<void>;
|
|
95
|
+
disconnect(): Promise<void>;
|
|
96
|
+
isConnected(): boolean;
|
|
97
|
+
/** Returns the underlying `rethinkdb-ts` term-builder (`r`). */
|
|
98
|
+
getClient(): unknown;
|
|
99
|
+
private requireR;
|
|
100
|
+
/**
|
|
101
|
+
* Execute a built ReQL query. In single-connection mode the connection is
|
|
102
|
+
* passed to `.run(connection)`; with a driver-managed pool `.run()` needs
|
|
103
|
+
* no argument.
|
|
104
|
+
*/
|
|
105
|
+
private runQuery;
|
|
106
|
+
private exec;
|
|
107
|
+
/** Insert a document (or array of documents) into `table`. */
|
|
108
|
+
insert<T = any>(table: string, doc: Record<string, unknown> | Record<string, unknown>[]): Promise<T>;
|
|
109
|
+
/** Fetch a single document from `table` by its primary key. Resolves to `null` if not found. */
|
|
110
|
+
get<T = any>(table: string, id: unknown): Promise<T | null>;
|
|
111
|
+
/** Partially update the document with primary key `id` in `table`, merging `patch`. */
|
|
112
|
+
update<T = any>(table: string, id: unknown, patch: Record<string, unknown>): Promise<T>;
|
|
113
|
+
/** Delete the document with primary key `id` from `table`. */
|
|
114
|
+
delete<T = any>(table: string, id: unknown): Promise<T>;
|
|
115
|
+
/**
|
|
116
|
+
* Return all documents in `table` matching `predicate` as an array.
|
|
117
|
+
* `predicate` is any ReQL `filter` argument - a match object
|
|
118
|
+
* (`{ active: true }`) or a predicate function (`row => row('age').gt(18)`).
|
|
119
|
+
* The result is materialized (cursor drained to an array) before returning.
|
|
120
|
+
*/
|
|
121
|
+
filter<T = any>(table: string, predicate: unknown): Promise<T[]>;
|
|
122
|
+
/** Drain a ReQL cursor to an array (arrays and plain values are passed through). */
|
|
123
|
+
private toArray;
|
|
124
|
+
private applyOrderLimit;
|
|
125
|
+
/**
|
|
126
|
+
* Fetch all documents in `table` matching an ORM `where` clause, with
|
|
127
|
+
* optional ordering, offset, and limit. The `where` object accepts the full
|
|
128
|
+
* ORM operator surface (`Op.gt`, `Op.in`, `Op.like`, `Op.and`/`Op.or`, ...),
|
|
129
|
+
* translated to a native ReQL `filter` predicate - so standard queries never
|
|
130
|
+
* require hand-written ReQL.
|
|
131
|
+
*/
|
|
132
|
+
findAll<T = any>(table: string, where?: Record<string | symbol, unknown>, options?: RethinkFindOptions): Promise<T[]>;
|
|
133
|
+
/** Fetch the first document in `table` matching an ORM `where` clause (respecting `order`), or `null`. */
|
|
134
|
+
findOne<T = any>(table: string, where?: Record<string | symbol, unknown>, options?: Omit<RethinkFindOptions, 'limit'>): Promise<T | null>;
|
|
135
|
+
/** Count documents in `table` matching an ORM `where` clause. */
|
|
136
|
+
count(table: string, where?: Record<string | symbol, unknown>): Promise<number>;
|
|
137
|
+
/** Update every document in `table` matching an ORM `where` clause, merging `patch`. */
|
|
138
|
+
updateWhere<T = any>(table: string, where: Record<string | symbol, unknown>, patch: Record<string, unknown>): Promise<T>;
|
|
139
|
+
/** Delete every document in `table` matching an ORM `where` clause. */
|
|
140
|
+
deleteWhere<T = any>(table: string, where: Record<string | symbol, unknown>): Promise<T>;
|
|
141
|
+
/**
|
|
142
|
+
* Insert `doc`, updating (or replacing) the existing row on a primary-key
|
|
143
|
+
* conflict - RethinkDB's native upsert via `insert(..., { conflict })`.
|
|
144
|
+
*/
|
|
145
|
+
upsert<T = any>(table: string, doc: Record<string, unknown> | Record<string, unknown>[], conflict?: 'update' | 'replace'): Promise<T>;
|
|
146
|
+
/** Distinct values of `field` across `table` (optionally over a secondary index). */
|
|
147
|
+
distinct<T = any>(table: string, field?: string, index?: string): Promise<T[]>;
|
|
148
|
+
/** Fetch documents whose key (or secondary-index value) is one of `keys`. */
|
|
149
|
+
getAll<T = any>(table: string, keys: unknown[], index?: string): Promise<T[]>;
|
|
150
|
+
/**
|
|
151
|
+
* Grouped aggregation over `table` using ReQL's native `group`/reduction
|
|
152
|
+
* chain (`count`/`sum`/`avg`/`min`/`max`), with an optional ORM `where`
|
|
153
|
+
* pre-filter. Returns one entry per group: `{ group, ...aggregates }`.
|
|
154
|
+
*/
|
|
155
|
+
aggregate(table: string, options?: RethinkAggregateOptions): Promise<Array<Record<string, unknown>>>;
|
|
156
|
+
/** Create a secondary index on `table`. `indexer` may be a field name, list of fields (compound), or a ReQL function. */
|
|
157
|
+
indexCreate<T = any>(table: string, name: string, indexer?: unknown, options?: Record<string, unknown>): Promise<T>;
|
|
158
|
+
/** Drop a secondary index from `table`. */
|
|
159
|
+
indexDrop<T = any>(table: string, name: string): Promise<T>;
|
|
160
|
+
/** List secondary index names on `table`. */
|
|
161
|
+
indexList(table: string): Promise<string[]>;
|
|
162
|
+
/** Wait for one or all secondary indexes on `table` to finish building. */
|
|
163
|
+
indexWait<T = any>(table: string, ...names: string[]): Promise<T>;
|
|
164
|
+
/**
|
|
165
|
+
* Create a table. Pass a single `name` to create it in the connection's
|
|
166
|
+
* default database, or `(db, name)` to create it in a specific database.
|
|
167
|
+
*/
|
|
168
|
+
createTable<T = any>(dbOrName: string, name?: string): Promise<T>;
|
|
169
|
+
/** Drop a table. Pass a single `name`, or `(db, name)` for a specific database. */
|
|
170
|
+
dropTable<T = any>(dbOrName: string, name?: string): Promise<T>;
|
|
171
|
+
/** List tables in the default (or given) database. */
|
|
172
|
+
listTables(db?: string): Promise<string[]>;
|
|
173
|
+
/** Create a database. */
|
|
174
|
+
createDatabase<T = any>(name: string): Promise<T>;
|
|
175
|
+
/** Drop a database. */
|
|
176
|
+
dropDatabase<T = any>(name: string): Promise<T>;
|
|
177
|
+
/** List all databases. */
|
|
178
|
+
listDatabases(): Promise<string[]>;
|
|
179
|
+
/**
|
|
180
|
+
* RethinkDB has no multi-document transactions. Single-document writes are
|
|
181
|
+
* atomic, and {@link updateWhere}/{@link deleteWhere} apply atomically per
|
|
182
|
+
* document, but there is no way to commit changes across documents/tables
|
|
183
|
+
* as a unit. This throws a clear, typed capability error rather than
|
|
184
|
+
* silently pretending to provide isolation.
|
|
185
|
+
*/
|
|
186
|
+
withTransaction<T>(_fn: (store: this) => Promise<T>): Promise<never>;
|
|
187
|
+
/**
|
|
188
|
+
* Run an arbitrary ReQL `query` term (built from `getClient()`), for
|
|
189
|
+
* operations not wrapped here. In single-connection mode the store's
|
|
190
|
+
* connection is supplied to `.run()` automatically.
|
|
191
|
+
*/
|
|
192
|
+
run<T = any>(query: any): Promise<T>;
|
|
193
|
+
}
|
|
194
|
+
export default RethinkDBStore;
|
|
@@ -21,9 +21,113 @@
|
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.RethinkDBStore = void 0;
|
|
23
23
|
const errors_1 = require("../../errors");
|
|
24
|
+
const operators_1 = require("../../operators");
|
|
25
|
+
const where_1 = require("./where");
|
|
24
26
|
const DEFAULT_HOST = 'localhost';
|
|
25
27
|
const DEFAULT_PORT = 28015;
|
|
26
28
|
const DEFAULT_DB = 'test';
|
|
29
|
+
/** Whether `order` is a single `[field, direction]` tuple rather than a list of terms. */
|
|
30
|
+
function isSingleOrderTerm(order) {
|
|
31
|
+
return (order.length === 2 &&
|
|
32
|
+
typeof order[0] === 'string' &&
|
|
33
|
+
(order[1] === 'ASC' || order[1] === 'DESC'));
|
|
34
|
+
}
|
|
35
|
+
/** Access a possibly-dotted field path on a ReQL `row`, e.g. `a.b` → `row('a')('b')`. */
|
|
36
|
+
function reqlField(row, field) {
|
|
37
|
+
const parts = field.split('.');
|
|
38
|
+
let acc = row(parts[0]);
|
|
39
|
+
for (let i = 1; i < parts.length; i++)
|
|
40
|
+
acc = acc(parts[i]);
|
|
41
|
+
return acc;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Render a {@link WhereNode} into a ReQL predicate function
|
|
45
|
+
* (`row => booleanTerm`) using the term-builder `r`. Covers the standard ORM
|
|
46
|
+
* comparison and logical operators so callers never hand-write ReQL filters.
|
|
47
|
+
*/
|
|
48
|
+
function buildReqlPredicate(r, node) {
|
|
49
|
+
switch (node.kind) {
|
|
50
|
+
case 'true':
|
|
51
|
+
return () => r.expr(true);
|
|
52
|
+
case 'and': {
|
|
53
|
+
const parts = node.nodes.map((n) => buildReqlPredicate(r, n));
|
|
54
|
+
return (row) => parts.slice(1).reduce((acc, p) => acc.and(p(row)), parts[0] ? parts[0](row) : r.expr(true));
|
|
55
|
+
}
|
|
56
|
+
case 'or': {
|
|
57
|
+
const parts = node.nodes.map((n) => buildReqlPredicate(r, n));
|
|
58
|
+
return (row) => parts.slice(1).reduce((acc, p) => acc.or(p(row)), parts[0] ? parts[0](row) : r.expr(false));
|
|
59
|
+
}
|
|
60
|
+
case 'not': {
|
|
61
|
+
const inner = buildReqlPredicate(r, node.node);
|
|
62
|
+
return (row) => inner(row).not();
|
|
63
|
+
}
|
|
64
|
+
case 'cmp':
|
|
65
|
+
return (row) => buildReqlCmp(r, row, node.field, node.op, node.value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function buildReqlCmp(r, row, field, op, value) {
|
|
69
|
+
const f = reqlField(row, field);
|
|
70
|
+
switch (op) {
|
|
71
|
+
case operators_1.Op.eq:
|
|
72
|
+
return value === null ? f.eq(null).or(r.not(row.hasFields(field))) : f.eq(value);
|
|
73
|
+
case operators_1.Op.ne:
|
|
74
|
+
return value === null ? f.eq(null).not().and(row.hasFields(field)) : f.ne(value);
|
|
75
|
+
case operators_1.Op.gt:
|
|
76
|
+
return f.gt(value);
|
|
77
|
+
case operators_1.Op.gte:
|
|
78
|
+
return f.ge(value);
|
|
79
|
+
case operators_1.Op.lt:
|
|
80
|
+
return f.lt(value);
|
|
81
|
+
case operators_1.Op.lte:
|
|
82
|
+
return f.le(value);
|
|
83
|
+
case operators_1.Op.in:
|
|
84
|
+
return r.expr(value).contains(f);
|
|
85
|
+
case operators_1.Op.notIn:
|
|
86
|
+
return r.expr(value).contains(f).not();
|
|
87
|
+
case operators_1.Op.between: {
|
|
88
|
+
const [lo, hi] = value;
|
|
89
|
+
return f.ge(lo).and(f.le(hi));
|
|
90
|
+
}
|
|
91
|
+
case operators_1.Op.notBetween: {
|
|
92
|
+
const [lo, hi] = value;
|
|
93
|
+
return f.ge(lo).and(f.le(hi)).not();
|
|
94
|
+
}
|
|
95
|
+
case operators_1.Op.isNull:
|
|
96
|
+
return f.eq(null).or(r.not(row.hasFields(field)));
|
|
97
|
+
case operators_1.Op.isNotNull:
|
|
98
|
+
return row.hasFields(field).and(f.eq(null).not());
|
|
99
|
+
case operators_1.Op.like:
|
|
100
|
+
return f.match((0, where_1.likeToRegex)(String(value)));
|
|
101
|
+
case operators_1.Op.notLike:
|
|
102
|
+
return f.match((0, where_1.likeToRegex)(String(value))).not();
|
|
103
|
+
case operators_1.Op.iLike:
|
|
104
|
+
return f.match((0, where_1.likeToRegex)(String(value), true));
|
|
105
|
+
case operators_1.Op.notILike:
|
|
106
|
+
return f.match((0, where_1.likeToRegex)(String(value), true)).not();
|
|
107
|
+
case operators_1.Op.startsWith:
|
|
108
|
+
return f.match(`^${escapeReqlRegex(String(value))}`);
|
|
109
|
+
case operators_1.Op.endsWith:
|
|
110
|
+
return f.match(`${escapeReqlRegex(String(value))}$`);
|
|
111
|
+
case operators_1.Op.substring:
|
|
112
|
+
case operators_1.Op.contains:
|
|
113
|
+
return f.match(escapeReqlRegex(String(value)));
|
|
114
|
+
case operators_1.Op.regexp:
|
|
115
|
+
return f.match(String(value));
|
|
116
|
+
case operators_1.Op.notRegexp:
|
|
117
|
+
return f.match(String(value)).not();
|
|
118
|
+
case operators_1.Op.iRegexp:
|
|
119
|
+
return f.match(`(?i)${String(value)}`);
|
|
120
|
+
case operators_1.Op.notIRegexp:
|
|
121
|
+
return f.match(`(?i)${String(value)}`).not();
|
|
122
|
+
default:
|
|
123
|
+
throw new errors_1.DatabaseError(`RethinkDB: unsupported where operator "${op.toString()}"`, {
|
|
124
|
+
code: errors_1.ErrorCodes.QUERY_ERROR,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function escapeReqlRegex(s) {
|
|
129
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
130
|
+
}
|
|
27
131
|
function wrapConnectionError(err, host) {
|
|
28
132
|
const parent = err instanceof Error ? err : new Error(String(err));
|
|
29
133
|
const message = /econnrefused/i.test(parent.message)
|
|
@@ -189,6 +293,159 @@ class RethinkDBStore {
|
|
|
189
293
|
return result == null ? [] : [result];
|
|
190
294
|
}
|
|
191
295
|
// ---------------------------------------------------------------------
|
|
296
|
+
// ORM-shaped queries (no hand-written ReQL required)
|
|
297
|
+
// ---------------------------------------------------------------------
|
|
298
|
+
applyOrderLimit(r, query, options = {}) {
|
|
299
|
+
let q = query;
|
|
300
|
+
if (options.order !== undefined) {
|
|
301
|
+
const terms = Array.isArray(options.order) && !isSingleOrderTerm(options.order)
|
|
302
|
+
? options.order
|
|
303
|
+
: [options.order];
|
|
304
|
+
const reqlTerms = terms.map((term) => {
|
|
305
|
+
if (typeof term === 'string')
|
|
306
|
+
return r.asc(term);
|
|
307
|
+
const [field, dir] = term;
|
|
308
|
+
return dir === 'DESC' ? r.desc(field) : r.asc(field);
|
|
309
|
+
});
|
|
310
|
+
q = q.orderBy(...reqlTerms);
|
|
311
|
+
}
|
|
312
|
+
if (typeof options.offset === 'number')
|
|
313
|
+
q = q.skip(options.offset);
|
|
314
|
+
if (typeof options.limit === 'number')
|
|
315
|
+
q = q.limit(options.limit);
|
|
316
|
+
return q;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Fetch all documents in `table` matching an ORM `where` clause, with
|
|
320
|
+
* optional ordering, offset, and limit. The `where` object accepts the full
|
|
321
|
+
* ORM operator surface (`Op.gt`, `Op.in`, `Op.like`, `Op.and`/`Op.or`, ...),
|
|
322
|
+
* translated to a native ReQL `filter` predicate - so standard queries never
|
|
323
|
+
* require hand-written ReQL.
|
|
324
|
+
*/
|
|
325
|
+
async findAll(table, where = {}, options = {}) {
|
|
326
|
+
const result = await this.exec((r) => {
|
|
327
|
+
const pred = buildReqlPredicate(r, (0, where_1.parseWhere)(where));
|
|
328
|
+
return this.applyOrderLimit(r, r.table(table).filter(pred), options);
|
|
329
|
+
}, 'findAll');
|
|
330
|
+
return this.toArray(result);
|
|
331
|
+
}
|
|
332
|
+
/** Fetch the first document in `table` matching an ORM `where` clause (respecting `order`), or `null`. */
|
|
333
|
+
async findOne(table, where = {}, options = {}) {
|
|
334
|
+
const rows = await this.findAll(table, where, { ...options, limit: 1 });
|
|
335
|
+
return rows.length > 0 ? rows[0] : null;
|
|
336
|
+
}
|
|
337
|
+
/** Count documents in `table` matching an ORM `where` clause. */
|
|
338
|
+
async count(table, where = {}) {
|
|
339
|
+
return this.exec((r) => {
|
|
340
|
+
const pred = buildReqlPredicate(r, (0, where_1.parseWhere)(where));
|
|
341
|
+
return r.table(table).filter(pred).count();
|
|
342
|
+
}, 'count');
|
|
343
|
+
}
|
|
344
|
+
/** Update every document in `table` matching an ORM `where` clause, merging `patch`. */
|
|
345
|
+
async updateWhere(table, where, patch) {
|
|
346
|
+
return this.exec((r) => {
|
|
347
|
+
const pred = buildReqlPredicate(r, (0, where_1.parseWhere)(where));
|
|
348
|
+
return r.table(table).filter(pred).update(patch);
|
|
349
|
+
}, 'updateWhere');
|
|
350
|
+
}
|
|
351
|
+
/** Delete every document in `table` matching an ORM `where` clause. */
|
|
352
|
+
async deleteWhere(table, where) {
|
|
353
|
+
return this.exec((r) => {
|
|
354
|
+
const pred = buildReqlPredicate(r, (0, where_1.parseWhere)(where));
|
|
355
|
+
return r.table(table).filter(pred).delete();
|
|
356
|
+
}, 'deleteWhere');
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Insert `doc`, updating (or replacing) the existing row on a primary-key
|
|
360
|
+
* conflict - RethinkDB's native upsert via `insert(..., { conflict })`.
|
|
361
|
+
*/
|
|
362
|
+
async upsert(table, doc, conflict = 'update') {
|
|
363
|
+
return this.exec((r) => r.table(table).insert(doc, { conflict }), 'upsert');
|
|
364
|
+
}
|
|
365
|
+
/** Distinct values of `field` across `table` (optionally over a secondary index). */
|
|
366
|
+
async distinct(table, field, index) {
|
|
367
|
+
const result = await this.exec((r) => {
|
|
368
|
+
let q = r.table(table);
|
|
369
|
+
if (index)
|
|
370
|
+
return q.distinct({ index });
|
|
371
|
+
if (field)
|
|
372
|
+
q = q.getField(field);
|
|
373
|
+
return q.distinct();
|
|
374
|
+
}, 'distinct');
|
|
375
|
+
return this.toArray(result);
|
|
376
|
+
}
|
|
377
|
+
/** Fetch documents whose key (or secondary-index value) is one of `keys`. */
|
|
378
|
+
async getAll(table, keys, index) {
|
|
379
|
+
const result = await this.exec((r) => index ? r.table(table).getAll(...keys, { index }) : r.table(table).getAll(...keys), 'getAll');
|
|
380
|
+
return this.toArray(result);
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Grouped aggregation over `table` using ReQL's native `group`/reduction
|
|
384
|
+
* chain (`count`/`sum`/`avg`/`min`/`max`), with an optional ORM `where`
|
|
385
|
+
* pre-filter. Returns one entry per group: `{ group, ...aggregates }`.
|
|
386
|
+
*/
|
|
387
|
+
async aggregate(table, options = {}) {
|
|
388
|
+
const result = await this.exec((r) => {
|
|
389
|
+
let q = r.table(table);
|
|
390
|
+
if (options.where)
|
|
391
|
+
q = q.filter(buildReqlPredicate(r, (0, where_1.parseWhere)(options.where)));
|
|
392
|
+
const groupFields = options.groupBy
|
|
393
|
+
? Array.isArray(options.groupBy)
|
|
394
|
+
? options.groupBy
|
|
395
|
+
: [options.groupBy]
|
|
396
|
+
: [];
|
|
397
|
+
const grouped = groupFields.length > 0 ? q.group(...groupFields) : q.group(() => r.expr(null));
|
|
398
|
+
const aggregates = {};
|
|
399
|
+
if (options.count)
|
|
400
|
+
aggregates.count = grouped.count();
|
|
401
|
+
for (const [out, src] of Object.entries(options.sum ?? {}))
|
|
402
|
+
aggregates[out] = grouped.sum(src);
|
|
403
|
+
for (const [out, src] of Object.entries(options.avg ?? {}))
|
|
404
|
+
aggregates[out] = grouped.avg(src);
|
|
405
|
+
for (const [out, src] of Object.entries(options.min ?? {}))
|
|
406
|
+
aggregates[out] = grouped.min(src)(src);
|
|
407
|
+
for (const [out, src] of Object.entries(options.max ?? {}))
|
|
408
|
+
aggregates[out] = grouped.max(src)(src);
|
|
409
|
+
if (Object.keys(aggregates).length === 0)
|
|
410
|
+
aggregates.count = grouped.count();
|
|
411
|
+
// Ungroup each aggregate stream and merge by group key on the client.
|
|
412
|
+
const streams = Object.entries(aggregates).map(([name, agg]) => agg.ungroup().map((row) => ({ group: row('group'), name, value: row('reduction') })));
|
|
413
|
+
return r.union(...streams).coerceTo('array');
|
|
414
|
+
}, 'aggregate');
|
|
415
|
+
const rows = await this.toArray(result);
|
|
416
|
+
const byGroup = new Map();
|
|
417
|
+
for (const row of rows) {
|
|
418
|
+
const key = JSON.stringify(row.group);
|
|
419
|
+
const entry = byGroup.get(key) ?? { group: row.group };
|
|
420
|
+
entry[row.name] = row.value;
|
|
421
|
+
byGroup.set(key, entry);
|
|
422
|
+
}
|
|
423
|
+
return Array.from(byGroup.values());
|
|
424
|
+
}
|
|
425
|
+
// ---------------------------------------------------------------------
|
|
426
|
+
// Secondary indexes
|
|
427
|
+
// ---------------------------------------------------------------------
|
|
428
|
+
/** Create a secondary index on `table`. `indexer` may be a field name, list of fields (compound), or a ReQL function. */
|
|
429
|
+
async indexCreate(table, name, indexer, options) {
|
|
430
|
+
return this.exec((r) => {
|
|
431
|
+
if (indexer === undefined)
|
|
432
|
+
return r.table(table).indexCreate(name, options);
|
|
433
|
+
return r.table(table).indexCreate(name, indexer, options);
|
|
434
|
+
}, 'indexCreate');
|
|
435
|
+
}
|
|
436
|
+
/** Drop a secondary index from `table`. */
|
|
437
|
+
async indexDrop(table, name) {
|
|
438
|
+
return this.exec((r) => r.table(table).indexDrop(name), 'indexDrop');
|
|
439
|
+
}
|
|
440
|
+
/** List secondary index names on `table`. */
|
|
441
|
+
async indexList(table) {
|
|
442
|
+
return this.exec((r) => r.table(table).indexList(), 'indexList');
|
|
443
|
+
}
|
|
444
|
+
/** Wait for one or all secondary indexes on `table` to finish building. */
|
|
445
|
+
async indexWait(table, ...names) {
|
|
446
|
+
return this.exec((r) => (names.length > 0 ? r.table(table).indexWait(...names) : r.table(table).indexWait()), 'indexWait');
|
|
447
|
+
}
|
|
448
|
+
// ---------------------------------------------------------------------
|
|
192
449
|
// Schema / administration
|
|
193
450
|
// ---------------------------------------------------------------------
|
|
194
451
|
/**
|
|
@@ -201,10 +458,43 @@ class RethinkDBStore {
|
|
|
201
458
|
}
|
|
202
459
|
return this.exec((r) => r.tableCreate(dbOrName), 'createTable');
|
|
203
460
|
}
|
|
461
|
+
/** Drop a table. Pass a single `name`, or `(db, name)` for a specific database. */
|
|
462
|
+
async dropTable(dbOrName, name) {
|
|
463
|
+
if (name !== undefined) {
|
|
464
|
+
return this.exec((r) => r.db(dbOrName).tableDrop(name), 'dropTable');
|
|
465
|
+
}
|
|
466
|
+
return this.exec((r) => r.tableDrop(dbOrName), 'dropTable');
|
|
467
|
+
}
|
|
468
|
+
/** List tables in the default (or given) database. */
|
|
469
|
+
async listTables(db) {
|
|
470
|
+
return this.exec((r) => (db ? r.db(db).tableList() : r.tableList()), 'listTables');
|
|
471
|
+
}
|
|
204
472
|
/** Create a database. */
|
|
205
473
|
async createDatabase(name) {
|
|
206
474
|
return this.exec((r) => r.dbCreate(name), 'createDatabase');
|
|
207
475
|
}
|
|
476
|
+
/** Drop a database. */
|
|
477
|
+
async dropDatabase(name) {
|
|
478
|
+
return this.exec((r) => r.dbDrop(name), 'dropDatabase');
|
|
479
|
+
}
|
|
480
|
+
/** List all databases. */
|
|
481
|
+
async listDatabases() {
|
|
482
|
+
return this.exec((r) => r.dbList(), 'listDatabases');
|
|
483
|
+
}
|
|
484
|
+
// ---------------------------------------------------------------------
|
|
485
|
+
// Transactions (unsupported)
|
|
486
|
+
// ---------------------------------------------------------------------
|
|
487
|
+
/**
|
|
488
|
+
* RethinkDB has no multi-document transactions. Single-document writes are
|
|
489
|
+
* atomic, and {@link updateWhere}/{@link deleteWhere} apply atomically per
|
|
490
|
+
* document, but there is no way to commit changes across documents/tables
|
|
491
|
+
* as a unit. This throws a clear, typed capability error rather than
|
|
492
|
+
* silently pretending to provide isolation.
|
|
493
|
+
*/
|
|
494
|
+
async withTransaction(_fn) {
|
|
495
|
+
throw new errors_1.DatabaseError('RethinkDB does not support multi-document transactions. Single-document writes are atomic; ' +
|
|
496
|
+
'for cross-document atomicity model the data in one document or use conditional (compare-and-set) updates.', { code: errors_1.ErrorCodes.QUERY_ERROR });
|
|
497
|
+
}
|
|
208
498
|
// ---------------------------------------------------------------------
|
|
209
499
|
// Escape hatch
|
|
210
500
|
// ---------------------------------------------------------------------
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** A single field comparison, e.g. `age >= 18`. */
|
|
2
|
+
export interface CmpNode {
|
|
3
|
+
kind: 'cmp';
|
|
4
|
+
field: string;
|
|
5
|
+
op: symbol;
|
|
6
|
+
value: unknown;
|
|
7
|
+
}
|
|
8
|
+
/** A normalized boolean tree produced by {@link parseWhere}. */
|
|
9
|
+
export type WhereNode = CmpNode | {
|
|
10
|
+
kind: 'and';
|
|
11
|
+
nodes: WhereNode[];
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'or';
|
|
14
|
+
nodes: WhereNode[];
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'not';
|
|
17
|
+
node: WhereNode;
|
|
18
|
+
} | {
|
|
19
|
+
kind: 'true';
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Parse an ORM `where` object into a {@link WhereNode} tree.
|
|
23
|
+
*
|
|
24
|
+
* - String keys are field conditions: a scalar means equality, an array means
|
|
25
|
+
* `Op.in`, and a nested `{ [Op.*]: value }` object expands to one comparison
|
|
26
|
+
* per operator.
|
|
27
|
+
* - `Op.and`/`Op.or` take an array of sub-`where` objects; `Op.not` negates a
|
|
28
|
+
* single sub-`where`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseWhere(where: Record<string | symbol, unknown> | undefined | null): WhereNode;
|
|
31
|
+
/** Escape a string for safe inclusion in a regular expression. */
|
|
32
|
+
export declare function escapeRegex(s: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Translate a SQL `LIKE`/`ILIKE` pattern into an anchored regular expression
|
|
35
|
+
* (`%` → `.*`, `_` → `.`), so stores that only speak regex can honor ORM
|
|
36
|
+
* `Op.like` queries without the caller hand-writing a pattern.
|
|
37
|
+
*/
|
|
38
|
+
export declare function likeToRegex(pattern: string, caseInsensitive?: boolean): string;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseWhere = parseWhere;
|
|
4
|
+
exports.escapeRegex = escapeRegex;
|
|
5
|
+
exports.likeToRegex = likeToRegex;
|
|
6
|
+
/**
|
|
7
|
+
* ORM where-clause parser for the RethinkDB store.
|
|
8
|
+
*
|
|
9
|
+
* Turns the ORM's `where` shape (plain-object field conditions, `Op.*`
|
|
10
|
+
* comparison symbols, and `Op.and`/`Op.or`/`Op.not` logical symbols) into a
|
|
11
|
+
* small, store-agnostic {@link WhereNode} tree that the store then renders to
|
|
12
|
+
* a ReQL `filter` predicate. This is what lets callers write standard ORM
|
|
13
|
+
* queries (`{ age: { [Op.gte]: 18 } }`) instead of hand-building ReQL row
|
|
14
|
+
* predicates.
|
|
15
|
+
*/
|
|
16
|
+
const operators_1 = require("../../operators");
|
|
17
|
+
/** Whether `v` is a plain object carrying `Op.*` comparison symbols (e.g. `{ [Op.gt]: 5 }`). */
|
|
18
|
+
function hasOpSymbols(v) {
|
|
19
|
+
return (v !== null &&
|
|
20
|
+
typeof v === 'object' &&
|
|
21
|
+
!Array.isArray(v) &&
|
|
22
|
+
Object.getOwnPropertySymbols(v).length > 0);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse an ORM `where` object into a {@link WhereNode} tree.
|
|
26
|
+
*
|
|
27
|
+
* - String keys are field conditions: a scalar means equality, an array means
|
|
28
|
+
* `Op.in`, and a nested `{ [Op.*]: value }` object expands to one comparison
|
|
29
|
+
* per operator.
|
|
30
|
+
* - `Op.and`/`Op.or` take an array of sub-`where` objects; `Op.not` negates a
|
|
31
|
+
* single sub-`where`.
|
|
32
|
+
*/
|
|
33
|
+
function parseWhere(where) {
|
|
34
|
+
if (!where)
|
|
35
|
+
return { kind: 'true' };
|
|
36
|
+
const nodes = [];
|
|
37
|
+
for (const sym of Object.getOwnPropertySymbols(where)) {
|
|
38
|
+
const val = where[sym];
|
|
39
|
+
if (sym === operators_1.Op.and) {
|
|
40
|
+
nodes.push({ kind: 'and', nodes: asArray(val).map(parseWhere) });
|
|
41
|
+
}
|
|
42
|
+
else if (sym === operators_1.Op.or) {
|
|
43
|
+
nodes.push({ kind: 'or', nodes: asArray(val).map(parseWhere) });
|
|
44
|
+
}
|
|
45
|
+
else if (sym === operators_1.Op.not) {
|
|
46
|
+
nodes.push({ kind: 'not', node: parseWhere(val) });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const field of Object.keys(where)) {
|
|
50
|
+
const val = where[field];
|
|
51
|
+
if (hasOpSymbols(val)) {
|
|
52
|
+
for (const opSym of Object.getOwnPropertySymbols(val)) {
|
|
53
|
+
nodes.push({ kind: 'cmp', field, op: opSym, value: val[opSym] });
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (Array.isArray(val)) {
|
|
58
|
+
nodes.push({ kind: 'cmp', field, op: operators_1.Op.in, value: val });
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
nodes.push({ kind: 'cmp', field, op: operators_1.Op.eq, value: val });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (nodes.length === 0)
|
|
65
|
+
return { kind: 'true' };
|
|
66
|
+
if (nodes.length === 1)
|
|
67
|
+
return nodes[0];
|
|
68
|
+
return { kind: 'and', nodes };
|
|
69
|
+
}
|
|
70
|
+
function asArray(v) {
|
|
71
|
+
return (Array.isArray(v) ? v : [v]);
|
|
72
|
+
}
|
|
73
|
+
/** Escape a string for safe inclusion in a regular expression. */
|
|
74
|
+
function escapeRegex(s) {
|
|
75
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Translate a SQL `LIKE`/`ILIKE` pattern into an anchored regular expression
|
|
79
|
+
* (`%` → `.*`, `_` → `.`), so stores that only speak regex can honor ORM
|
|
80
|
+
* `Op.like` queries without the caller hand-writing a pattern.
|
|
81
|
+
*/
|
|
82
|
+
function likeToRegex(pattern, caseInsensitive = false) {
|
|
83
|
+
let out = '';
|
|
84
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
85
|
+
const ch = pattern[i];
|
|
86
|
+
if (ch === '%')
|
|
87
|
+
out += '.*';
|
|
88
|
+
else if (ch === '_')
|
|
89
|
+
out += '.';
|
|
90
|
+
else
|
|
91
|
+
out += escapeRegex(ch);
|
|
92
|
+
}
|
|
93
|
+
return `${caseInsensitive ? '(?i)' : ''}^${out}$`;
|
|
94
|
+
}
|