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
|
@@ -77,6 +77,167 @@ class DynamoDbError extends errors_1.DatabaseError {
|
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
exports.DynamoDbError = DynamoDbError;
|
|
80
|
+
/** Parse an ORM `where` object (string + `Op` symbol keys) into a tree. */
|
|
81
|
+
function parseWhere(where) {
|
|
82
|
+
if (!where || typeof where !== 'object')
|
|
83
|
+
return null;
|
|
84
|
+
const nodes = [];
|
|
85
|
+
for (const sym of Object.getOwnPropertySymbols(where)) {
|
|
86
|
+
const name = sym.description;
|
|
87
|
+
const val = where[sym];
|
|
88
|
+
if (name === 'and' && Array.isArray(val)) {
|
|
89
|
+
nodes.push({ kind: 'and', nodes: val.map(parseWhere).filter(Boolean) });
|
|
90
|
+
}
|
|
91
|
+
else if (name === 'or' && Array.isArray(val)) {
|
|
92
|
+
nodes.push({ kind: 'or', nodes: val.map(parseWhere).filter(Boolean) });
|
|
93
|
+
}
|
|
94
|
+
else if (name === 'not') {
|
|
95
|
+
const inner = parseWhere(val);
|
|
96
|
+
if (inner)
|
|
97
|
+
nodes.push({ kind: 'not', node: inner });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
for (const field of Object.keys(where)) {
|
|
101
|
+
nodes.push(parseFieldCondition(field, where[field]));
|
|
102
|
+
}
|
|
103
|
+
const flat = nodes.filter(Boolean);
|
|
104
|
+
if (flat.length === 0)
|
|
105
|
+
return null;
|
|
106
|
+
return flat.length === 1 ? flat[0] : { kind: 'and', nodes: flat };
|
|
107
|
+
}
|
|
108
|
+
/** Parse the value for a single field into a comparison (or AND of them). */
|
|
109
|
+
function parseFieldCondition(field, value) {
|
|
110
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
111
|
+
const symbols = Object.getOwnPropertySymbols(value);
|
|
112
|
+
if (symbols.length > 0) {
|
|
113
|
+
const cmps = symbols.map((sym) => ({
|
|
114
|
+
kind: 'cmp',
|
|
115
|
+
field,
|
|
116
|
+
op: sym.description ?? 'eq',
|
|
117
|
+
value: value[sym],
|
|
118
|
+
}));
|
|
119
|
+
return cmps.length === 1 ? cmps[0] : { kind: 'and', nodes: cmps };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { kind: 'cmp', field, op: value === null ? 'isNull' : 'eq', value };
|
|
123
|
+
}
|
|
124
|
+
/** Collect the top-level AND leaf comparisons of a tree (for key extraction). */
|
|
125
|
+
function topLevelLeaves(node) {
|
|
126
|
+
if (!node)
|
|
127
|
+
return [];
|
|
128
|
+
if (node.kind === 'cmp')
|
|
129
|
+
return [node];
|
|
130
|
+
if (node.kind === 'and')
|
|
131
|
+
return node.nodes.flatMap(topLevelLeaves);
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
/** Sort-key operators that DynamoDB permits in a KeyConditionExpression. */
|
|
135
|
+
const SORT_KEY_OPS = new Set(['eq', 'gt', 'gte', 'lt', 'lte', 'between', 'startsWith']);
|
|
136
|
+
/**
|
|
137
|
+
* Incrementally builds DynamoDB expression strings while allocating collision-
|
|
138
|
+
* free `#name`/`:value` placeholders (so reserved words and nested paths are
|
|
139
|
+
* always safe).
|
|
140
|
+
*/
|
|
141
|
+
class DynamoExprBuilder {
|
|
142
|
+
constructor() {
|
|
143
|
+
this.names = {};
|
|
144
|
+
this.values = {};
|
|
145
|
+
this.n = 0;
|
|
146
|
+
this.v = 0;
|
|
147
|
+
}
|
|
148
|
+
/** Allocate placeholders for a (possibly dotted) attribute path. */
|
|
149
|
+
path(field) {
|
|
150
|
+
return field
|
|
151
|
+
.split('.')
|
|
152
|
+
.map((part) => {
|
|
153
|
+
const key = `#n${this.n++}`;
|
|
154
|
+
this.names[key] = part;
|
|
155
|
+
return key;
|
|
156
|
+
})
|
|
157
|
+
.join('.');
|
|
158
|
+
}
|
|
159
|
+
/** Allocate a value placeholder. */
|
|
160
|
+
val(value) {
|
|
161
|
+
const key = `:v${this.v++}`;
|
|
162
|
+
this.values[key] = value;
|
|
163
|
+
return key;
|
|
164
|
+
}
|
|
165
|
+
/** Render a comparison to a FilterExpression/KeyConditionExpression fragment. */
|
|
166
|
+
cmp(field, op, value) {
|
|
167
|
+
const p = this.path(field);
|
|
168
|
+
switch (op) {
|
|
169
|
+
case 'eq':
|
|
170
|
+
return value === null ? `attribute_not_exists(${p})` : `${p} = ${this.val(value)}`;
|
|
171
|
+
case 'ne':
|
|
172
|
+
return `${p} <> ${this.val(value)}`;
|
|
173
|
+
case 'gt':
|
|
174
|
+
return `${p} > ${this.val(value)}`;
|
|
175
|
+
case 'gte':
|
|
176
|
+
return `${p} >= ${this.val(value)}`;
|
|
177
|
+
case 'lt':
|
|
178
|
+
return `${p} < ${this.val(value)}`;
|
|
179
|
+
case 'lte':
|
|
180
|
+
return `${p} <= ${this.val(value)}`;
|
|
181
|
+
case 'between': {
|
|
182
|
+
const [a, b] = value;
|
|
183
|
+
return `${p} BETWEEN ${this.val(a)} AND ${this.val(b)}`;
|
|
184
|
+
}
|
|
185
|
+
case 'notBetween': {
|
|
186
|
+
const [a, b] = value;
|
|
187
|
+
return `NOT (${p} BETWEEN ${this.val(a)} AND ${this.val(b)})`;
|
|
188
|
+
}
|
|
189
|
+
case 'in': {
|
|
190
|
+
const arr = value ?? [];
|
|
191
|
+
if (arr.length === 0)
|
|
192
|
+
return 'attribute_not_exists(nonexistent_placeholder_attr)';
|
|
193
|
+
return `${p} IN (${arr.map((x) => this.val(x)).join(', ')})`;
|
|
194
|
+
}
|
|
195
|
+
case 'notIn': {
|
|
196
|
+
const arr = value ?? [];
|
|
197
|
+
if (arr.length === 0)
|
|
198
|
+
return 'attribute_exists(' + p + ') OR attribute_not_exists(' + p + ')';
|
|
199
|
+
return `NOT (${p} IN (${arr.map((x) => this.val(x)).join(', ')}))`;
|
|
200
|
+
}
|
|
201
|
+
case 'startsWith':
|
|
202
|
+
return `begins_with(${p}, ${this.val(String(value))})`;
|
|
203
|
+
case 'substring':
|
|
204
|
+
return `contains(${p}, ${this.val(value)})`;
|
|
205
|
+
case 'notSubstring':
|
|
206
|
+
return `NOT contains(${p}, ${this.val(value)})`;
|
|
207
|
+
case 'contains':
|
|
208
|
+
case 'arrayContains':
|
|
209
|
+
return `contains(${p}, ${this.val(Array.isArray(value) ? value[0] : value)})`;
|
|
210
|
+
case 'like': {
|
|
211
|
+
// Only the simple begins_with / contains LIKE shapes are expressible.
|
|
212
|
+
const s = String(value);
|
|
213
|
+
if (/^[^%_]+%$/.test(s))
|
|
214
|
+
return `begins_with(${p}, ${this.val(s.slice(0, -1))})`;
|
|
215
|
+
if (/^%[^%_]+%$/.test(s))
|
|
216
|
+
return `contains(${p}, ${this.val(s.slice(1, -1))})`;
|
|
217
|
+
throw new errors_1.DatabaseError(`DynamoDB ORM layer can only translate LIKE patterns of the form 'x%' or '%x%' (got ${JSON.stringify(s)})`, { code: 'QUERY_ERROR' });
|
|
218
|
+
}
|
|
219
|
+
case 'isNull':
|
|
220
|
+
return `attribute_not_exists(${p})`;
|
|
221
|
+
case 'isNotNull':
|
|
222
|
+
return `attribute_exists(${p})`;
|
|
223
|
+
default:
|
|
224
|
+
throw new errors_1.DatabaseError(`DynamoDB ORM layer does not support operator "${op}" for attribute "${field}"`, { code: 'QUERY_ERROR' });
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** Render an arbitrary boolean tree to a FilterExpression string. */
|
|
228
|
+
filter(node) {
|
|
229
|
+
switch (node.kind) {
|
|
230
|
+
case 'and':
|
|
231
|
+
return node.nodes.length ? `(${node.nodes.map((n) => this.filter(n)).join(' AND ')})` : '';
|
|
232
|
+
case 'or':
|
|
233
|
+
return node.nodes.length ? `(${node.nodes.map((n) => this.filter(n)).join(' OR ')})` : '';
|
|
234
|
+
case 'not':
|
|
235
|
+
return `NOT (${this.filter(node.node)})`;
|
|
236
|
+
case 'cmp':
|
|
237
|
+
return this.cmp(node.field, node.op, node.value);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
80
241
|
/**
|
|
81
242
|
* Amazon DynamoDB store, implementing the minimal `NoSqlStore` marker
|
|
82
243
|
* interface. Unlike the SQL dialects, there is no `query(sql)` — DynamoDB's
|
|
@@ -933,5 +1094,267 @@ class DynamoDbStore {
|
|
|
933
1094
|
throw this.wrapError(`ListTagsOfResource on '${resourceArn}'`, err);
|
|
934
1095
|
}
|
|
935
1096
|
}
|
|
1097
|
+
// ---------------------------------------------------------------------
|
|
1098
|
+
// ORM model surface (no hand-written Key/Filter expressions needed)
|
|
1099
|
+
// ---------------------------------------------------------------------
|
|
1100
|
+
/**
|
|
1101
|
+
* Compile an ORM `where` clause + read options into either a `QueryParams`
|
|
1102
|
+
* (when the partition key is pinned by equality, so DynamoDB can Query) or a
|
|
1103
|
+
* `ScanParams` (otherwise). Shared by {@link findAll}/{@link findAllPaged}/
|
|
1104
|
+
* {@link count}.
|
|
1105
|
+
*/
|
|
1106
|
+
compileRead(options) {
|
|
1107
|
+
const node = parseWhere(options.where);
|
|
1108
|
+
const schema = options.indexName ? options.key?.indexes?.[options.indexName] : options.key;
|
|
1109
|
+
const leaves = topLevelLeaves(node).filter((l) => l.kind === 'cmp');
|
|
1110
|
+
const pkLeaf = schema
|
|
1111
|
+
? leaves.find((l) => l.field === schema.partitionKey && l.op === 'eq')
|
|
1112
|
+
: undefined;
|
|
1113
|
+
const skLeaf = pkLeaf && schema?.sortKey
|
|
1114
|
+
? leaves.find((l) => l.field === schema.sortKey && SORT_KEY_OPS.has(l.op))
|
|
1115
|
+
: undefined;
|
|
1116
|
+
const builder = new DynamoExprBuilder();
|
|
1117
|
+
const projectionExpression = options.attributes && options.attributes.length > 0
|
|
1118
|
+
? options.attributes.map((a) => builder.path(a)).join(', ')
|
|
1119
|
+
: undefined;
|
|
1120
|
+
if (pkLeaf) {
|
|
1121
|
+
const keyParts = [builder.cmp(pkLeaf.field, 'eq', pkLeaf.value)];
|
|
1122
|
+
if (skLeaf)
|
|
1123
|
+
keyParts.push(builder.cmp(skLeaf.field, skLeaf.op, skLeaf.value));
|
|
1124
|
+
const filterLeaves = leaves.filter((l) => l !== pkLeaf && l !== skLeaf);
|
|
1125
|
+
const filterExpression = filterLeaves.length
|
|
1126
|
+
? filterLeaves.map((l) => builder.filter(l)).join(' AND ')
|
|
1127
|
+
: undefined;
|
|
1128
|
+
return {
|
|
1129
|
+
mode: 'query',
|
|
1130
|
+
params: {
|
|
1131
|
+
indexName: options.indexName,
|
|
1132
|
+
keyConditionExpression: keyParts.join(' AND '),
|
|
1133
|
+
filterExpression,
|
|
1134
|
+
projectionExpression,
|
|
1135
|
+
expressionAttributeNames: Object.keys(builder.names).length ? builder.names : undefined,
|
|
1136
|
+
expressionAttributeValues: Object.keys(builder.values).length
|
|
1137
|
+
? builder.values
|
|
1138
|
+
: undefined,
|
|
1139
|
+
limit: options.limit,
|
|
1140
|
+
scanIndexForward: options.order ? options.order !== 'DESC' : undefined,
|
|
1141
|
+
exclusiveStartKey: options.exclusiveStartKey,
|
|
1142
|
+
consistentRead: options.consistentRead,
|
|
1143
|
+
},
|
|
1144
|
+
};
|
|
1145
|
+
}
|
|
1146
|
+
const filterExpression = node ? builder.filter(node) || undefined : undefined;
|
|
1147
|
+
return {
|
|
1148
|
+
mode: 'scan',
|
|
1149
|
+
params: {
|
|
1150
|
+
indexName: options.indexName,
|
|
1151
|
+
filterExpression,
|
|
1152
|
+
projectionExpression,
|
|
1153
|
+
expressionAttributeNames: Object.keys(builder.names).length ? builder.names : undefined,
|
|
1154
|
+
expressionAttributeValues: Object.keys(builder.values).length ? builder.values : undefined,
|
|
1155
|
+
limit: options.limit,
|
|
1156
|
+
exclusiveStartKey: options.exclusiveStartKey,
|
|
1157
|
+
consistentRead: options.consistentRead,
|
|
1158
|
+
},
|
|
1159
|
+
};
|
|
1160
|
+
}
|
|
1161
|
+
/**
|
|
1162
|
+
* Fetch items matching the ORM `where` clause. When `options.key` pins the
|
|
1163
|
+
* partition key by equality this issues an efficient `Query`; otherwise it
|
|
1164
|
+
* falls back to a `Scan` (see the warning on {@link scan}). Returns a single
|
|
1165
|
+
* page plus the `lastEvaluatedKey` cursor (pass it back as
|
|
1166
|
+
* `exclusiveStartKey` for the next page, or use {@link findAll} to
|
|
1167
|
+
* auto-paginate).
|
|
1168
|
+
*/
|
|
1169
|
+
async findAllPaged(tableName, options = {}) {
|
|
1170
|
+
const compiled = this.compileRead(options);
|
|
1171
|
+
return compiled.mode === 'query'
|
|
1172
|
+
? this.query(tableName, compiled.params)
|
|
1173
|
+
: this.scan(tableName, compiled.params);
|
|
1174
|
+
}
|
|
1175
|
+
/**
|
|
1176
|
+
* Auto-paginating {@link findAllPaged}: follows `lastEvaluatedKey` and
|
|
1177
|
+
* returns every matching item. `options.limit` still applies per page (as
|
|
1178
|
+
* DynamoDB defines it); to cap total results, slice the return value.
|
|
1179
|
+
*/
|
|
1180
|
+
async findAll(tableName, options = {}) {
|
|
1181
|
+
const items = [];
|
|
1182
|
+
let exclusiveStartKey = options.exclusiveStartKey;
|
|
1183
|
+
do {
|
|
1184
|
+
const page = await this.findAllPaged(tableName, { ...options, exclusiveStartKey });
|
|
1185
|
+
items.push(...page.items);
|
|
1186
|
+
exclusiveStartKey = page.lastEvaluatedKey;
|
|
1187
|
+
} while (exclusiveStartKey !== undefined);
|
|
1188
|
+
return items;
|
|
1189
|
+
}
|
|
1190
|
+
/** Fetch the first item matching `where` (page-limited to 1), or `undefined`. */
|
|
1191
|
+
async findOne(tableName, options = {}) {
|
|
1192
|
+
const page = await this.findAllPaged(tableName, { ...options, limit: 1 });
|
|
1193
|
+
return page.items[0];
|
|
1194
|
+
}
|
|
1195
|
+
/**
|
|
1196
|
+
* Count items matching `where` using `Select: 'COUNT'` (server-side count;
|
|
1197
|
+
* items are not returned). Follows pagination automatically and sums each
|
|
1198
|
+
* page's count.
|
|
1199
|
+
*/
|
|
1200
|
+
async count(tableName, options = {}) {
|
|
1201
|
+
const client = this.requireClient();
|
|
1202
|
+
const compiled = this.compileRead(options);
|
|
1203
|
+
let total = 0;
|
|
1204
|
+
let exclusiveStartKey = compiled.params.exclusiveStartKey;
|
|
1205
|
+
try {
|
|
1206
|
+
do {
|
|
1207
|
+
if (compiled.mode === 'query') {
|
|
1208
|
+
const p = compiled.params;
|
|
1209
|
+
const result = await client.send(new lib_dynamodb_1.QueryCommand({
|
|
1210
|
+
TableName: tableName,
|
|
1211
|
+
IndexName: p.indexName,
|
|
1212
|
+
KeyConditionExpression: p.keyConditionExpression,
|
|
1213
|
+
FilterExpression: p.filterExpression,
|
|
1214
|
+
ExpressionAttributeNames: p.expressionAttributeNames,
|
|
1215
|
+
ExpressionAttributeValues: p.expressionAttributeValues,
|
|
1216
|
+
ConsistentRead: p.consistentRead,
|
|
1217
|
+
Select: 'COUNT',
|
|
1218
|
+
ExclusiveStartKey: exclusiveStartKey,
|
|
1219
|
+
}));
|
|
1220
|
+
total += result.Count ?? 0;
|
|
1221
|
+
exclusiveStartKey = result.LastEvaluatedKey;
|
|
1222
|
+
}
|
|
1223
|
+
else {
|
|
1224
|
+
const p = compiled.params;
|
|
1225
|
+
const result = await client.send(new lib_dynamodb_1.ScanCommand({
|
|
1226
|
+
TableName: tableName,
|
|
1227
|
+
IndexName: p.indexName,
|
|
1228
|
+
FilterExpression: p.filterExpression,
|
|
1229
|
+
ExpressionAttributeNames: p.expressionAttributeNames,
|
|
1230
|
+
ExpressionAttributeValues: p.expressionAttributeValues,
|
|
1231
|
+
ConsistentRead: p.consistentRead,
|
|
1232
|
+
Select: 'COUNT',
|
|
1233
|
+
ExclusiveStartKey: exclusiveStartKey,
|
|
1234
|
+
}));
|
|
1235
|
+
total += result.Count ?? 0;
|
|
1236
|
+
exclusiveStartKey = result.LastEvaluatedKey;
|
|
1237
|
+
}
|
|
1238
|
+
} while (exclusiveStartKey !== undefined);
|
|
1239
|
+
}
|
|
1240
|
+
catch (err) {
|
|
1241
|
+
throw this.wrapError(`Count on '${tableName}'`, err);
|
|
1242
|
+
}
|
|
1243
|
+
return total;
|
|
1244
|
+
}
|
|
1245
|
+
/**
|
|
1246
|
+
* Insert an item (`PutItem`). By default overwrites any existing item with
|
|
1247
|
+
* the same key (native Put semantics); pass `options.key` with
|
|
1248
|
+
* `options.insertOnly` to add an `attribute_not_exists(<pk>)` condition so a
|
|
1249
|
+
* duplicate primary key fails instead (SQL `INSERT` semantics).
|
|
1250
|
+
*/
|
|
1251
|
+
async create(tableName, item, options = {}) {
|
|
1252
|
+
const putOptions = {};
|
|
1253
|
+
if (options.insertOnly && options.key) {
|
|
1254
|
+
putOptions.conditionExpression = 'attribute_not_exists(#pk)';
|
|
1255
|
+
putOptions.expressionAttributeNames = { '#pk': options.key.partitionKey };
|
|
1256
|
+
}
|
|
1257
|
+
await this.putItem(tableName, item, putOptions);
|
|
1258
|
+
return item;
|
|
1259
|
+
}
|
|
1260
|
+
/** Insert many items via chunked/retried `BatchWriteItem` puts. */
|
|
1261
|
+
async bulkCreate(tableName, items, options = {}) {
|
|
1262
|
+
const { unprocessedCount } = await this.batchWriteItem(tableName, items.map((put) => ({ put })), options);
|
|
1263
|
+
return { inserted: items.length - unprocessedCount, unprocessedCount };
|
|
1264
|
+
}
|
|
1265
|
+
/**
|
|
1266
|
+
* Insert-or-replace an item (`PutItem`) — DynamoDB's native Put already has
|
|
1267
|
+
* upsert semantics (it creates the item or overwrites it wholesale).
|
|
1268
|
+
*/
|
|
1269
|
+
async upsert(tableName, item) {
|
|
1270
|
+
await this.putItem(tableName, item);
|
|
1271
|
+
return item;
|
|
1272
|
+
}
|
|
1273
|
+
/** Extract a full primary key `{pk, sk?}` from top-level eq leaves, or null. */
|
|
1274
|
+
extractFullKey(schema, leaves) {
|
|
1275
|
+
const pk = leaves.find((l) => l.field === schema.partitionKey && l.op === 'eq');
|
|
1276
|
+
if (!pk)
|
|
1277
|
+
return null;
|
|
1278
|
+
const key = { [schema.partitionKey]: pk.value };
|
|
1279
|
+
let used = 1;
|
|
1280
|
+
if (schema.sortKey) {
|
|
1281
|
+
const sk = leaves.find((l) => l.field === schema.sortKey && l.op === 'eq');
|
|
1282
|
+
if (!sk)
|
|
1283
|
+
return null;
|
|
1284
|
+
key[schema.sortKey] = sk.value;
|
|
1285
|
+
used = 2;
|
|
1286
|
+
}
|
|
1287
|
+
// Only a "full key" if there are no *other* conditions to filter on.
|
|
1288
|
+
return used === leaves.length ? key : null;
|
|
1289
|
+
}
|
|
1290
|
+
/**
|
|
1291
|
+
* Update every item matching `where`, SETting each key in `values`. When
|
|
1292
|
+
* `where` pins the full primary key (and nothing else), this is a single
|
|
1293
|
+
* `UpdateItem`; otherwise it finds matching items (Query/Scan via `key`),
|
|
1294
|
+
* then issues one `UpdateItem` per item. Requires `options.key`. Returns the
|
|
1295
|
+
* number of items updated.
|
|
1296
|
+
*/
|
|
1297
|
+
async update(tableName, values, where, options = { key: { partitionKey: '' } }) {
|
|
1298
|
+
const schema = options.key;
|
|
1299
|
+
if (!schema || !schema.partitionKey) {
|
|
1300
|
+
throw new errors_1.DatabaseError('DynamoDB update() requires options.key with a partitionKey', {
|
|
1301
|
+
code: 'VALIDATION_ERROR',
|
|
1302
|
+
});
|
|
1303
|
+
}
|
|
1304
|
+
const leaves = topLevelLeaves(parseWhere(where)).filter((l) => l.kind === 'cmp');
|
|
1305
|
+
const directKey = this.extractFullKey(schema, leaves);
|
|
1306
|
+
if (directKey) {
|
|
1307
|
+
await this.updateItem(tableName, directKey, values);
|
|
1308
|
+
return 1;
|
|
1309
|
+
}
|
|
1310
|
+
const matches = await this.findAll(tableName, {
|
|
1311
|
+
where,
|
|
1312
|
+
key: schema,
|
|
1313
|
+
indexName: options.indexName,
|
|
1314
|
+
});
|
|
1315
|
+
let updated = 0;
|
|
1316
|
+
for (const item of matches) {
|
|
1317
|
+
const key = this.itemKey(schema, item);
|
|
1318
|
+
await this.updateItem(tableName, key, values);
|
|
1319
|
+
updated += 1;
|
|
1320
|
+
}
|
|
1321
|
+
return updated;
|
|
1322
|
+
}
|
|
1323
|
+
/**
|
|
1324
|
+
* Delete every item matching `where`. When `where` pins the full primary key
|
|
1325
|
+
* this is a single `DeleteItem`; otherwise it finds matching items and
|
|
1326
|
+
* deletes them via chunked `BatchWriteItem`. Requires `options.key`. Returns
|
|
1327
|
+
* the number of items deleted.
|
|
1328
|
+
*/
|
|
1329
|
+
async destroy(tableName, where, options = { key: { partitionKey: '' } }) {
|
|
1330
|
+
const schema = options.key;
|
|
1331
|
+
if (!schema || !schema.partitionKey) {
|
|
1332
|
+
throw new errors_1.DatabaseError('DynamoDB destroy() requires options.key with a partitionKey', {
|
|
1333
|
+
code: 'VALIDATION_ERROR',
|
|
1334
|
+
});
|
|
1335
|
+
}
|
|
1336
|
+
const leaves = topLevelLeaves(parseWhere(where)).filter((l) => l.kind === 'cmp');
|
|
1337
|
+
const directKey = this.extractFullKey(schema, leaves);
|
|
1338
|
+
if (directKey) {
|
|
1339
|
+
await this.deleteItem(tableName, directKey, { returnValues: 'NONE' });
|
|
1340
|
+
return 1;
|
|
1341
|
+
}
|
|
1342
|
+
const matches = await this.findAll(tableName, {
|
|
1343
|
+
where,
|
|
1344
|
+
key: schema,
|
|
1345
|
+
indexName: options.indexName,
|
|
1346
|
+
});
|
|
1347
|
+
if (matches.length === 0)
|
|
1348
|
+
return 0;
|
|
1349
|
+
await this.batchWriteItem(tableName, matches.map((item) => ({ delete: this.itemKey(schema, item) })));
|
|
1350
|
+
return matches.length;
|
|
1351
|
+
}
|
|
1352
|
+
/** Project an item down to just its key attributes for the given schema. */
|
|
1353
|
+
itemKey(schema, item) {
|
|
1354
|
+
const key = { [schema.partitionKey]: item[schema.partitionKey] };
|
|
1355
|
+
if (schema.sortKey)
|
|
1356
|
+
key[schema.sortKey] = item[schema.sortKey];
|
|
1357
|
+
return key;
|
|
1358
|
+
}
|
|
936
1359
|
}
|
|
937
1360
|
exports.DynamoDbStore = DynamoDbStore;
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Elasticsearch store implementation.
|
|
3
|
+
*
|
|
4
|
+
* Elasticsearch is a distributed document store built around an inverted
|
|
5
|
+
* index and a JSON-based Query DSL (`match`/`term`/`bool`/`range` queries,
|
|
6
|
+
* aggregations, sorting) rather than SQL. It has no `JOIN`, no transaction
|
|
7
|
+
* log, and documents are schema-flexible (mappings describe *how* fields
|
|
8
|
+
* are indexed, not a hard constraint like a SQL column type), so it does
|
|
9
|
+
* not fit the SQL-shaped `Dialect` interface used by the SQL dialects in
|
|
10
|
+
* this repo. Instead it implements the minimal `NoSqlStore` marker
|
|
11
|
+
* interface (`src/nosql/store.ts`) and exposes Elasticsearch's real
|
|
12
|
+
* capabilities grouped by concern: connection lifecycle, index management,
|
|
13
|
+
* document CRUD (single + bulk), search, and alias management.
|
|
14
|
+
*
|
|
15
|
+
* Uses the official `@elastic/elasticsearch` driver (v9). This client
|
|
16
|
+
* speaks the Elasticsearch REST API and is also broadly compatible with
|
|
17
|
+
* OpenSearch clusters (which forked from Elasticsearch 7.10) for the
|
|
18
|
+
* subset of the API surface wrapped here - see the README for details and
|
|
19
|
+
* caveats.
|
|
20
|
+
*/
|
|
21
|
+
import { Client, estypes } from '@elastic/elasticsearch';
|
|
22
|
+
import type { ClientOptions } from '@elastic/elasticsearch';
|
|
23
|
+
import { NoSqlStore } from '../store';
|
|
24
|
+
/**
|
|
25
|
+
* Connection options for `ElasticsearchStore`. This is a thin pass-through
|
|
26
|
+
* to the driver's own `ClientOptions` (node/nodes URL(s), `auth` for
|
|
27
|
+
* basic/API-key/bearer auth, `tls`, `cloud`, `requestTimeout`,
|
|
28
|
+
* `maxRetries`, etc.) - nothing is renamed or reshaped, since the driver's
|
|
29
|
+
* options already cover connecting to a single node, a list of nodes, or
|
|
30
|
+
* Elastic Cloud.
|
|
31
|
+
*/
|
|
32
|
+
export type ElasticsearchStoreOptions = ClientOptions;
|
|
33
|
+
/** Options accepted by `createIndex()`. */
|
|
34
|
+
export interface CreateIndexOptions {
|
|
35
|
+
/** Field mappings (types, analyzers, etc.) for the new index. */
|
|
36
|
+
mappings?: estypes.MappingTypeMapping;
|
|
37
|
+
/** Index settings (shards, replicas, analysis, etc.). */
|
|
38
|
+
settings?: estypes.IndicesIndexSettings;
|
|
39
|
+
/** Aliases to create the index with. */
|
|
40
|
+
aliases?: Record<string, estypes.IndicesAlias>;
|
|
41
|
+
}
|
|
42
|
+
/** Options accepted by `indexDocument()`. */
|
|
43
|
+
export interface IndexDocumentOptions {
|
|
44
|
+
/** `'index'` (default; overwrite) or `'create'` (fail if the ID already exists). */
|
|
45
|
+
opType?: estypes.OpType;
|
|
46
|
+
/** Refresh policy for making the write visible to search immediately. */
|
|
47
|
+
refresh?: estypes.Refresh;
|
|
48
|
+
/** Route the document to a specific shard. */
|
|
49
|
+
routing?: string;
|
|
50
|
+
}
|
|
51
|
+
/** Options accepted by `updateDocument()`. */
|
|
52
|
+
export interface UpdateDocumentOptions {
|
|
53
|
+
/** Document to insert if it doesn't already exist (upsert). */
|
|
54
|
+
upsert?: Record<string, unknown>;
|
|
55
|
+
/** Refresh policy for making the write visible to search immediately. */
|
|
56
|
+
refresh?: estypes.Refresh;
|
|
57
|
+
/** Number of times to retry on a version conflict. */
|
|
58
|
+
retryOnConflict?: number;
|
|
59
|
+
}
|
|
60
|
+
/** Options accepted by `deleteDocument()`. */
|
|
61
|
+
export interface DeleteDocumentOptions {
|
|
62
|
+
refresh?: estypes.Refresh;
|
|
63
|
+
routing?: string;
|
|
64
|
+
}
|
|
65
|
+
/** A single operation for `bulkIndex()`/`bulkDelete()`/`bulk()`. */
|
|
66
|
+
export type BulkAction = {
|
|
67
|
+
action: 'index';
|
|
68
|
+
index: string;
|
|
69
|
+
id?: string;
|
|
70
|
+
document: Record<string, unknown>;
|
|
71
|
+
} | {
|
|
72
|
+
action: 'create';
|
|
73
|
+
index: string;
|
|
74
|
+
id?: string;
|
|
75
|
+
document: Record<string, unknown>;
|
|
76
|
+
} | {
|
|
77
|
+
action: 'update';
|
|
78
|
+
index: string;
|
|
79
|
+
id: string;
|
|
80
|
+
document: Record<string, unknown>;
|
|
81
|
+
upsert?: Record<string, unknown>;
|
|
82
|
+
} | {
|
|
83
|
+
action: 'delete';
|
|
84
|
+
index: string;
|
|
85
|
+
id: string;
|
|
86
|
+
};
|
|
87
|
+
/** Per-item result from a `bulk()` call. */
|
|
88
|
+
export interface BulkItemResult {
|
|
89
|
+
action: 'index' | 'create' | 'update' | 'delete';
|
|
90
|
+
id?: string;
|
|
91
|
+
status: number;
|
|
92
|
+
error?: {
|
|
93
|
+
type: string;
|
|
94
|
+
reason: string;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Result of a `bulk()` call. */
|
|
98
|
+
export interface BulkResult {
|
|
99
|
+
errors: boolean;
|
|
100
|
+
items: BulkItemResult[];
|
|
101
|
+
took: number;
|
|
102
|
+
}
|
|
103
|
+
/** Parameters accepted by `search()`. */
|
|
104
|
+
export interface SearchParams {
|
|
105
|
+
/** Query DSL query (match/term/bool/range/etc.). Omit to match all documents. */
|
|
106
|
+
query?: estypes.QueryDslQueryContainer;
|
|
107
|
+
/** Zero-based offset into the result set, for pagination. */
|
|
108
|
+
from?: number;
|
|
109
|
+
/** Max number of hits to return. */
|
|
110
|
+
size?: number;
|
|
111
|
+
/** Sort order - a field name, `{ field: 'asc' | 'desc' }`, or the driver's raw `Sort` shape. */
|
|
112
|
+
sort?: estypes.Sort;
|
|
113
|
+
/** Named aggregations to compute alongside the search. */
|
|
114
|
+
aggs?: Record<string, estypes.AggregationsAggregationContainer>;
|
|
115
|
+
/** Restrict/exclude which `_source` fields are returned. */
|
|
116
|
+
source?: boolean | string | string[];
|
|
117
|
+
/** Track the exact total hit count (rather than capping at 10,000). */
|
|
118
|
+
trackTotalHits?: boolean | number;
|
|
119
|
+
}
|
|
120
|
+
/** A single search hit. */
|
|
121
|
+
export interface SearchHit<T = Record<string, unknown>> {
|
|
122
|
+
id: string;
|
|
123
|
+
index: string;
|
|
124
|
+
score: number | null;
|
|
125
|
+
source: T | undefined;
|
|
126
|
+
sort?: (string | number | null)[];
|
|
127
|
+
}
|
|
128
|
+
/** Result of a `search()` call. */
|
|
129
|
+
export interface SearchResult<T = Record<string, unknown>> {
|
|
130
|
+
hits: SearchHit<T>[];
|
|
131
|
+
/** Total number of matching documents. `relation` is `'gte'` when the exact count wasn't tracked. */
|
|
132
|
+
total: {
|
|
133
|
+
value: number;
|
|
134
|
+
relation: 'eq' | 'gte';
|
|
135
|
+
};
|
|
136
|
+
maxScore: number | null;
|
|
137
|
+
tookMs: number;
|
|
138
|
+
/** Raw aggregation results, keyed by aggregation name, when `aggs` was requested. */
|
|
139
|
+
aggregations?: Record<string, unknown>;
|
|
140
|
+
}
|
|
141
|
+
declare function isNotFoundError(err: unknown): boolean;
|
|
142
|
+
declare function isConflictError(err: unknown): boolean;
|
|
143
|
+
/**
|
|
144
|
+
* `ElasticsearchStore` wraps the official `@elastic/elasticsearch` v9
|
|
145
|
+
* client and exposes index management, document CRUD (single + bulk),
|
|
146
|
+
* Query-DSL search, and alias management as a typed, promise-based API.
|
|
147
|
+
*/
|
|
148
|
+
export declare class ElasticsearchStore implements NoSqlStore {
|
|
149
|
+
readonly name = "elasticsearch";
|
|
150
|
+
readonly library = "@elastic/elasticsearch";
|
|
151
|
+
private readonly options;
|
|
152
|
+
private client;
|
|
153
|
+
private connected;
|
|
154
|
+
constructor(options: ElasticsearchStoreOptions);
|
|
155
|
+
connect(): Promise<void>;
|
|
156
|
+
disconnect(): Promise<void>;
|
|
157
|
+
isConnected(): boolean;
|
|
158
|
+
/** Returns the underlying `@elastic/elasticsearch` client for anything not wrapped here. */
|
|
159
|
+
getClient(): Client;
|
|
160
|
+
private requireClient;
|
|
161
|
+
private exec;
|
|
162
|
+
/** Create an index, optionally with mappings/settings/aliases. */
|
|
163
|
+
createIndex(index: string, options?: CreateIndexOptions): Promise<void>;
|
|
164
|
+
/** Delete an index. Resolves without error if the index doesn't exist. */
|
|
165
|
+
deleteIndex(index: string): Promise<void>;
|
|
166
|
+
/** Whether an index exists. */
|
|
167
|
+
indexExists(index: string): Promise<boolean>;
|
|
168
|
+
/** Get the field mappings for an index. */
|
|
169
|
+
getMapping(index: string): Promise<estypes.MappingTypeMapping | undefined>;
|
|
170
|
+
/** Add/update field mappings on an existing index. Mapping updates are additive - existing field mappings cannot be changed, only new fields added. */
|
|
171
|
+
putMapping(index: string, mappings: estypes.MappingTypeMapping): Promise<void>;
|
|
172
|
+
/** Get an index's settings. */
|
|
173
|
+
getSettings(index: string): Promise<estypes.IndicesIndexSettings | undefined>;
|
|
174
|
+
/** Update dynamic index settings (e.g. `number_of_replicas`, `refresh_interval`). Static settings like `number_of_shards` require closing the index first (not wrapped here - use `getClient()`). */
|
|
175
|
+
putSettings(index: string, settings: estypes.IndicesIndexSettings): Promise<void>;
|
|
176
|
+
/** Refresh an index so recently-written documents become visible to search immediately, rather than waiting for the automatic refresh interval. */
|
|
177
|
+
refreshIndex(index: string): Promise<void>;
|
|
178
|
+
/**
|
|
179
|
+
* Index (create or overwrite) a document. Omit `id` to let Elasticsearch
|
|
180
|
+
* auto-generate one. Returns the assigned `_id`.
|
|
181
|
+
*/
|
|
182
|
+
indexDocument(index: string, document: Record<string, unknown>, options?: IndexDocumentOptions & {
|
|
183
|
+
id?: string;
|
|
184
|
+
}): Promise<string>;
|
|
185
|
+
/** Get a document by ID. Returns `null` if it doesn't exist. */
|
|
186
|
+
getDocument<T = Record<string, unknown>>(index: string, id: string): Promise<T | null>;
|
|
187
|
+
/** Whether a document exists. */
|
|
188
|
+
documentExists(index: string, id: string): Promise<boolean>;
|
|
189
|
+
/**
|
|
190
|
+
* Partially update a document by merging `partial` into the stored
|
|
191
|
+
* `_source`. Pass `options.upsert` to insert that document if `id`
|
|
192
|
+
* doesn't already exist yet. Throws `EmptyResultError` if the document
|
|
193
|
+
* doesn't exist and no `upsert` was provided.
|
|
194
|
+
*/
|
|
195
|
+
updateDocument(index: string, id: string, partial: Record<string, unknown>, options?: UpdateDocumentOptions): Promise<void>;
|
|
196
|
+
/**
|
|
197
|
+
* Delete a document by ID. Returns `true` if a document was deleted,
|
|
198
|
+
* `false` if it didn't exist (rather than throwing, since "already
|
|
199
|
+
* gone" is a common, non-exceptional outcome for a delete).
|
|
200
|
+
*/
|
|
201
|
+
deleteDocument(index: string, id: string, options?: DeleteDocumentOptions): Promise<boolean>;
|
|
202
|
+
/**
|
|
203
|
+
* Run a batch of index/create/update/delete operations in a single
|
|
204
|
+
* request. Unlike a SQL transaction, this is not atomic - each item
|
|
205
|
+
* succeeds or fails independently; check `result.errors` and each
|
|
206
|
+
* item's `error` field rather than assuming all-or-nothing.
|
|
207
|
+
*/
|
|
208
|
+
bulk(actions: BulkAction[]): Promise<BulkResult>;
|
|
209
|
+
/** Convenience wrapper around `bulk()` for indexing many documents into one index at once. */
|
|
210
|
+
bulkIndex(index: string, documents: {
|
|
211
|
+
id?: string;
|
|
212
|
+
document: Record<string, unknown>;
|
|
213
|
+
}[]): Promise<BulkResult>;
|
|
214
|
+
/** Convenience wrapper around `bulk()` for deleting many documents from one index at once. */
|
|
215
|
+
bulkDelete(index: string, ids: string[]): Promise<BulkResult>;
|
|
216
|
+
/**
|
|
217
|
+
* Run a Query DSL search (`match`/`term`/`bool`/`range`/etc.) against
|
|
218
|
+
* one or more indices (comma-separated, or a wildcard pattern). Supports
|
|
219
|
+
* `from`/`size` pagination, `sort`, and named `aggs`.
|
|
220
|
+
*/
|
|
221
|
+
search<T = Record<string, unknown>>(index: string, params?: SearchParams): Promise<SearchResult<T>>;
|
|
222
|
+
/** Count documents matching a query (or all documents, if `query` is omitted) without fetching them. */
|
|
223
|
+
count(index: string, query?: estypes.QueryDslQueryContainer): Promise<number>;
|
|
224
|
+
/** Point an alias at an index, creating the alias if it doesn't exist. */
|
|
225
|
+
putAlias(index: string, alias: string): Promise<void>;
|
|
226
|
+
/** Remove an alias from an index. */
|
|
227
|
+
deleteAlias(index: string, alias: string): Promise<void>;
|
|
228
|
+
/** List the indices an alias currently points at. */
|
|
229
|
+
getAlias(alias: string): Promise<string[]>;
|
|
230
|
+
/**
|
|
231
|
+
* Atomically repoint an alias from one index to another - the standard
|
|
232
|
+
* zero-downtime reindex pattern (build the new index, then swap the
|
|
233
|
+
* alias in one request so readers never see a moment with no index
|
|
234
|
+
* behind the alias).
|
|
235
|
+
*/
|
|
236
|
+
swapAlias(alias: string, fromIndex: string, toIndex: string): Promise<void>;
|
|
237
|
+
}
|
|
238
|
+
export { isNotFoundError as isElasticsearchNotFoundError, isConflictError as isElasticsearchConflictError };
|
|
239
|
+
export default ElasticsearchStore;
|