ts-prorm-orm 1.1.0 → 1.2.1
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 +95 -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 +713 -0
- package/dist/index.js +36 -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
package/dist/nosql/qldb/index.js
CHANGED
|
@@ -27,7 +27,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
27
27
|
exports.QldbStore = void 0;
|
|
28
28
|
const errors_1 = require("../../errors");
|
|
29
29
|
/** A validated PartiQL identifier - QLDB cannot parameterize table names. */
|
|
30
|
-
const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
30
|
+
const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_.]*$/;
|
|
31
31
|
function assertIdentifier(name) {
|
|
32
32
|
if (!IDENTIFIER.test(name)) {
|
|
33
33
|
throw new errors_1.DatabaseError(`Invalid QLDB table name: ${JSON.stringify(name)}`, {
|
|
@@ -36,6 +36,171 @@ function assertIdentifier(name) {
|
|
|
36
36
|
}
|
|
37
37
|
return name;
|
|
38
38
|
}
|
|
39
|
+
/** Parse an ORM `where` object (string + `Op` symbol keys) into a tree. */
|
|
40
|
+
function parseWhere(where) {
|
|
41
|
+
if (!where || typeof where !== 'object')
|
|
42
|
+
return null;
|
|
43
|
+
const nodes = [];
|
|
44
|
+
for (const sym of Object.getOwnPropertySymbols(where)) {
|
|
45
|
+
const name = sym.description;
|
|
46
|
+
const val = where[sym];
|
|
47
|
+
if (name === 'and' && Array.isArray(val)) {
|
|
48
|
+
nodes.push({ kind: 'and', nodes: val.map(parseWhere).filter(Boolean) });
|
|
49
|
+
}
|
|
50
|
+
else if (name === 'or' && Array.isArray(val)) {
|
|
51
|
+
nodes.push({ kind: 'or', nodes: val.map(parseWhere).filter(Boolean) });
|
|
52
|
+
}
|
|
53
|
+
else if (name === 'not') {
|
|
54
|
+
const inner = parseWhere(val);
|
|
55
|
+
if (inner)
|
|
56
|
+
nodes.push({ kind: 'not', node: inner });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const field of Object.keys(where)) {
|
|
60
|
+
nodes.push(parseFieldCondition(field, where[field]));
|
|
61
|
+
}
|
|
62
|
+
const flat = nodes.filter(Boolean);
|
|
63
|
+
if (flat.length === 0)
|
|
64
|
+
return null;
|
|
65
|
+
return flat.length === 1 ? flat[0] : { kind: 'and', nodes: flat };
|
|
66
|
+
}
|
|
67
|
+
/** Parse the value for a single field into a comparison (or AND of them). */
|
|
68
|
+
function parseFieldCondition(field, value) {
|
|
69
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
70
|
+
const symbols = Object.getOwnPropertySymbols(value);
|
|
71
|
+
if (symbols.length > 0) {
|
|
72
|
+
const cmps = symbols.map((sym) => ({
|
|
73
|
+
kind: 'cmp',
|
|
74
|
+
field,
|
|
75
|
+
op: sym.description ?? 'eq',
|
|
76
|
+
value: value[sym],
|
|
77
|
+
}));
|
|
78
|
+
return cmps.length === 1 ? cmps[0] : { kind: 'and', nodes: cmps };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return { kind: 'cmp', field, op: value === null ? 'isNull' : 'eq', value };
|
|
82
|
+
}
|
|
83
|
+
/** Render a normalized tree to a parameterized PartiQL predicate. */
|
|
84
|
+
function compilePartiqlWhere(node) {
|
|
85
|
+
if (!node)
|
|
86
|
+
return { sql: '', params: [] };
|
|
87
|
+
const params = [];
|
|
88
|
+
const render = (n) => {
|
|
89
|
+
switch (n.kind) {
|
|
90
|
+
case 'and':
|
|
91
|
+
return n.nodes.length ? `(${n.nodes.map(render).join(' AND ')})` : 'true';
|
|
92
|
+
case 'or':
|
|
93
|
+
return n.nodes.length ? `(${n.nodes.map(render).join(' OR ')})` : 'false';
|
|
94
|
+
case 'not':
|
|
95
|
+
return `NOT (${render(n.node)})`;
|
|
96
|
+
case 'cmp':
|
|
97
|
+
return renderCmp(n.field, n.op, n.value, params);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
return { sql: render(node), params };
|
|
101
|
+
}
|
|
102
|
+
function renderCmp(field, op, value, params) {
|
|
103
|
+
const col = assertIdentifier(field);
|
|
104
|
+
const p = (v) => {
|
|
105
|
+
params.push(v);
|
|
106
|
+
return '?';
|
|
107
|
+
};
|
|
108
|
+
switch (op) {
|
|
109
|
+
case 'eq':
|
|
110
|
+
return value === null ? `${col} IS NULL` : `${col} = ${p(value)}`;
|
|
111
|
+
case 'ne':
|
|
112
|
+
return value === null ? `${col} IS NOT NULL` : `${col} <> ${p(value)}`;
|
|
113
|
+
case 'gt':
|
|
114
|
+
return `${col} > ${p(value)}`;
|
|
115
|
+
case 'gte':
|
|
116
|
+
return `${col} >= ${p(value)}`;
|
|
117
|
+
case 'lt':
|
|
118
|
+
return `${col} < ${p(value)}`;
|
|
119
|
+
case 'lte':
|
|
120
|
+
return `${col} <= ${p(value)}`;
|
|
121
|
+
case 'in': {
|
|
122
|
+
const arr = value ?? [];
|
|
123
|
+
if (arr.length === 0)
|
|
124
|
+
return 'false';
|
|
125
|
+
return `${col} IN (${arr.map(p).join(', ')})`;
|
|
126
|
+
}
|
|
127
|
+
case 'notIn': {
|
|
128
|
+
const arr = value ?? [];
|
|
129
|
+
if (arr.length === 0)
|
|
130
|
+
return 'true';
|
|
131
|
+
return `${col} NOT IN (${arr.map(p).join(', ')})`;
|
|
132
|
+
}
|
|
133
|
+
case 'between': {
|
|
134
|
+
const [a, b] = value;
|
|
135
|
+
return `${col} BETWEEN ${p(a)} AND ${p(b)}`;
|
|
136
|
+
}
|
|
137
|
+
case 'notBetween': {
|
|
138
|
+
const [a, b] = value;
|
|
139
|
+
return `${col} NOT BETWEEN ${p(a)} AND ${p(b)}`;
|
|
140
|
+
}
|
|
141
|
+
case 'like':
|
|
142
|
+
return `${col} LIKE ${p(value)}`;
|
|
143
|
+
case 'notLike':
|
|
144
|
+
return `${col} NOT LIKE ${p(value)}`;
|
|
145
|
+
case 'startsWith':
|
|
146
|
+
return `${col} LIKE ${p(`${String(value)}%`)}`;
|
|
147
|
+
case 'endsWith':
|
|
148
|
+
return `${col} LIKE ${p(`%${String(value)}`)}`;
|
|
149
|
+
case 'substring':
|
|
150
|
+
return `${col} LIKE ${p(`%${String(value)}%`)}`;
|
|
151
|
+
case 'isNull':
|
|
152
|
+
return `${col} IS NULL`;
|
|
153
|
+
case 'isNotNull':
|
|
154
|
+
return `${col} IS NOT NULL`;
|
|
155
|
+
default:
|
|
156
|
+
throw new errors_1.DatabaseError(`QLDB ORM layer does not support operator "${op}" for field "${field}"`, { code: 'QUERY_ERROR' });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Pull the plain-equality (`field: value`) pairs out of a `where` clause so
|
|
161
|
+
* an upsert's INSERT branch can seed the new document with the keys it was
|
|
162
|
+
* matched on. Operator-keyed and logical (`Op.and`/`Op.or`) conditions are
|
|
163
|
+
* skipped since they don't correspond to a single concrete value.
|
|
164
|
+
*/
|
|
165
|
+
function extractEqualityKeys(where) {
|
|
166
|
+
const out = {};
|
|
167
|
+
for (const field of Object.keys(where)) {
|
|
168
|
+
const val = where[field];
|
|
169
|
+
if (val === null || typeof val !== 'object' || Array.isArray(val)) {
|
|
170
|
+
out[field] = val;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
/** Apply ORM order/limit/offset to an already-fetched row list, client-side. */
|
|
176
|
+
function applyClientSideShape(rows, options) {
|
|
177
|
+
let out = rows;
|
|
178
|
+
if (options.order && options.order.length > 0) {
|
|
179
|
+
const order = options.order;
|
|
180
|
+
out = [...out].sort((a, b) => {
|
|
181
|
+
for (const [field, dir] of order) {
|
|
182
|
+
const av = a?.[field];
|
|
183
|
+
const bv = b?.[field];
|
|
184
|
+
if (av === bv)
|
|
185
|
+
continue;
|
|
186
|
+
const cmp = av === undefined || av === null
|
|
187
|
+
? -1
|
|
188
|
+
: bv === undefined || bv === null
|
|
189
|
+
? 1
|
|
190
|
+
: av < bv
|
|
191
|
+
? -1
|
|
192
|
+
: 1;
|
|
193
|
+
return dir.toUpperCase() === 'DESC' ? -cmp : cmp;
|
|
194
|
+
}
|
|
195
|
+
return 0;
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (typeof options.offset === 'number')
|
|
199
|
+
out = out.slice(options.offset);
|
|
200
|
+
if (typeof options.limit === 'number')
|
|
201
|
+
out = out.slice(0, options.limit);
|
|
202
|
+
return out;
|
|
203
|
+
}
|
|
39
204
|
/**
|
|
40
205
|
* `QldbStore` wraps an `amazon-qldb-driver-nodejs` driver behind the shared
|
|
41
206
|
* ledger surface. `append` inserts a new document (returning its QLDB
|
|
@@ -171,6 +336,142 @@ class QldbStore {
|
|
|
171
336
|
async query(statement, params = []) {
|
|
172
337
|
return this.execute(statement, params, 'query');
|
|
173
338
|
}
|
|
339
|
+
// ---------------------------------------------------------------------
|
|
340
|
+
// ORM model surface (no hand-written PartiQL needed)
|
|
341
|
+
// ---------------------------------------------------------------------
|
|
342
|
+
/**
|
|
343
|
+
* Fetch every document in `table` matching the ORM `where` clause. The
|
|
344
|
+
* `where` clause is compiled to a parameterized PartiQL `WHERE`; `order`,
|
|
345
|
+
* `limit` and `offset` are applied client-side because QLDB's PartiQL
|
|
346
|
+
* dialect supports none of them.
|
|
347
|
+
*/
|
|
348
|
+
async findAll(table, options = {}) {
|
|
349
|
+
const tbl = assertIdentifier(table);
|
|
350
|
+
const { sql, params } = compilePartiqlWhere(parseWhere(options.where));
|
|
351
|
+
const projection = options.attributes && options.attributes.length > 0
|
|
352
|
+
? options.attributes.map(assertIdentifier).join(', ')
|
|
353
|
+
: '*';
|
|
354
|
+
const statement = `SELECT ${projection} FROM ${tbl}${sql ? ` WHERE ${sql}` : ''}`;
|
|
355
|
+
const rows = (await this.execute(statement, params, 'findAll'));
|
|
356
|
+
return applyClientSideShape(rows, options);
|
|
357
|
+
}
|
|
358
|
+
/** Fetch the first document matching `where` (client-side `limit 1`), or `null`. */
|
|
359
|
+
async findOne(table, options = {}) {
|
|
360
|
+
const rows = await this.findAll(table, { ...options, limit: 1 });
|
|
361
|
+
return rows[0] ?? null;
|
|
362
|
+
}
|
|
363
|
+
/** Count documents in `table` matching `where`. */
|
|
364
|
+
async count(table, where) {
|
|
365
|
+
const rows = await this.findAll(table, { where });
|
|
366
|
+
return rows.length;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Insert `data` as a new document, returning its QLDB document id. Alias
|
|
370
|
+
* of {@link append} using ORM naming.
|
|
371
|
+
*/
|
|
372
|
+
async create(table, data) {
|
|
373
|
+
return this.append(table, data);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Insert many documents in a single managed transaction, returning the new
|
|
377
|
+
* document ids in order.
|
|
378
|
+
*/
|
|
379
|
+
async bulkCreate(table, rows) {
|
|
380
|
+
if (rows.length === 0)
|
|
381
|
+
return [];
|
|
382
|
+
const tbl = assertIdentifier(table);
|
|
383
|
+
return this.transaction(async (txn) => {
|
|
384
|
+
const ids = [];
|
|
385
|
+
for (const row of rows) {
|
|
386
|
+
const result = await txn.execute(`INSERT INTO ${tbl} ?`, row);
|
|
387
|
+
const first = result.getResultList()[0];
|
|
388
|
+
ids.push(first?.documentId ?? '');
|
|
389
|
+
}
|
|
390
|
+
return ids;
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Update every document matching `where`, SETting each key in `values`.
|
|
395
|
+
* Returns the number of documents QLDB reported as modified.
|
|
396
|
+
*/
|
|
397
|
+
async update(table, values, where) {
|
|
398
|
+
const tbl = assertIdentifier(table);
|
|
399
|
+
const entries = Object.entries(values);
|
|
400
|
+
if (entries.length === 0) {
|
|
401
|
+
throw new errors_1.DatabaseError('QLDB update() requires at least one value to set', {
|
|
402
|
+
code: 'VALIDATION_ERROR',
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
const setParams = [];
|
|
406
|
+
const setSql = entries
|
|
407
|
+
.map(([col, val]) => {
|
|
408
|
+
setParams.push(val);
|
|
409
|
+
return `${assertIdentifier(col)} = ?`;
|
|
410
|
+
})
|
|
411
|
+
.join(', ');
|
|
412
|
+
const { sql, params } = compilePartiqlWhere(parseWhere(where));
|
|
413
|
+
const statement = `UPDATE ${tbl} SET ${setSql}${sql ? ` WHERE ${sql}` : ''}`;
|
|
414
|
+
const rows = await this.execute(statement, [...setParams, ...params], 'update');
|
|
415
|
+
return rows.length;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Delete every document matching `where`. Returns the number of documents
|
|
419
|
+
* QLDB reported as deleted. QLDB retains all prior revisions in the
|
|
420
|
+
* journal, so a delete is itself a new (tombstone) revision - use
|
|
421
|
+
* {@link history} to recover deleted data.
|
|
422
|
+
*/
|
|
423
|
+
async destroy(table, where) {
|
|
424
|
+
const tbl = assertIdentifier(table);
|
|
425
|
+
const { sql, params } = compilePartiqlWhere(parseWhere(where));
|
|
426
|
+
const statement = `DELETE FROM ${tbl}${sql ? ` WHERE ${sql}` : ''}`;
|
|
427
|
+
const rows = await this.execute(statement, params, 'destroy');
|
|
428
|
+
return rows.length;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Insert-or-update: within a single transaction, look for a document
|
|
432
|
+
* matching `where`; if one exists, SET `data` onto the matches, otherwise
|
|
433
|
+
* INSERT `data` (merged with the `where` equality keys). Returns
|
|
434
|
+
* `{ created }` indicating which branch ran.
|
|
435
|
+
*/
|
|
436
|
+
async upsert(table, data, where) {
|
|
437
|
+
const tbl = assertIdentifier(table);
|
|
438
|
+
const { sql, params } = compilePartiqlWhere(parseWhere(where));
|
|
439
|
+
return this.transaction(async (txn) => {
|
|
440
|
+
const existing = sql
|
|
441
|
+
? (await txn.execute(`SELECT * FROM ${tbl} WHERE ${sql}`, ...params)).getResultList()
|
|
442
|
+
: [];
|
|
443
|
+
if (existing.length > 0) {
|
|
444
|
+
const entries = Object.entries(data);
|
|
445
|
+
const setParams = [];
|
|
446
|
+
const setSql = entries
|
|
447
|
+
.map(([col, val]) => {
|
|
448
|
+
setParams.push(val);
|
|
449
|
+
return `${assertIdentifier(col)} = ?`;
|
|
450
|
+
})
|
|
451
|
+
.join(', ');
|
|
452
|
+
await txn.execute(`UPDATE ${tbl} SET ${setSql} WHERE ${sql}`, ...setParams, ...params);
|
|
453
|
+
return { created: false };
|
|
454
|
+
}
|
|
455
|
+
const insertDoc = { ...extractEqualityKeys(where), ...data };
|
|
456
|
+
await txn.execute(`INSERT INTO ${tbl} ?`, insertDoc);
|
|
457
|
+
return { created: true };
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Run `fn` inside a single managed QLDB transaction (auto-retried on
|
|
462
|
+
* optimistic-concurrency conflicts). The callback receives the raw
|
|
463
|
+
* transaction executor so it can compose several statements atomically.
|
|
464
|
+
*/
|
|
465
|
+
async transaction(fn) {
|
|
466
|
+
const driver = this.requireDriver();
|
|
467
|
+
try {
|
|
468
|
+
return await driver.executeLambda(fn);
|
|
469
|
+
}
|
|
470
|
+
catch (err) {
|
|
471
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
472
|
+
throw errors_1.DatabaseError.from(parent, { message: `QLDB transaction failed: ${parent.message}` });
|
|
473
|
+
}
|
|
474
|
+
}
|
|
174
475
|
/** List the active table names in the ledger (thin passthrough). */
|
|
175
476
|
async tableNames() {
|
|
176
477
|
const driver = this.requireDriver();
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import type { NoSqlStore } from '../store';
|
|
2
|
+
/**
|
|
3
|
+
* A loosely-typed handle to an AWS v3 `S3Client` (or any object exposing a
|
|
4
|
+
* compatible `send(command)` method). Kept as an interface rather than the
|
|
5
|
+
* real SDK type because `@aws-sdk/client-s3` is loaded lazily and may not be
|
|
6
|
+
* installed at type-check time; tests inject a mock matching this shape.
|
|
7
|
+
*/
|
|
8
|
+
export interface R2ClientLike {
|
|
9
|
+
send(command: unknown): Promise<any>;
|
|
10
|
+
destroy?(): void;
|
|
11
|
+
}
|
|
12
|
+
/** Connection options for `R2Store`. */
|
|
13
|
+
export interface R2StoreOptions {
|
|
14
|
+
/**
|
|
15
|
+
* The account-specific R2 S3 endpoint, e.g.
|
|
16
|
+
* `https://<account_id>.r2.cloudflarestorage.com`. Required unless a
|
|
17
|
+
* pre-built `client` is supplied.
|
|
18
|
+
*/
|
|
19
|
+
endpoint?: string;
|
|
20
|
+
/**
|
|
21
|
+
* R2 access-key credentials (created in the Cloudflare dashboard as an "R2
|
|
22
|
+
* API Token"). Omit only when supplying a pre-built `client`.
|
|
23
|
+
*/
|
|
24
|
+
credentials?: {
|
|
25
|
+
accessKeyId: string;
|
|
26
|
+
secretAccessKey: string;
|
|
27
|
+
sessionToken?: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Region to advertise to the SDK. R2 has no regions and expects the
|
|
31
|
+
* sentinel value `'auto'`; this defaults to `'auto'` and rarely needs
|
|
32
|
+
* changing.
|
|
33
|
+
*/
|
|
34
|
+
region?: string;
|
|
35
|
+
/**
|
|
36
|
+
* A pre-built `S3Client` (or compatible object). When provided,
|
|
37
|
+
* `connect()` uses it directly and does NOT require the SDK — this is how
|
|
38
|
+
* tests inject a mock client, and how callers can supply a custom-configured
|
|
39
|
+
* client. When omitted, `connect()` builds a real `S3Client` pointed at R2
|
|
40
|
+
* from the options above.
|
|
41
|
+
*/
|
|
42
|
+
client?: R2ClientLike;
|
|
43
|
+
}
|
|
44
|
+
/** Options for `putObject()`. */
|
|
45
|
+
export interface PutObjectOptions {
|
|
46
|
+
/** MIME type of the body, e.g. 'application/json'. */
|
|
47
|
+
contentType?: string;
|
|
48
|
+
/** Arbitrary user metadata (stored as `x-amz-meta-*` headers). */
|
|
49
|
+
metadata?: Record<string, string>;
|
|
50
|
+
/** Cache-Control header value to store with the object. */
|
|
51
|
+
cacheControl?: string;
|
|
52
|
+
/** Content-Encoding header value to store with the object. */
|
|
53
|
+
contentEncoding?: string;
|
|
54
|
+
}
|
|
55
|
+
/** Result of `putObject()`. */
|
|
56
|
+
export interface PutObjectResult {
|
|
57
|
+
/** Entity tag of the newly stored object. */
|
|
58
|
+
etag?: string;
|
|
59
|
+
/** Version ID, when the bucket has versioning enabled. */
|
|
60
|
+
versionId?: string;
|
|
61
|
+
}
|
|
62
|
+
/** Result of `getObject()`. */
|
|
63
|
+
export interface GetObjectResult {
|
|
64
|
+
/** The object's body stream/blob, exactly as the SDK returns it. */
|
|
65
|
+
body: unknown;
|
|
66
|
+
contentType?: string;
|
|
67
|
+
contentLength?: number;
|
|
68
|
+
etag?: string;
|
|
69
|
+
lastModified?: Date;
|
|
70
|
+
metadata?: Record<string, string>;
|
|
71
|
+
}
|
|
72
|
+
/** Result of `headObject()` — object metadata without the body. */
|
|
73
|
+
export interface HeadObjectResult {
|
|
74
|
+
contentType?: string;
|
|
75
|
+
contentLength?: number;
|
|
76
|
+
etag?: string;
|
|
77
|
+
lastModified?: Date;
|
|
78
|
+
metadata?: Record<string, string>;
|
|
79
|
+
}
|
|
80
|
+
/** A single object entry in a `listObjects()` result. */
|
|
81
|
+
export interface R2ObjectSummary {
|
|
82
|
+
key?: string;
|
|
83
|
+
size?: number;
|
|
84
|
+
etag?: string;
|
|
85
|
+
lastModified?: Date;
|
|
86
|
+
}
|
|
87
|
+
/** Result of `listObjects()`. */
|
|
88
|
+
export interface ListObjectsResult {
|
|
89
|
+
objects: R2ObjectSummary[];
|
|
90
|
+
/** True when the listing was truncated (more objects exist than were returned). */
|
|
91
|
+
isTruncated: boolean;
|
|
92
|
+
/** Continuation token to fetch the next page, present when `isTruncated`. */
|
|
93
|
+
nextContinuationToken?: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Cloudflare R2 store, implementing the minimal `NoSqlStore` marker interface.
|
|
97
|
+
* Unlike the SQL dialects there is no `query(sql)` — R2's operations are
|
|
98
|
+
* object-shaped (Put/Get/Delete/List/Head) and that shape is preserved here
|
|
99
|
+
* rather than forced into a SQL string.
|
|
100
|
+
*/
|
|
101
|
+
export declare class R2Store implements NoSqlStore {
|
|
102
|
+
readonly name = "r2";
|
|
103
|
+
readonly library = "@aws-sdk/client-s3";
|
|
104
|
+
private readonly options;
|
|
105
|
+
private client;
|
|
106
|
+
private aws;
|
|
107
|
+
private connected;
|
|
108
|
+
constructor(options?: R2StoreOptions);
|
|
109
|
+
connect(): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Attempt to lazy-load `@aws-sdk/client-s3` for its command constructors.
|
|
112
|
+
* Best-effort: when a client was injected (e.g. a test mock) the SDK may
|
|
113
|
+
* not be installed, so a failure here is swallowed and the command classes
|
|
114
|
+
* are loaded on demand instead (see `command()`).
|
|
115
|
+
*/
|
|
116
|
+
private tryLoadSdk;
|
|
117
|
+
disconnect(): Promise<void>;
|
|
118
|
+
isConnected(): boolean;
|
|
119
|
+
/** Returns the underlying `S3Client` (loosely typed) for anything not wrapped here. */
|
|
120
|
+
getClient(): R2ClientLike;
|
|
121
|
+
private requireClient;
|
|
122
|
+
/**
|
|
123
|
+
* Resolve an S3 command constructor by name from the (lazily loaded) SDK,
|
|
124
|
+
* so that with an injected mock client we only load `@aws-sdk/client-s3`
|
|
125
|
+
* the first time a command is actually built. Throws a `ConnectionError`
|
|
126
|
+
* if the SDK genuinely can't be resolved.
|
|
127
|
+
*/
|
|
128
|
+
private command;
|
|
129
|
+
/** Wraps an AWS SDK failure in a `DatabaseError`, preserving the original error. */
|
|
130
|
+
private wrapError;
|
|
131
|
+
/** `PutObject` — store an object's body (and optional metadata) under `bucket`/`key`. */
|
|
132
|
+
putObject(bucket: string, key: string, body: unknown, options?: PutObjectOptions): Promise<PutObjectResult>;
|
|
133
|
+
/** `GetObject` — fetch an object's body and metadata. */
|
|
134
|
+
getObject(bucket: string, key: string): Promise<GetObjectResult>;
|
|
135
|
+
/** `DeleteObject` — remove an object. Succeeds even if the key doesn't exist. */
|
|
136
|
+
deleteObject(bucket: string, key: string): Promise<void>;
|
|
137
|
+
/**
|
|
138
|
+
* `ListObjectsV2` — list objects in `bucket`, optionally restricted to
|
|
139
|
+
* those whose key starts with `prefix`. A single call returns at most
|
|
140
|
+
* 1000 objects; use `result.nextContinuationToken` (via the raw client)
|
|
141
|
+
* to page beyond that.
|
|
142
|
+
*/
|
|
143
|
+
listObjects(bucket: string, prefix?: string): Promise<ListObjectsResult>;
|
|
144
|
+
/** `HeadObject` — fetch an object's metadata without its body. Throws (NotFound) if the object doesn't exist. */
|
|
145
|
+
headObject(bucket: string, key: string): Promise<HeadObjectResult>;
|
|
146
|
+
/**
|
|
147
|
+
* Whether an object exists, implemented via `HeadObject`. Returns `false`
|
|
148
|
+
* when R2 reports the object is missing (a `NotFound` / 404 error) rather
|
|
149
|
+
* than throwing; any other error (e.g. access denied) is re-thrown.
|
|
150
|
+
*/
|
|
151
|
+
objectExists(bucket: string, key: string): Promise<boolean>;
|
|
152
|
+
/**
|
|
153
|
+
* Recognize "object does not exist" errors across the shapes the SDK (and
|
|
154
|
+
* its wrapped form here) can surface them: the raw error's `.name`
|
|
155
|
+
* (`NotFound`, `NoSuchKey`), its HTTP status (404), or the wrapped
|
|
156
|
+
* `DatabaseError`'s `.parent`.
|
|
157
|
+
*/
|
|
158
|
+
private isNotFound;
|
|
159
|
+
}
|
|
160
|
+
export default R2Store;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RabbitMQ (AMQP 0-9-1) store.
|
|
3
|
+
*
|
|
4
|
+
* RabbitMQ is a message broker, not a database: there is no query language,
|
|
5
|
+
* no relational schema, and no `query(sql)` shape. Producers publish
|
|
6
|
+
* messages to *exchanges*, which route them (by binding key/pattern) into
|
|
7
|
+
* *queues*, from which *consumers* read. Like the other stores in
|
|
8
|
+
* `src/nosql/`, this class therefore does not implement the SQL-shaped
|
|
9
|
+
* `Dialect` interface (`src/dialects/dialect.ts`). Instead it implements the
|
|
10
|
+
* minimal `NoSqlStore` marker interface (`src/nosql/store.ts`) and exposes
|
|
11
|
+
* RabbitMQ's real operations — assert/bind topology, publish, and consume —
|
|
12
|
+
* directly, mapped onto a single AMQP channel.
|
|
13
|
+
*
|
|
14
|
+
* Uses the official `amqplib` driver. `amqplib` is an optional peer of this
|
|
15
|
+
* ORM and is loaded lazily (via `require`) inside `connect()`, so importing
|
|
16
|
+
* this module does not require `amqplib` to be installed unless you actually
|
|
17
|
+
* connect. For tests (and for advanced setups that manage the AMQP
|
|
18
|
+
* connection themselves), a pre-built connection can be injected via
|
|
19
|
+
* `RabbitMQStoreOptions.connection`, in which case `connect()` uses it and
|
|
20
|
+
* skips the `require` entirely.
|
|
21
|
+
*
|
|
22
|
+
* ## Message serialization
|
|
23
|
+
*
|
|
24
|
+
* AMQP message bodies are raw bytes (`Buffer`). For convenience, both
|
|
25
|
+
* `sendToQueue()` and `publish()` accept any value: a `Buffer` (or
|
|
26
|
+
* `Uint8Array`) is sent as-is, a `string` is UTF-8 encoded, and anything
|
|
27
|
+
* else is serialized with `JSON.stringify` before being wrapped in a
|
|
28
|
+
* `Buffer`. Consumers receive the raw `amqplib` message object; decode
|
|
29
|
+
* `msg.content` (a `Buffer`) yourself (e.g. `JSON.parse(msg.content.toString())`).
|
|
30
|
+
*/
|
|
31
|
+
import type { NoSqlStore } from '../store';
|
|
32
|
+
/**
|
|
33
|
+
* Connection options for `RabbitMQStore`.
|
|
34
|
+
*
|
|
35
|
+
* `amqplib` ships no types the ORM depends on here, so its connection and
|
|
36
|
+
* channel are typed as `any` — the repo's tsconfig has `noImplicitAny:
|
|
37
|
+
* false`, the intended escape hatch for optional, untyped drivers.
|
|
38
|
+
*/
|
|
39
|
+
export interface RabbitMQStoreOptions {
|
|
40
|
+
/**
|
|
41
|
+
* AMQP connection URL, e.g. `'amqp://guest:guest@localhost:5672'` or
|
|
42
|
+
* `'amqps://host'`. Used by `connect()` when no `connection` is injected.
|
|
43
|
+
* Defaults to `'amqp://localhost'`.
|
|
44
|
+
*/
|
|
45
|
+
url?: string;
|
|
46
|
+
/**
|
|
47
|
+
* A pre-built `amqplib` connection (the object returned by
|
|
48
|
+
* `amqp.connect(...)`). When provided, `connect()` adopts it and does not
|
|
49
|
+
* `require('amqplib')` — useful for sharing one connection across stores,
|
|
50
|
+
* or for injecting a mock in tests.
|
|
51
|
+
*/
|
|
52
|
+
connection?: any;
|
|
53
|
+
}
|
|
54
|
+
/** A value acceptable as an AMQP message body: raw bytes, a string, or any JSON-serializable value. */
|
|
55
|
+
export type RabbitMQMessage = Buffer | Uint8Array | string | unknown;
|
|
56
|
+
/**
|
|
57
|
+
* `RabbitMQStore` wraps a single `amqplib` channel and exposes RabbitMQ's
|
|
58
|
+
* core AMQP operations: asserting queues/exchanges, binding them, publishing
|
|
59
|
+
* (to a queue directly or via an exchange), consuming with ack/nack, and
|
|
60
|
+
* consumer prefetch (QoS).
|
|
61
|
+
*/
|
|
62
|
+
export declare class RabbitMQStore implements NoSqlStore {
|
|
63
|
+
readonly name = "rabbitmq";
|
|
64
|
+
readonly library = "amqplib";
|
|
65
|
+
private readonly options;
|
|
66
|
+
private connection;
|
|
67
|
+
private channel;
|
|
68
|
+
private connected;
|
|
69
|
+
constructor(options?: RabbitMQStoreOptions);
|
|
70
|
+
connect(): Promise<void>;
|
|
71
|
+
disconnect(): Promise<void>;
|
|
72
|
+
isConnected(): boolean;
|
|
73
|
+
/** Returns the underlying `amqplib` channel for operations not wrapped here. */
|
|
74
|
+
getClient(): any;
|
|
75
|
+
/** Returns the underlying `amqplib` connection. */
|
|
76
|
+
getConnection(): any;
|
|
77
|
+
private requireChannel;
|
|
78
|
+
private exec;
|
|
79
|
+
/**
|
|
80
|
+
* Declare a queue, creating it if it doesn't exist (idempotent). Returns
|
|
81
|
+
* amqplib's assertion reply (`{ queue, messageCount, consumerCount }`).
|
|
82
|
+
* Pass `''` as `queue` to have the broker generate a unique name.
|
|
83
|
+
*/
|
|
84
|
+
assertQueue(queue: string, options?: any): Promise<any>;
|
|
85
|
+
/**
|
|
86
|
+
* Declare an exchange of the given `type` (`'direct'`, `'fanout'`,
|
|
87
|
+
* `'topic'`, `'headers'`), creating it if it doesn't exist (idempotent).
|
|
88
|
+
*/
|
|
89
|
+
assertExchange(exchange: string, type: string, options?: any): Promise<any>;
|
|
90
|
+
/**
|
|
91
|
+
* Bind `queue` to `exchange` so messages published to `exchange` matching
|
|
92
|
+
* `pattern` (the routing/binding key) are routed into `queue`.
|
|
93
|
+
*/
|
|
94
|
+
bindQueue(queue: string, exchange: string, pattern: string): Promise<any>;
|
|
95
|
+
/**
|
|
96
|
+
* Send a message straight to a named `queue` (via the default exchange).
|
|
97
|
+
* Non-`Buffer` messages are serialized — strings UTF-8 encoded, other
|
|
98
|
+
* values `JSON.stringify`'d (see the module docs). Returns amqplib's
|
|
99
|
+
* boolean write result (`false` when the channel's write buffer is full
|
|
100
|
+
* and you should wait for a `'drain'` event before writing more).
|
|
101
|
+
*/
|
|
102
|
+
sendToQueue(queue: string, message: RabbitMQMessage, options?: any): Promise<boolean>;
|
|
103
|
+
/**
|
|
104
|
+
* Publish a message to an `exchange` with a `routingKey`; the exchange
|
|
105
|
+
* routes it to bound queues. Non-`Buffer` messages are serialized like
|
|
106
|
+
* `sendToQueue()`. Returns amqplib's boolean write result.
|
|
107
|
+
*/
|
|
108
|
+
publish(exchange: string, routingKey: string, message: RabbitMQMessage, options?: any): Promise<boolean>;
|
|
109
|
+
/**
|
|
110
|
+
* Register `handler` to receive each message delivered from `queue`. The
|
|
111
|
+
* handler is called with the raw amqplib message object (or `null` if the
|
|
112
|
+
* consumer is cancelled by the broker); decode `msg.content` yourself.
|
|
113
|
+
* Unless `options.noAck` is set, call `ack(msg)`/`nack(msg)` when done.
|
|
114
|
+
* Returns amqplib's `{ consumerTag }` reply.
|
|
115
|
+
*/
|
|
116
|
+
consume(queue: string, handler: (msg: any) => void, options?: any): Promise<any>;
|
|
117
|
+
/** Acknowledge a delivered message so the broker can drop it. */
|
|
118
|
+
ack(message: any, allUpTo?: boolean): void;
|
|
119
|
+
/**
|
|
120
|
+
* Reject a delivered message. By default RabbitMQ requeues it (`requeue`
|
|
121
|
+
* defaults to `true` in amqplib); pass `requeue = false` to drop or
|
|
122
|
+
* dead-letter it.
|
|
123
|
+
*/
|
|
124
|
+
nack(message: any, allUpTo?: boolean, requeue?: boolean): void;
|
|
125
|
+
/**
|
|
126
|
+
* Set the consumer prefetch (QoS) — the max number of unacknowledged
|
|
127
|
+
* messages the broker will deliver to consumers on this channel at once.
|
|
128
|
+
*/
|
|
129
|
+
prefetch(count: number, global?: boolean): Promise<any>;
|
|
130
|
+
}
|
|
131
|
+
export default RabbitMQStore;
|