ts-prorm-orm 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +83 -0
- package/README.md +194 -72
- package/dist/audit/history-query.d.ts +35 -0
- package/dist/audit/index.d.ts +16 -0
- package/dist/audit/logger.d.ts +126 -0
- package/dist/cache/cache-manager.d.ts +341 -0
- package/dist/cache/index.d.ts +8 -0
- package/dist/cache/redis-cluster-cache.d.ts +164 -0
- package/dist/cache/redis-cluster-cache.js +19 -36
- package/dist/cli/cloud.d.ts +55 -0
- package/dist/cli/cloud.js +318 -0
- package/dist/cli/commands/auth.d.ts +2 -0
- package/dist/cli/commands/auth.js +345 -0
- package/dist/cli/commands/billing.d.ts +2 -0
- package/dist/cli/commands/billing.js +135 -0
- package/dist/cli/commands/code.d.ts +2 -0
- package/dist/cli/commands/code.js +168 -0
- package/dist/cli/commands/config.d.ts +2 -0
- package/dist/cli/commands/config.js +154 -0
- package/dist/cli/commands/db.d.ts +2 -0
- package/dist/cli/commands/db.js +189 -0
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.js +22 -0
- package/dist/cli/commands/keys.d.ts +2 -0
- package/dist/cli/commands/keys.js +100 -0
- package/dist/cli/commands/misc.d.ts +2 -0
- package/dist/cli/commands/misc.js +282 -0
- package/dist/cli/commands/pull.d.ts +2 -0
- package/dist/cli/commands/pull.js +306 -0
- package/dist/cli/commands/runners.d.ts +2 -0
- package/dist/cli/commands/runners.js +218 -0
- package/dist/cli/commands/scaffold.d.ts +2 -0
- package/dist/cli/commands/scaffold.js +383 -0
- package/dist/cli/commands/secrets.d.ts +2 -0
- package/dist/cli/commands/secrets.js +162 -0
- package/dist/cli/commands/store.d.ts +2 -0
- package/dist/cli/commands/store.js +274 -0
- package/dist/cli/commands/system.d.ts +10 -0
- package/dist/cli/commands/system.js +169 -0
- package/dist/cli/commands/teams.d.ts +2 -0
- package/dist/cli/commands/teams.js +189 -0
- package/dist/cli/commands/user.d.ts +2 -0
- package/dist/cli/commands/user.js +171 -0
- package/dist/cli/framework.d.ts +103 -0
- package/dist/cli/framework.js +436 -0
- package/dist/cli/io.d.ts +26 -0
- package/dist/cli/io.js +181 -0
- package/dist/cli/keychain.d.ts +10 -0
- package/dist/cli/keychain.js +101 -0
- package/dist/cli/prompt.d.ts +20 -0
- package/dist/cli/prompt.js +111 -0
- package/dist/cli.d.ts +214 -0
- package/dist/cli.js +72 -5
- package/dist/compliance/audit-trail.d.ts +66 -0
- package/dist/compliance/backup-verification.d.ts +279 -0
- package/dist/compliance/breach-detector.d.ts +197 -0
- package/dist/compliance/consent-record.d.ts +107 -0
- package/dist/compliance/consent-versioning.d.ts +169 -0
- package/dist/compliance/cross-border-log.d.ts +254 -0
- package/dist/compliance/data-classifier.d.ts +127 -0
- package/dist/compliance/data-lineage.d.ts +268 -0
- package/dist/compliance/data-masker.d.ts +110 -0
- package/dist/compliance/data-portability.d.ts +98 -0
- package/dist/compliance/data-retention.d.ts +108 -0
- package/dist/compliance/dsar-workflow.d.ts +175 -0
- package/dist/compliance/field-encryption.d.ts +84 -0
- package/dist/compliance/immutable-record.d.ts +84 -0
- package/dist/compliance/index.d.ts +93 -0
- package/dist/compliance/privacy-impact-assessment.d.ts +196 -0
- package/dist/compliance/pseudonymization.d.ts +96 -0
- package/dist/compliance/query-firewall.d.ts +661 -0
- package/dist/compliance/rate-limiter.d.ts +203 -0
- package/dist/compliance/right-to-erasure.d.ts +96 -0
- package/dist/compliance/row-level-security.d.ts +152 -0
- package/dist/compliance/security-decorator.d.ts +388 -0
- package/dist/compliance/security-monitor.d.ts +170 -0
- package/dist/compliance/sensitive-data-discovery.d.ts +151 -0
- package/dist/compliance/session-isolation.d.ts +286 -0
- package/dist/compliance/tls-enforcer.d.ts +51 -0
- package/dist/compliance/worm-storage.d.ts +225 -0
- package/dist/connection-manager.d.ts +130 -0
- package/dist/connection-pool.d.ts +311 -0
- package/dist/decorators/audit.d.ts +49 -0
- package/dist/decorators/check.d.ts +218 -0
- package/dist/decorators/collate.d.ts +346 -0
- package/dist/decorators/comment.d.ts +51 -0
- package/dist/decorators/database-settings.d.ts +193 -0
- package/dist/decorators/default.d.ts +148 -0
- package/dist/decorators/encryption.d.ts +175 -0
- package/dist/decorators/engine.d.ts +97 -0
- package/dist/decorators/fk-constraints.d.ts +387 -0
- package/dist/decorators/foreign-table.d.ts +57 -0
- package/dist/decorators/generated.d.ts +232 -0
- package/dist/decorators/hstore.d.ts +96 -0
- package/dist/decorators/index.d.ts +57 -0
- package/dist/decorators/index.js +14 -30
- package/dist/decorators/json-column.d.ts +47 -0
- package/dist/decorators/jsonb.d.ts +83 -0
- package/dist/decorators/orm-decorators.d.ts +274 -0
- package/dist/decorators/permissions.d.ts +192 -0
- package/dist/decorators/procedure.d.ts +168 -0
- package/dist/decorators/procedure.js +31 -7
- package/dist/decorators/query-options.d.ts +527 -0
- package/dist/decorators/range.d.ts +122 -0
- package/dist/decorators/set-column.d.ts +43 -0
- package/dist/decorators/spatial.d.ts +60 -0
- package/dist/decorators/storage.d.ts +561 -0
- package/dist/decorators/timezone.d.ts +319 -0
- package/dist/decorators/trigger.d.ts +50 -0
- package/dist/decorators/uuid.d.ts +102 -0
- package/dist/decorators/view.d.ts +213 -0
- package/dist/diagrams/chen-diagram.d.ts +70 -0
- package/dist/diagrams/chen-diagram.js +33 -31
- package/dist/diagrams/class-diagram.d.ts +78 -0
- package/dist/diagrams/class-diagram.js +23 -27
- package/dist/diagrams/dependency-diagram.d.ts +82 -0
- package/dist/diagrams/dependency-diagram.js +18 -9
- package/dist/diagrams/er-diagram.d.ts +82 -0
- package/dist/diagrams/er-diagram.js +174 -231
- package/dist/diagrams/flow-diagram.d.ts +70 -0
- package/dist/diagrams/flow-diagram.js +23 -18
- package/dist/diagrams/gantt-diagram.d.ts +67 -0
- package/dist/diagrams/gantt-diagram.js +20 -18
- package/dist/diagrams/index-diagram.d.ts +61 -0
- package/dist/diagrams/index-diagram.js +36 -31
- package/dist/diagrams/index.d.ts +155 -0
- package/dist/diagrams/index.js +7 -1
- package/dist/diagrams/migration-diagram.d.ts +67 -0
- package/dist/diagrams/migration-diagram.js +45 -57
- package/dist/diagrams/model-diagram.d.ts +85 -0
- package/dist/diagrams/model-diagram.js +225 -287
- package/dist/diagrams/package-diagram.d.ts +69 -0
- package/dist/diagrams/package-diagram.js +30 -32
- package/dist/diagrams/palette.d.ts +138 -0
- package/dist/diagrams/palette.js +134 -25
- package/dist/diagrams/relational-diagram.d.ts +82 -0
- package/dist/diagrams/relational-diagram.js +51 -59
- package/dist/diagrams/schemadoc-diagram.d.ts +57 -0
- package/dist/diagrams/schemadoc-diagram.js +36 -28
- package/dist/diagrams/sequence-diagram.d.ts +61 -0
- package/dist/diagrams/sequence-diagram.js +20 -11
- package/dist/diagrams/state-diagram.d.ts +85 -0
- package/dist/diagrams/state-diagram.js +21 -17
- package/dist/diagrams/svg-dom.d.ts +62 -0
- package/dist/diagrams/svg-dom.js +11 -0
- package/dist/diagrams/tree-diagram.d.ts +47 -0
- package/dist/diagrams/tree-diagram.js +19 -10
- package/dist/dialects/clickhouse/index.d.ts +660 -0
- package/dist/dialects/clickhouse/index.js +107 -2
- package/dist/dialects/cockroachdb/index.d.ts +1708 -0
- package/dist/dialects/cockroachdb/index.js +139 -10
- package/dist/dialects/cratedb/index.d.ts +262 -0
- package/dist/dialects/cratedb/index.js +148 -0
- package/dist/dialects/databricks/index.d.ts +397 -0
- package/dist/dialects/databricks/index.js +233 -11
- package/dist/dialects/db2/index.d.ts +729 -0
- package/dist/dialects/db2/index.js +152 -2
- package/dist/dialects/dialect.d.ts +1653 -0
- package/dist/dialects/duckdb/index.d.ts +440 -0
- package/dist/dialects/duckdb/index.js +21 -37
- package/dist/dialects/exasol/index.d.ts +197 -0
- package/dist/dialects/exasol/index.js +14 -0
- package/dist/dialects/firebird/index.d.ts +286 -0
- package/dist/dialects/firebird/index.js +135 -0
- package/dist/dialects/greenplum/index.d.ts +336 -0
- package/dist/dialects/greenplum/index.js +168 -0
- package/dist/dialects/hana/index.d.ts +512 -0
- package/dist/dialects/hana/index.js +17 -35
- package/dist/dialects/mariadb/index.d.ts +1241 -0
- package/dist/dialects/mariadb/index.js +181 -43
- package/dist/dialects/mssql/index.d.ts +729 -0
- package/dist/dialects/mssql/index.js +76 -7
- package/dist/dialects/mysql/index.d.ts +1233 -0
- package/dist/dialects/mysql/index.js +87 -19
- package/dist/dialects/oracle/index.d.ts +1222 -0
- package/dist/dialects/oracle/index.js +210 -9
- package/dist/dialects/postgres/index.d.ts +1598 -0
- package/dist/dialects/postgres/index.js +34 -13
- package/dist/dialects/query-stream-helper.d.ts +58 -0
- package/dist/dialects/questdb/index.d.ts +430 -0
- package/dist/dialects/questdb/index.js +292 -0
- package/dist/dialects/redshift/index.d.ts +933 -0
- package/dist/dialects/redshift/index.js +17 -5
- package/dist/dialects/singlestore/index.d.ts +233 -0
- package/dist/dialects/singlestore/index.js +53 -0
- package/dist/dialects/snowflake/index.d.ts +727 -0
- package/dist/dialects/snowflake/index.js +154 -5
- package/dist/dialects/spanner/index.d.ts +660 -0
- package/dist/dialects/spanner/index.js +43 -21
- package/dist/dialects/sqlite/index.d.ts +1133 -0
- package/dist/dialects/sqlite/index.js +168 -30
- package/dist/dialects/tidb/index.d.ts +226 -0
- package/dist/dialects/tidb/index.js +10 -0
- package/dist/dialects/timescaledb/index.d.ts +286 -0
- package/dist/dialects/timescaledb/index.js +179 -0
- package/dist/dialects/trino/index.d.ts +230 -0
- package/dist/dialects/trino/index.js +85 -10
- package/dist/dialects/turso/index.d.ts +98 -0
- package/dist/dialects/turso/index.js +10 -0
- package/dist/dialects/vertica/index.d.ts +321 -0
- package/dist/dialects/vertica/index.js +161 -0
- package/dist/dialects/yugabytedb/index.d.ts +276 -0
- package/dist/dialects/yugabytedb/index.js +121 -0
- package/dist/errors/index.d.ts +378 -0
- package/dist/errors/index.js +29 -1
- package/dist/errors/utils.d.ts +53 -0
- package/dist/errors.d.ts +5 -0
- package/dist/extensions/catalog/cloud-warehouse-features.d.ts +27 -0
- package/dist/extensions/catalog/mssql-features.d.ts +20 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.d.ts +18 -0
- package/dist/extensions/catalog/oracle-db2-features.d.ts +17 -0
- package/dist/extensions/catalog/postgres-extensions.d.ts +15 -0
- package/dist/extensions/index.d.ts +34 -0
- package/dist/extensions/types.d.ts +43 -0
- package/dist/external-fields/adapters.d.ts +50 -0
- package/dist/external-fields/adapters.js +227 -0
- package/dist/external-fields/decorator.d.ts +77 -0
- package/dist/external-fields/decorator.js +80 -0
- package/dist/external-fields/index.d.ts +10 -0
- package/dist/external-fields/index.js +19 -0
- package/dist/external-fields/runtime.d.ts +39 -0
- package/dist/external-fields/runtime.js +221 -0
- package/dist/foreign-data.d.ts +168 -0
- package/dist/graph/base-graph-dialect.d.ts +250 -0
- package/dist/graph/base-graph-dialect.js +539 -0
- package/dist/graph/dgraph/index.d.ts +65 -0
- package/dist/graph/dgraph/index.js +559 -0
- package/dist/graph/gremlin/index.d.ts +59 -0
- package/dist/graph/gremlin/index.js +378 -0
- package/dist/graph/index.d.ts +60 -0
- package/dist/graph/index.js +67 -0
- package/dist/graph/neo4j/index.d.ts +50 -0
- package/dist/graph/neo4j/index.js +462 -0
- package/dist/graph/types.d.ts +213 -0
- package/dist/graph/types.js +234 -0
- package/dist/hooks/hooks-manager.d.ts +189 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/index.d.ts +711 -0
- package/dist/index.js +19 -4
- package/dist/logging.d.ts +183 -0
- package/dist/migrations/index.d.ts +9 -0
- package/dist/migrations/migration.d.ts +143 -0
- package/dist/migrations/migrator.d.ts +199 -0
- package/dist/migrations/prormmigration.d.ts +131 -0
- package/dist/migrations/query-interface.d.ts +335 -0
- package/dist/migrations/seeder.d.ts +167 -0
- package/dist/models/associations.d.ts +131 -0
- package/dist/models/associations.js +7 -2
- package/dist/models/constraints.d.ts +175 -0
- package/dist/models/data-types.d.ts +1656 -0
- package/dist/models/decorators.d.ts +328 -0
- package/dist/models/decorators.js +61 -82
- package/dist/models/eager-load.d.ts +86 -0
- package/dist/models/eager-load.js +369 -0
- package/dist/models/index.d.ts +13 -0
- package/dist/models/indexes.d.ts +325 -0
- package/dist/models/methods.d.ts +419 -0
- package/dist/models/model-manager.d.ts +76 -0
- package/dist/models/model.d.ts +820 -0
- package/dist/models/model.js +15 -101
- package/dist/models/operators.d.ts +29 -0
- package/dist/models/scopes.d.ts +71 -0
- package/dist/models/typescript-types.d.ts +177 -0
- package/dist/nosql/aerospike/index.d.ts +126 -0
- package/dist/nosql/allegrograph/index.d.ts +86 -0
- package/dist/nosql/arangodb/index.d.ts +285 -0
- package/dist/nosql/arangodb/index.js +274 -2
- package/dist/nosql/arangodb/where.d.ts +38 -0
- package/dist/nosql/arangodb/where.js +94 -0
- package/dist/nosql/azure-blob/index.d.ts +104 -0
- package/dist/nosql/beanstalkd/index.d.ts +88 -0
- package/dist/nosql/beequeue/index.d.ts +99 -0
- package/dist/nosql/bigchaindb/index.d.ts +113 -0
- package/dist/nosql/bigtable/index.d.ts +144 -0
- package/dist/nosql/blazegraph/index.d.ts +88 -0
- package/dist/nosql/bullmq/index.d.ts +83 -0
- package/dist/nosql/cassandra/index.d.ts +119 -0
- package/dist/nosql/chroma/index.d.ts +151 -0
- package/dist/nosql/cloudflare-kv/index.d.ts +120 -0
- package/dist/nosql/coherence/index.d.ts +91 -0
- package/dist/nosql/cosmosdb/index.d.ts +78 -0
- package/dist/nosql/couchbase/index.d.ts +103 -0
- package/dist/nosql/dax/index.d.ts +118 -0
- package/dist/nosql/deno-kv/index.d.ts +109 -0
- package/dist/nosql/dgraph/index.d.ts +80 -0
- package/dist/nosql/doris/index.d.ts +88 -0
- package/dist/nosql/druid/index.d.ts +95 -0
- package/dist/nosql/dynamodb/index.d.ts +643 -0
- package/dist/nosql/dynamodb/index.js +423 -0
- package/dist/nosql/elasticsearch/index.d.ts +239 -0
- package/dist/nosql/etcd/index.d.ts +243 -0
- package/dist/nosql/eventhubs/index.d.ts +89 -0
- package/dist/nosql/eventstore/index.d.ts +102 -0
- package/dist/nosql/faunadb/index.d.ts +141 -0
- package/dist/nosql/faunadb/index.js +329 -0
- package/dist/nosql/firestore/index.d.ts +67 -0
- package/dist/nosql/fluree/index.d.ts +88 -0
- package/dist/nosql/fuseki/index.d.ts +94 -0
- package/dist/nosql/gcs/index.d.ts +62 -0
- package/dist/nosql/gearman/index.d.ts +77 -0
- package/dist/nosql/geode/index.d.ts +93 -0
- package/dist/nosql/graphdb/index.d.ts +86 -0
- package/dist/nosql/graylog/index.d.ts +118 -0
- package/dist/nosql/gridgain/index.d.ts +78 -0
- package/dist/nosql/hazelcast/index.d.ts +73 -0
- package/dist/nosql/hbase/index.d.ts +123 -0
- package/dist/nosql/ignite/index.d.ts +80 -0
- package/dist/nosql/immudb/index.d.ts +131 -0
- package/dist/nosql/index.d.ts +215 -0
- package/dist/nosql/infinispan/index.d.ts +95 -0
- package/dist/nosql/influxdb/flux-compiler.d.ts +23 -0
- package/dist/nosql/influxdb/flux-compiler.js +170 -0
- package/dist/nosql/influxdb/index.d.ts +300 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.d.ts +113 -0
- package/dist/nosql/keyspaces/index.d.ts +122 -0
- package/dist/nosql/kinesis/index.d.ts +121 -0
- package/dist/nosql/leveldb/index.d.ts +112 -0
- package/dist/nosql/leveldb/index.js +103 -1
- package/dist/nosql/lmdb/index.d.ts +76 -0
- package/dist/nosql/loki/index.d.ts +126 -0
- package/dist/nosql/marklogic/index.d.ts +76 -0
- package/dist/nosql/materialize/index.d.ts +91 -0
- package/dist/nosql/meilisearch/index.d.ts +76 -0
- package/dist/nosql/memcached/index.d.ts +138 -0
- package/dist/nosql/milvus/index.d.ts +167 -0
- package/dist/nosql/minio/index.d.ts +122 -0
- package/dist/nosql/momento/index.d.ts +99 -0
- package/dist/nosql/mongodb/index.d.ts +265 -0
- package/dist/nosql/mongodb/index.js +139 -0
- package/dist/nosql/mongodb/where.d.ts +8 -0
- package/dist/nosql/mongodb/where.js +181 -0
- package/dist/nosql/nats/index.d.ts +139 -0
- package/dist/nosql/nedb/index.d.ts +79 -0
- package/dist/nosql/neo4j/index.d.ts +217 -0
- package/dist/nosql/neo4j/index.js +26 -14
- package/dist/nosql/neptune/index.d.ts +234 -0
- package/dist/nosql/neptune/index.js +23 -9
- package/dist/nosql/nsq/index.d.ts +93 -0
- package/dist/nosql/opensearch/index.d.ts +97 -0
- package/dist/nosql/orientdb/index.d.ts +72 -0
- package/dist/nosql/papertrail/index.d.ts +120 -0
- package/dist/nosql/pinecone/index.d.ts +148 -0
- package/dist/nosql/pinot/index.d.ts +90 -0
- package/dist/nosql/pouchdb/index.d.ts +95 -0
- package/dist/nosql/prometheus/index.d.ts +112 -0
- package/dist/nosql/provendb/index.d.ts +143 -0
- package/dist/nosql/provendb/index.js +262 -0
- package/dist/nosql/pubsub/index.d.ts +83 -0
- package/dist/nosql/pulsar/index.d.ts +105 -0
- package/dist/nosql/qdrant/index.d.ts +231 -0
- package/dist/nosql/qldb/index.d.ts +182 -0
- package/dist/nosql/qldb/index.js +302 -1
- package/dist/nosql/r2/index.d.ts +160 -0
- package/dist/nosql/rabbitmq/index.d.ts +131 -0
- package/dist/nosql/ravendb/index.d.ts +138 -0
- package/dist/nosql/ravendb/index.js +323 -9
- package/dist/nosql/ravendb/where.d.ts +38 -0
- package/dist/nosql/ravendb/where.js +94 -0
- package/dist/nosql/redis/index.d.ts +267 -0
- package/dist/nosql/redis/index.js +19 -5
- package/dist/nosql/redpanda/index.d.ts +117 -0
- package/dist/nosql/resque/index.d.ts +91 -0
- package/dist/nosql/rethinkdb/index.d.ts +194 -0
- package/dist/nosql/rethinkdb/index.js +290 -0
- package/dist/nosql/rethinkdb/where.d.ts +38 -0
- package/dist/nosql/rethinkdb/where.js +94 -0
- package/dist/nosql/rocksdb/document-layer.d.ts +162 -0
- package/dist/nosql/rocksdb/document-layer.js +338 -0
- package/dist/nosql/rocksdb/index.d.ts +112 -0
- package/dist/nosql/rocksdb/index.js +103 -1
- package/dist/nosql/rocksdb/where-match.d.ts +21 -0
- package/dist/nosql/rocksdb/where-match.js +238 -0
- package/dist/nosql/rockset/index.d.ts +84 -0
- package/dist/nosql/s3/index.d.ts +170 -0
- package/dist/nosql/scylladb/index.d.ts +117 -0
- package/dist/nosql/signoz/index.d.ts +116 -0
- package/dist/nosql/sns/index.d.ts +99 -0
- package/dist/nosql/solr/index.d.ts +129 -0
- package/dist/nosql/splunk/index.d.ts +125 -0
- package/dist/nosql/sqs/index.d.ts +116 -0
- package/dist/nosql/stardog/index.d.ts +86 -0
- package/dist/nosql/starrocks/index.d.ts +89 -0
- package/dist/nosql/store.d.ts +23 -0
- package/dist/nosql/sumologic/index.d.ts +119 -0
- package/dist/nosql/surrealdb/index.d.ts +156 -0
- package/dist/nosql/surrealdb/index.js +174 -1
- package/dist/nosql/surrealdb/query-compiler.d.ts +26 -0
- package/dist/nosql/surrealdb/query-compiler.js +193 -0
- package/dist/nosql/terminusdb/index.d.ts +95 -0
- package/dist/nosql/tigergraph/index.d.ts +314 -0
- package/dist/nosql/typesense/index.d.ts +82 -0
- package/dist/nosql/unqlite/index.d.ts +68 -0
- package/dist/nosql/upstash/index.d.ts +80 -0
- package/dist/nosql/vercel-kv/index.d.ts +82 -0
- package/dist/nosql/victoriametrics/index.d.ts +129 -0
- package/dist/nosql/virtuoso/index.d.ts +87 -0
- package/dist/nosql/weaviate/index.d.ts +196 -0
- package/dist/operators/index.d.ts +7 -0
- package/dist/operators.d.ts +2947 -0
- package/dist/operators.js +46 -1
- package/dist/prisma-migrate/index.d.ts +28 -0
- package/dist/prisma-migrate/migration-generator.d.ts +21 -0
- package/dist/prisma-migrate/model-generator.d.ts +12 -0
- package/dist/prisma-migrate/relations.d.ts +28 -0
- package/dist/prisma-migrate/schema-parser.d.ts +42 -0
- package/dist/prisma-migrate/type-mapper.d.ts +20 -0
- package/dist/prorm.d.ts +2093 -0
- package/dist/prorm.js +721 -302
- package/dist/query-builders/cte-builder.d.ts +104 -0
- package/dist/query-builders/functions/aggregate.d.ts +199 -0
- package/dist/query-builders/functions/conditional.d.ts +195 -0
- package/dist/query-builders/functions/datetime.d.ts +202 -0
- package/dist/query-builders/functions/fulltext.d.ts +220 -0
- package/dist/query-builders/functions/index.d.ts +17 -0
- package/dist/query-builders/functions/json.d.ts +157 -0
- package/dist/query-builders/functions/math.d.ts +215 -0
- package/dist/query-builders/functions/string.d.ts +233 -0
- package/dist/query-builders/functions/window.d.ts +209 -0
- package/dist/query-builders/include-builder.d.ts +85 -0
- package/dist/query-builders/index-expression-builder.d.ts +153 -0
- package/dist/query-builders/index.d.ts +121 -0
- package/dist/query-builders/index.js +10 -0
- package/dist/query-builders/insert-builder.d.ts +62 -0
- package/dist/query-builders/model-helpers.d.ts +28 -0
- package/dist/query-builders/order-limit-builder.d.ts +84 -0
- package/dist/query-builders/sql-compiler.d.ts +562 -0
- package/dist/query-builders/subquery-builder.d.ts +133 -0
- package/dist/query-builders/update-builder.d.ts +71 -0
- package/dist/query-builders/view-builder.d.ts +189 -0
- package/dist/query-builders/where-builder.d.ts +124 -0
- package/dist/query-interface.d.ts +407 -0
- package/dist/query-interface.js +84 -0
- package/dist/query-optimizers/batch-optimizer.d.ts +175 -0
- package/dist/query-optimizers/explain-plans.d.ts +187 -0
- package/dist/query-optimizers/index.d.ts +27 -0
- package/dist/query-optimizers/prepared-statement-cache.d.ts +252 -0
- package/dist/query-optimizers/query-hints.d.ts +201 -0
- package/dist/query-optimizers/query-optimizer.d.ts +162 -0
- package/dist/query-optimizers/slow-query-logger.d.ts +186 -0
- package/dist/replica-manager.d.ts +235 -0
- package/dist/schema/index.d.ts +7 -0
- package/dist/schema/migration-generator.d.ts +74 -0
- package/dist/schema/schema-differ.d.ts +114 -0
- package/dist/schema/types.d.ts +246 -0
- package/dist/schema-objects.d.ts +78 -0
- package/dist/schema-objects.js +203 -0
- package/dist/sql-constants.d.ts +240 -0
- package/dist/sqlite-advanced.d.ts +572 -0
- package/dist/streams/index.d.ts +5 -0
- package/dist/streams/transforms.d.ts +120 -0
- package/dist/transaction.d.ts +221 -0
- package/dist/types/index.d.ts +3123 -0
- package/dist/user-management.d.ts +141 -0
- package/dist/utils/date.d.ts +149 -0
- package/dist/utils/index.d.ts +359 -0
- package/dist/utils/string.d.ts +88 -0
- package/dist/validators/index.d.ts +7 -0
- package/dist/validators/validator.d.ts +306 -0
- package/package.json +20 -5
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProvenDB store implementation.
|
|
3
|
+
*
|
|
4
|
+
* ProvenDB is a MongoDB-compatible database that adds immutable, versioned
|
|
5
|
+
* documents plus cryptographic proofs: every write is captured at a
|
|
6
|
+
* monotonically increasing **version**, and ProvenDB can produce a Merkle
|
|
7
|
+
* proof that a document (or a whole query result) existed at a given version,
|
|
8
|
+
* anchored into a public blockchain. That makes it append-only/auditable on
|
|
9
|
+
* top of a familiar document API.
|
|
10
|
+
*
|
|
11
|
+
* ## HTTP proof API over `fetch`
|
|
12
|
+
*
|
|
13
|
+
* While ProvenDB exposes a Mongo wire protocol, its distinguishing feature -
|
|
14
|
+
* versioned documents and proofs - is surfaced here over its REST/HTTP proof
|
|
15
|
+
* API using the global `fetch` (so `library === 'fetch'`), matching the
|
|
16
|
+
* Prometheus store's injectable-client pattern. This class implements the
|
|
17
|
+
* minimal `NoSqlStore` marker interface plus the shared ledger surface:
|
|
18
|
+
* - `append(collection, data)` -> `POST /collections/<c>/documents`.
|
|
19
|
+
* - `get(collection, id)` -> `GET /collections/<c>/documents/<id>`.
|
|
20
|
+
* - `history(collection, id)` -> `GET .../documents/<id>/versions`.
|
|
21
|
+
* - `verify(collection, id)` -> `POST .../documents/<id>/proof` (returns
|
|
22
|
+
* the Merkle proof + blockchain anchor).
|
|
23
|
+
* - `query(filter)` -> `POST /collections/<c>/query`.
|
|
24
|
+
*/
|
|
25
|
+
import { NoSqlStore } from '../store';
|
|
26
|
+
/** Default ProvenDB HTTP API base URL. */
|
|
27
|
+
export declare const DEFAULT_PROVENDB_BASE_URL = "http://localhost:8080";
|
|
28
|
+
/** The subset of an HTTP client this store needs (GET + POST returning JSON). */
|
|
29
|
+
export interface ProvendbHttpClient {
|
|
30
|
+
get(path: string): Promise<any>;
|
|
31
|
+
post(path: string, body?: unknown): Promise<any>;
|
|
32
|
+
}
|
|
33
|
+
/** Connection options for `ProvendbStore`. */
|
|
34
|
+
export interface ProvendbStoreOptions {
|
|
35
|
+
/** Base URL of the ProvenDB HTTP API. Defaults to `http://localhost:8080`. */
|
|
36
|
+
baseURL?: string;
|
|
37
|
+
/** Optional pre-built HTTP client; when provided, `baseURL` is ignored. */
|
|
38
|
+
client?: ProvendbHttpClient;
|
|
39
|
+
/** Extra HTTP headers (e.g. an API token). */
|
|
40
|
+
headers?: Record<string, string>;
|
|
41
|
+
}
|
|
42
|
+
/** Build a `fetch`-backed JSON client for the given base URL. */
|
|
43
|
+
export declare function createProvendbFetchClient(baseURL: string, headers?: Record<string, string>): ProvendbHttpClient;
|
|
44
|
+
/** Sort direction accepted by {@link ProvendbStore.findAll}'s `order`. */
|
|
45
|
+
export type ProvendbOrderDirection = 'ASC' | 'DESC' | 'asc' | 'desc';
|
|
46
|
+
/** Options for {@link ProvendbStore.findAll}/{@link ProvendbStore.findOne}. */
|
|
47
|
+
export interface ProvendbFindOptions {
|
|
48
|
+
/** ORM `where` clause (plain equality and/or `Op`-keyed conditions). */
|
|
49
|
+
where?: Record<string, any>;
|
|
50
|
+
/** Restrict returned fields, e.g. `['name', 'email']` (Mongo projection). */
|
|
51
|
+
attributes?: string[];
|
|
52
|
+
/** Ordering, e.g. `[['age', 'DESC'], ['name', 'ASC']]`. */
|
|
53
|
+
order?: Array<[string, ProvendbOrderDirection]>;
|
|
54
|
+
/** Maximum number of documents to return. */
|
|
55
|
+
limit?: number;
|
|
56
|
+
/** Number of documents to skip. */
|
|
57
|
+
offset?: number;
|
|
58
|
+
/**
|
|
59
|
+
* Read the collection as of a historical ProvenDB `version` (its
|
|
60
|
+
* versioned/point-in-time feature) instead of the current state.
|
|
61
|
+
*/
|
|
62
|
+
version?: number | string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* `ProvendbStore` wraps ProvenDB's HTTP proof/document API behind the shared
|
|
66
|
+
* ledger surface.
|
|
67
|
+
*/
|
|
68
|
+
export declare class ProvendbStore implements NoSqlStore {
|
|
69
|
+
readonly name = "provendb";
|
|
70
|
+
readonly library = "fetch";
|
|
71
|
+
private readonly baseURL;
|
|
72
|
+
private readonly injectedClient?;
|
|
73
|
+
private readonly headers?;
|
|
74
|
+
private client;
|
|
75
|
+
private connected;
|
|
76
|
+
constructor(options?: ProvendbStoreOptions);
|
|
77
|
+
connect(): Promise<void>;
|
|
78
|
+
disconnect(): Promise<void>;
|
|
79
|
+
isConnected(): boolean;
|
|
80
|
+
/** Returns the underlying (internal or injected) HTTP client. */
|
|
81
|
+
getClient(): ProvendbHttpClient;
|
|
82
|
+
private requireClient;
|
|
83
|
+
private call;
|
|
84
|
+
/**
|
|
85
|
+
* Insert `data` into `collection` at a new version
|
|
86
|
+
* (`POST /collections/<c>/documents`). Returns the inserted document
|
|
87
|
+
* (including its `_id` and `_version`).
|
|
88
|
+
*/
|
|
89
|
+
append(collection: string, data: Record<string, unknown>): Promise<unknown>;
|
|
90
|
+
/** Read the current version of document `id` from `collection`. */
|
|
91
|
+
get(collection: string, id: string): Promise<unknown>;
|
|
92
|
+
/** Return every version of document `id` (`GET .../documents/<id>/versions`). */
|
|
93
|
+
history(collection: string, id: string): Promise<unknown>;
|
|
94
|
+
/**
|
|
95
|
+
* Request a cryptographic proof for document `id`
|
|
96
|
+
* (`POST .../documents/<id>/proof`). The returned object contains the
|
|
97
|
+
* Merkle proof and the public-blockchain anchor that tamper-proofs the
|
|
98
|
+
* document's state at its version.
|
|
99
|
+
*/
|
|
100
|
+
verify(collection: string, id: string): Promise<unknown>;
|
|
101
|
+
/**
|
|
102
|
+
* Run a Mongo-style filter query against `collection`
|
|
103
|
+
* (`POST /collections/<c>/query`). `query` is the Mongo filter document;
|
|
104
|
+
* `options` carries projection/sort/limit and an optional historical
|
|
105
|
+
* `version`.
|
|
106
|
+
*/
|
|
107
|
+
query(collection: string, query?: Record<string, unknown>, options?: Record<string, unknown>): Promise<unknown>;
|
|
108
|
+
/**
|
|
109
|
+
* Fetch every document in `collection` matching the ORM `where` clause. The
|
|
110
|
+
* `where` is compiled to a MongoDB filter; `attributes`/`order`/`limit`/
|
|
111
|
+
* `offset` become the `projection`/`sort`/`limit`/`skip` query options, and
|
|
112
|
+
* `version` (if given) reads the collection at a historical ProvenDB
|
|
113
|
+
* version.
|
|
114
|
+
*/
|
|
115
|
+
findAll<T = Record<string, unknown>>(collection: string, options?: ProvendbFindOptions): Promise<T[]>;
|
|
116
|
+
/** Fetch the first document matching `where` (Mongo `limit 1`), or `null`. */
|
|
117
|
+
findOne<T = Record<string, unknown>>(collection: string, options?: ProvendbFindOptions): Promise<T | null>;
|
|
118
|
+
/** Count documents in `collection` matching `where`. */
|
|
119
|
+
count(collection: string, where?: Record<string, any>): Promise<number>;
|
|
120
|
+
/** Insert `data` as a new versioned document. Alias of {@link append}. */
|
|
121
|
+
create(collection: string, data: Record<string, unknown>): Promise<unknown>;
|
|
122
|
+
/** Insert many documents (one versioned write per document), returning them. */
|
|
123
|
+
bulkCreate(collection: string, docs: Array<Record<string, unknown>>): Promise<unknown[]>;
|
|
124
|
+
/**
|
|
125
|
+
* Update every document matching `where`, `$set`ting each key in `values`.
|
|
126
|
+
* Returns the raw ProvenDB response (which records the new version the
|
|
127
|
+
* write was captured at).
|
|
128
|
+
*/
|
|
129
|
+
update(collection: string, values: Record<string, unknown>, where?: Record<string, any>, options?: {
|
|
130
|
+
upsert?: boolean;
|
|
131
|
+
}): Promise<unknown>;
|
|
132
|
+
/**
|
|
133
|
+
* Insert-or-update: update documents matching `where` with `data`, creating
|
|
134
|
+
* a new document if none match (`upsert: true`).
|
|
135
|
+
*/
|
|
136
|
+
upsert(collection: string, data: Record<string, unknown>, where: Record<string, any>): Promise<unknown>;
|
|
137
|
+
/**
|
|
138
|
+
* Delete every document matching `where`. ProvenDB retains prior versions,
|
|
139
|
+
* so deleted documents remain recoverable via {@link history}.
|
|
140
|
+
*/
|
|
141
|
+
destroy(collection: string, where?: Record<string, any>): Promise<unknown>;
|
|
142
|
+
}
|
|
143
|
+
export default ProvendbStore;
|
|
@@ -51,6 +51,182 @@ function createProvendbFetchClient(baseURL, headers) {
|
|
|
51
51
|
},
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
+
/** Parse an ORM `where` object (string + `Op` symbol keys) into a tree. */
|
|
55
|
+
function parseWhere(where) {
|
|
56
|
+
if (!where || typeof where !== 'object')
|
|
57
|
+
return null;
|
|
58
|
+
const nodes = [];
|
|
59
|
+
for (const sym of Object.getOwnPropertySymbols(where)) {
|
|
60
|
+
const name = sym.description;
|
|
61
|
+
const val = where[sym];
|
|
62
|
+
if (name === 'and' && Array.isArray(val)) {
|
|
63
|
+
nodes.push({ kind: 'and', nodes: val.map(parseWhere).filter(Boolean) });
|
|
64
|
+
}
|
|
65
|
+
else if (name === 'or' && Array.isArray(val)) {
|
|
66
|
+
nodes.push({ kind: 'or', nodes: val.map(parseWhere).filter(Boolean) });
|
|
67
|
+
}
|
|
68
|
+
else if (name === 'not') {
|
|
69
|
+
const inner = parseWhere(val);
|
|
70
|
+
if (inner)
|
|
71
|
+
nodes.push({ kind: 'not', node: inner });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const field of Object.keys(where)) {
|
|
75
|
+
nodes.push(parseFieldCondition(field, where[field]));
|
|
76
|
+
}
|
|
77
|
+
const flat = nodes.filter(Boolean);
|
|
78
|
+
if (flat.length === 0)
|
|
79
|
+
return null;
|
|
80
|
+
return flat.length === 1 ? flat[0] : { kind: 'and', nodes: flat };
|
|
81
|
+
}
|
|
82
|
+
/** Parse the value for a single field into a comparison (or AND of them). */
|
|
83
|
+
function parseFieldCondition(field, value) {
|
|
84
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
85
|
+
const symbols = Object.getOwnPropertySymbols(value);
|
|
86
|
+
if (symbols.length > 0) {
|
|
87
|
+
const cmps = symbols.map((sym) => ({
|
|
88
|
+
kind: 'cmp',
|
|
89
|
+
field,
|
|
90
|
+
op: sym.description ?? 'eq',
|
|
91
|
+
value: value[sym],
|
|
92
|
+
}));
|
|
93
|
+
return cmps.length === 1 ? cmps[0] : { kind: 'and', nodes: cmps };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return { kind: 'cmp', field, op: value === null ? 'isNull' : 'eq', value };
|
|
97
|
+
}
|
|
98
|
+
/** Escape a string for safe embedding in a MongoDB `$regex` pattern. */
|
|
99
|
+
function escapeRegex(value) {
|
|
100
|
+
return String(value).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
101
|
+
}
|
|
102
|
+
/** Convert a SQL `LIKE` pattern (`%`/`_` wildcards) to a Mongo regex source. */
|
|
103
|
+
function likeToRegex(pattern) {
|
|
104
|
+
let out = '^';
|
|
105
|
+
for (const ch of String(pattern)) {
|
|
106
|
+
if (ch === '%')
|
|
107
|
+
out += '.*';
|
|
108
|
+
else if (ch === '_')
|
|
109
|
+
out += '.';
|
|
110
|
+
else
|
|
111
|
+
out += ch.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
112
|
+
}
|
|
113
|
+
return out + '$';
|
|
114
|
+
}
|
|
115
|
+
/** Render a normalized tree to a MongoDB filter document. */
|
|
116
|
+
function compileMongoFilter(node) {
|
|
117
|
+
if (!node)
|
|
118
|
+
return {};
|
|
119
|
+
switch (node.kind) {
|
|
120
|
+
case 'and': {
|
|
121
|
+
const parts = node.nodes.map(compileMongoFilter).filter((p) => Object.keys(p).length > 0);
|
|
122
|
+
return parts.length === 0 ? {} : parts.length === 1 ? parts[0] : { $and: parts };
|
|
123
|
+
}
|
|
124
|
+
case 'or': {
|
|
125
|
+
const parts = node.nodes.map(compileMongoFilter);
|
|
126
|
+
return { $or: parts };
|
|
127
|
+
}
|
|
128
|
+
case 'not':
|
|
129
|
+
return { $nor: [compileMongoFilter(node.node)] };
|
|
130
|
+
case 'cmp':
|
|
131
|
+
return compileMongoCmp(node.field, node.op, node.value);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function compileMongoCmp(field, op, value) {
|
|
135
|
+
switch (op) {
|
|
136
|
+
case 'eq':
|
|
137
|
+
return { [field]: value };
|
|
138
|
+
case 'ne':
|
|
139
|
+
return { [field]: { $ne: value } };
|
|
140
|
+
case 'gt':
|
|
141
|
+
return { [field]: { $gt: value } };
|
|
142
|
+
case 'gte':
|
|
143
|
+
return { [field]: { $gte: value } };
|
|
144
|
+
case 'lt':
|
|
145
|
+
return { [field]: { $lt: value } };
|
|
146
|
+
case 'lte':
|
|
147
|
+
return { [field]: { $lte: value } };
|
|
148
|
+
case 'in':
|
|
149
|
+
return { [field]: { $in: value ?? [] } };
|
|
150
|
+
case 'notIn':
|
|
151
|
+
return { [field]: { $nin: value ?? [] } };
|
|
152
|
+
case 'between': {
|
|
153
|
+
const [a, b] = value;
|
|
154
|
+
return { [field]: { $gte: a, $lte: b } };
|
|
155
|
+
}
|
|
156
|
+
case 'notBetween': {
|
|
157
|
+
const [a, b] = value;
|
|
158
|
+
return { [field]: { $not: { $gte: a, $lte: b } } };
|
|
159
|
+
}
|
|
160
|
+
case 'like':
|
|
161
|
+
return { [field]: { $regex: likeToRegex(value) } };
|
|
162
|
+
case 'notLike':
|
|
163
|
+
return { [field]: { $not: { $regex: likeToRegex(value) } } };
|
|
164
|
+
case 'iLike':
|
|
165
|
+
return { [field]: { $regex: likeToRegex(value), $options: 'i' } };
|
|
166
|
+
case 'notILike':
|
|
167
|
+
return { [field]: { $not: { $regex: likeToRegex(value), $options: 'i' } } };
|
|
168
|
+
case 'startsWith':
|
|
169
|
+
return { [field]: { $regex: `^${escapeRegex(value)}` } };
|
|
170
|
+
case 'notStartsWith':
|
|
171
|
+
return { [field]: { $not: { $regex: `^${escapeRegex(value)}` } } };
|
|
172
|
+
case 'endsWith':
|
|
173
|
+
return { [field]: { $regex: `${escapeRegex(value)}$` } };
|
|
174
|
+
case 'notEndsWith':
|
|
175
|
+
return { [field]: { $not: { $regex: `${escapeRegex(value)}$` } } };
|
|
176
|
+
case 'substring':
|
|
177
|
+
return { [field]: { $regex: escapeRegex(value) } };
|
|
178
|
+
case 'notSubstring':
|
|
179
|
+
return { [field]: { $not: { $regex: escapeRegex(value) } } };
|
|
180
|
+
case 'regexp':
|
|
181
|
+
return { [field]: { $regex: String(value) } };
|
|
182
|
+
case 'notRegexp':
|
|
183
|
+
return { [field]: { $not: { $regex: String(value) } } };
|
|
184
|
+
case 'iRegexp':
|
|
185
|
+
return { [field]: { $regex: String(value), $options: 'i' } };
|
|
186
|
+
case 'notIRegexp':
|
|
187
|
+
return { [field]: { $not: { $regex: String(value), $options: 'i' } } };
|
|
188
|
+
case 'isNull':
|
|
189
|
+
return { [field]: { $eq: null } };
|
|
190
|
+
case 'isNotNull':
|
|
191
|
+
return { [field]: { $ne: null } };
|
|
192
|
+
case 'contains':
|
|
193
|
+
case 'arrayContains':
|
|
194
|
+
return { [field]: { $all: Array.isArray(value) ? value : [value] } };
|
|
195
|
+
default:
|
|
196
|
+
throw new errors_1.DatabaseError(`ProvenDB ORM layer does not support operator "${op}" for field "${field}"`, { code: 'QUERY_ERROR' });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/** Build a Mongo projection object from an ORM `attributes` list. */
|
|
200
|
+
function toProjection(attributes) {
|
|
201
|
+
if (!attributes || attributes.length === 0)
|
|
202
|
+
return undefined;
|
|
203
|
+
const projection = {};
|
|
204
|
+
for (const attr of attributes)
|
|
205
|
+
projection[attr] = 1;
|
|
206
|
+
return projection;
|
|
207
|
+
}
|
|
208
|
+
/** Build a Mongo sort object from an ORM `order` list. */
|
|
209
|
+
function toSort(order) {
|
|
210
|
+
if (!order || order.length === 0)
|
|
211
|
+
return undefined;
|
|
212
|
+
const sort = {};
|
|
213
|
+
for (const [field, dir] of order)
|
|
214
|
+
sort[field] = dir.toUpperCase() === 'DESC' ? -1 : 1;
|
|
215
|
+
return sort;
|
|
216
|
+
}
|
|
217
|
+
/** Normalize a ProvenDB query response into a plain array of documents. */
|
|
218
|
+
function extractDocs(res) {
|
|
219
|
+
if (Array.isArray(res))
|
|
220
|
+
return res;
|
|
221
|
+
if (res && typeof res === 'object') {
|
|
222
|
+
const obj = res;
|
|
223
|
+
for (const key of ['documents', 'data', 'results', 'items']) {
|
|
224
|
+
if (Array.isArray(obj[key]))
|
|
225
|
+
return obj[key];
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return [];
|
|
229
|
+
}
|
|
54
230
|
/**
|
|
55
231
|
* `ProvendbStore` wraps ProvenDB's HTTP proof/document API behind the shared
|
|
56
232
|
* ledger surface.
|
|
@@ -142,6 +318,92 @@ class ProvendbStore {
|
|
|
142
318
|
async query(collection, query = {}, options) {
|
|
143
319
|
return this.call('query', (client) => client.post(`/collections/${encodeURIComponent(collection)}/query`, { query, options }));
|
|
144
320
|
}
|
|
321
|
+
// ---------------------------------------------------------------------
|
|
322
|
+
// ORM model surface (no hand-written Mongo filters needed)
|
|
323
|
+
// ---------------------------------------------------------------------
|
|
324
|
+
/**
|
|
325
|
+
* Fetch every document in `collection` matching the ORM `where` clause. The
|
|
326
|
+
* `where` is compiled to a MongoDB filter; `attributes`/`order`/`limit`/
|
|
327
|
+
* `offset` become the `projection`/`sort`/`limit`/`skip` query options, and
|
|
328
|
+
* `version` (if given) reads the collection at a historical ProvenDB
|
|
329
|
+
* version.
|
|
330
|
+
*/
|
|
331
|
+
async findAll(collection, options = {}) {
|
|
332
|
+
const filter = compileMongoFilter(parseWhere(options.where));
|
|
333
|
+
const queryOptions = {};
|
|
334
|
+
const projection = toProjection(options.attributes);
|
|
335
|
+
const sort = toSort(options.order);
|
|
336
|
+
if (projection)
|
|
337
|
+
queryOptions.projection = projection;
|
|
338
|
+
if (sort)
|
|
339
|
+
queryOptions.sort = sort;
|
|
340
|
+
if (typeof options.limit === 'number')
|
|
341
|
+
queryOptions.limit = options.limit;
|
|
342
|
+
if (typeof options.offset === 'number')
|
|
343
|
+
queryOptions.skip = options.offset;
|
|
344
|
+
if (options.version !== undefined)
|
|
345
|
+
queryOptions.version = options.version;
|
|
346
|
+
const res = await this.query(collection, filter, queryOptions);
|
|
347
|
+
return extractDocs(res);
|
|
348
|
+
}
|
|
349
|
+
/** Fetch the first document matching `where` (Mongo `limit 1`), or `null`. */
|
|
350
|
+
async findOne(collection, options = {}) {
|
|
351
|
+
const rows = await this.findAll(collection, { ...options, limit: 1 });
|
|
352
|
+
return rows[0] ?? null;
|
|
353
|
+
}
|
|
354
|
+
/** Count documents in `collection` matching `where`. */
|
|
355
|
+
async count(collection, where) {
|
|
356
|
+
const filter = compileMongoFilter(parseWhere(where));
|
|
357
|
+
const res = await this.call('count', (client) => client.post(`/collections/${encodeURIComponent(collection)}/count`, { query: filter }));
|
|
358
|
+
if (typeof res === 'number')
|
|
359
|
+
return res;
|
|
360
|
+
const obj = (res ?? {});
|
|
361
|
+
const n = obj.count ?? obj.n ?? obj.total;
|
|
362
|
+
return typeof n === 'number' ? n : extractDocs(res).length;
|
|
363
|
+
}
|
|
364
|
+
/** Insert `data` as a new versioned document. Alias of {@link append}. */
|
|
365
|
+
async create(collection, data) {
|
|
366
|
+
return this.append(collection, data);
|
|
367
|
+
}
|
|
368
|
+
/** Insert many documents (one versioned write per document), returning them. */
|
|
369
|
+
async bulkCreate(collection, docs) {
|
|
370
|
+
const out = [];
|
|
371
|
+
for (const doc of docs) {
|
|
372
|
+
out.push(await this.append(collection, doc));
|
|
373
|
+
}
|
|
374
|
+
return out;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Update every document matching `where`, `$set`ting each key in `values`.
|
|
378
|
+
* Returns the raw ProvenDB response (which records the new version the
|
|
379
|
+
* write was captured at).
|
|
380
|
+
*/
|
|
381
|
+
async update(collection, values, where, options = {}) {
|
|
382
|
+
const filter = compileMongoFilter(parseWhere(where));
|
|
383
|
+
return this.call('update', (client) => client.post(`/collections/${encodeURIComponent(collection)}/update`, {
|
|
384
|
+
query: filter,
|
|
385
|
+
update: { $set: values },
|
|
386
|
+
options: { multi: true, upsert: options.upsert ?? false },
|
|
387
|
+
}));
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Insert-or-update: update documents matching `where` with `data`, creating
|
|
391
|
+
* a new document if none match (`upsert: true`).
|
|
392
|
+
*/
|
|
393
|
+
async upsert(collection, data, where) {
|
|
394
|
+
return this.update(collection, data, where, { upsert: true });
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Delete every document matching `where`. ProvenDB retains prior versions,
|
|
398
|
+
* so deleted documents remain recoverable via {@link history}.
|
|
399
|
+
*/
|
|
400
|
+
async destroy(collection, where) {
|
|
401
|
+
const filter = compileMongoFilter(parseWhere(where));
|
|
402
|
+
return this.call('destroy', (client) => client.post(`/collections/${encodeURIComponent(collection)}/delete`, {
|
|
403
|
+
query: filter,
|
|
404
|
+
options: { multi: true },
|
|
405
|
+
}));
|
|
406
|
+
}
|
|
145
407
|
}
|
|
146
408
|
exports.ProvendbStore = ProvendbStore;
|
|
147
409
|
exports.default = ProvendbStore;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { NoSqlStore } from '../store';
|
|
2
|
+
/** A message accepted by `publish()`: raw string/Buffer or a JSON-serializable value. */
|
|
3
|
+
export type PubSubMessage = string | Buffer | Record<string, unknown> | unknown[];
|
|
4
|
+
/** Minimal structural view of a Pub/Sub `Topic`. */
|
|
5
|
+
export interface PubSubTopicLike {
|
|
6
|
+
publishMessage(message: {
|
|
7
|
+
data?: Buffer;
|
|
8
|
+
attributes?: Record<string, string>;
|
|
9
|
+
}): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
/** Minimal structural view of a Pub/Sub `Subscription`. */
|
|
12
|
+
export interface PubSubSubscriptionLike {
|
|
13
|
+
on(event: string, listener: (...args: any[]) => void): PubSubSubscriptionLike;
|
|
14
|
+
removeAllListeners?(event?: string): void;
|
|
15
|
+
close?(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/** Minimal structural view of a `@google-cloud/pubsub` `PubSub` client. */
|
|
18
|
+
export interface PubSubClientLike {
|
|
19
|
+
topic(name: string): PubSubTopicLike;
|
|
20
|
+
subscription(name: string): PubSubSubscriptionLike;
|
|
21
|
+
createTopic(name: string): Promise<any>;
|
|
22
|
+
createSubscription(topic: string, name: string, options?: unknown): Promise<any>;
|
|
23
|
+
close?(): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/** Connection options for `PubSubStore`. */
|
|
26
|
+
export interface PubSubStoreOptions {
|
|
27
|
+
/** GCP project id. */
|
|
28
|
+
projectId?: string;
|
|
29
|
+
/** Path to a service-account key file. */
|
|
30
|
+
keyFilename?: string;
|
|
31
|
+
/** Override the API endpoint (e.g. 'localhost:8085' for the emulator). */
|
|
32
|
+
apiEndpoint?: string;
|
|
33
|
+
/**
|
|
34
|
+
* A pre-built `PubSub` client (or a mock exposing the methods above). When
|
|
35
|
+
* provided, `connect()` uses it directly and does NOT require the driver —
|
|
36
|
+
* this is how tests inject a mock client.
|
|
37
|
+
*/
|
|
38
|
+
client?: PubSubClientLike;
|
|
39
|
+
}
|
|
40
|
+
/** A handle returned by `subscribe()`; call `stop()` to detach the listener. */
|
|
41
|
+
export interface PubSubSubscription {
|
|
42
|
+
stop(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* `PubSubStore` wraps a `@google-cloud/pubsub` client and exposes topic
|
|
46
|
+
* publishing, subscription listening, and topic/subscription administration.
|
|
47
|
+
*/
|
|
48
|
+
export declare class PubSubStore implements NoSqlStore {
|
|
49
|
+
readonly name = "pubsub";
|
|
50
|
+
readonly library = "@google-cloud/pubsub";
|
|
51
|
+
private readonly options;
|
|
52
|
+
private client;
|
|
53
|
+
private connected;
|
|
54
|
+
/** Subscription objects that have live listeners, tracked for `disconnect()`. */
|
|
55
|
+
private readonly subscriptions;
|
|
56
|
+
constructor(options?: PubSubStoreOptions);
|
|
57
|
+
connect(): Promise<void>;
|
|
58
|
+
disconnect(): Promise<void>;
|
|
59
|
+
isConnected(): boolean;
|
|
60
|
+
/** Returns the underlying `PubSub` client for anything not wrapped here. */
|
|
61
|
+
getClient(): PubSubClientLike;
|
|
62
|
+
private requireClient;
|
|
63
|
+
private wrapError;
|
|
64
|
+
/**
|
|
65
|
+
* Publish one `message` to `topic` via `topic(name).publishMessage`. The
|
|
66
|
+
* message is encoded per the module's rules (string → UTF-8, Buffer → as-is,
|
|
67
|
+
* else JSON). Returns the server-assigned message id.
|
|
68
|
+
*/
|
|
69
|
+
publish(topic: string, message: PubSubMessage, attributes?: Record<string, string>): Promise<string>;
|
|
70
|
+
/** `createTopic` — create a new topic. */
|
|
71
|
+
createTopic(name: string): Promise<void>;
|
|
72
|
+
/** `createSubscription` — attach a new subscription `name` to `topic`. */
|
|
73
|
+
createSubscription(topic: string, name: string, options?: unknown): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Subscribe to `subscription`, invoking `handler` for each streamed message
|
|
76
|
+
* (the driver's `Message` object; call `.ack()` / `.nack()` on it). Attaches
|
|
77
|
+
* a `'message'` listener via `subscription(name).on('message', ...)` and
|
|
78
|
+
* returns a subscription handle whose `stop()` detaches the listener; it is
|
|
79
|
+
* also tracked so `disconnect()` detaches it.
|
|
80
|
+
*/
|
|
81
|
+
subscribe(subscription: string, handler: (message: any) => void | Promise<void>): Promise<PubSubSubscription>;
|
|
82
|
+
}
|
|
83
|
+
export default PubSubStore;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apache Pulsar store implementation.
|
|
3
|
+
*
|
|
4
|
+
* Pulsar is a distributed pub/sub messaging and streaming platform. It has no
|
|
5
|
+
* query language and does not fit the SQL-shaped `Dialect` interface, so this
|
|
6
|
+
* class implements the minimal `NoSqlStore` marker interface and exposes
|
|
7
|
+
* Pulsar's real operations - producing to topics, subscribing consumers, and
|
|
8
|
+
* creating readers - instead of forcing everything into a `query(sql)` shape.
|
|
9
|
+
*
|
|
10
|
+
* Uses the `pulsar-client` driver. `pulsar-client` is loaded lazily inside
|
|
11
|
+
* `connect()` (or supplied pre-built via `options.client`) so importing this
|
|
12
|
+
* module does not require the driver to be installed.
|
|
13
|
+
*
|
|
14
|
+
* ## Message serialization
|
|
15
|
+
*
|
|
16
|
+
* Pulsar sends and receives raw bytes. `produce()` accepts a `string` or a
|
|
17
|
+
* `Buffer`: strings are UTF-8 encoded to a `Buffer` and Buffers are passed
|
|
18
|
+
* through untouched, then handed to the producer as `{ data: Buffer }`.
|
|
19
|
+
* Consumers receive Pulsar `Message` objects; use `msg.getData()` to read the
|
|
20
|
+
* raw bytes back.
|
|
21
|
+
*/
|
|
22
|
+
import { NoSqlStore } from '../store';
|
|
23
|
+
/**
|
|
24
|
+
* Connection options for `PulsarStore`.
|
|
25
|
+
*
|
|
26
|
+
* Mirrors the `pulsar-client` `Client` constructor options. `serviceUrl` is
|
|
27
|
+
* the Pulsar broker URL, e.g. `pulsar://localhost:6650`. A pre-built
|
|
28
|
+
* `pulsar-client` `Client` instance can be injected via `client`, in which
|
|
29
|
+
* case `connect()` uses it directly and skips loading the driver (this is how
|
|
30
|
+
* tests inject a mock).
|
|
31
|
+
*/
|
|
32
|
+
export interface PulsarStoreOptions {
|
|
33
|
+
/** Pulsar broker service URL, e.g. `pulsar://localhost:6650`. */
|
|
34
|
+
serviceUrl?: string;
|
|
35
|
+
/**
|
|
36
|
+
* A pre-built `pulsar-client` `Client` instance. When provided, `connect()`
|
|
37
|
+
* uses it directly and does not `require('pulsar-client')`.
|
|
38
|
+
*/
|
|
39
|
+
client?: any;
|
|
40
|
+
/** Any additional `pulsar-client` `Client` options passed straight through. */
|
|
41
|
+
[key: string]: unknown;
|
|
42
|
+
}
|
|
43
|
+
/** A message body to produce: a UTF-8 string or raw bytes. */
|
|
44
|
+
export type PulsarMessage = string | Buffer;
|
|
45
|
+
/** Options for `subscribe()`. */
|
|
46
|
+
export interface SubscribeOptions {
|
|
47
|
+
/** Subscription type, e.g. 'Exclusive' | 'Shared' | 'Failover' | 'KeyShared'. */
|
|
48
|
+
subscriptionType?: string;
|
|
49
|
+
[key: string]: unknown;
|
|
50
|
+
}
|
|
51
|
+
/** Options for `createReader()`. */
|
|
52
|
+
export interface ReaderOptions {
|
|
53
|
+
/** Where the reader starts, e.g. Pulsar's `MessageId.earliest()` / `latest()`. */
|
|
54
|
+
startMessageId?: unknown;
|
|
55
|
+
[key: string]: unknown;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* `PulsarStore` wraps a `pulsar-client` `Client` and exposes Pulsar's core
|
|
59
|
+
* operations: producing messages, consumer subscriptions, and readers.
|
|
60
|
+
*/
|
|
61
|
+
export declare class PulsarStore implements NoSqlStore {
|
|
62
|
+
readonly name = "pulsar";
|
|
63
|
+
readonly library = "pulsar-client";
|
|
64
|
+
private readonly options;
|
|
65
|
+
private client;
|
|
66
|
+
/** One cached producer per topic, so repeated `produce()` calls reuse it. */
|
|
67
|
+
private readonly producers;
|
|
68
|
+
/** Consumers created via `subscribe()`, tracked so `disconnect()` can close them. */
|
|
69
|
+
private readonly consumers;
|
|
70
|
+
/** Readers created via `createReader()`, tracked so `disconnect()` can close them. */
|
|
71
|
+
private readonly readers;
|
|
72
|
+
/** Set false on `disconnect()` to stop live `subscribe()` receive loops. */
|
|
73
|
+
private receiving;
|
|
74
|
+
private connected;
|
|
75
|
+
constructor(options?: PulsarStoreOptions);
|
|
76
|
+
connect(): Promise<void>;
|
|
77
|
+
disconnect(): Promise<void>;
|
|
78
|
+
isConnected(): boolean;
|
|
79
|
+
/** Returns the underlying `pulsar-client` `Client` for anything not wrapped here. */
|
|
80
|
+
getClient(): any;
|
|
81
|
+
private requireClient;
|
|
82
|
+
/**
|
|
83
|
+
* Produce `message` to `topic`. The producer for a topic is created on first
|
|
84
|
+
* use and cached, so repeated `produce()` calls to the same topic reuse it.
|
|
85
|
+
* `message` may be a UTF-8 `string` or a `Buffer`; it is serialized to raw
|
|
86
|
+
* bytes and sent as `{ data: Buffer }`. Returns the producer's send result.
|
|
87
|
+
*/
|
|
88
|
+
produce(topic: string, message: PulsarMessage): Promise<any>;
|
|
89
|
+
/**
|
|
90
|
+
* Subscribe a consumer to `topic` under `subscription` and invoke `handler`
|
|
91
|
+
* for every received message. Runs a background receive loop that calls
|
|
92
|
+
* `consumer.receive()`, passes each message to `handler`, then
|
|
93
|
+
* acknowledges it with `consumer.acknowledge(msg)`. The loop stops on
|
|
94
|
+
* `disconnect()`. The consumer is tracked so `disconnect()` closes it.
|
|
95
|
+
* Returns the created consumer.
|
|
96
|
+
*/
|
|
97
|
+
subscribe(topic: string, subscription: string, handler: (msg: any) => Promise<void> | void, options?: SubscribeOptions): Promise<any>;
|
|
98
|
+
/**
|
|
99
|
+
* Create a Pulsar reader over `topic`. Readers give non-destructive,
|
|
100
|
+
* position-controlled reads (no subscription/acks). The reader is tracked so
|
|
101
|
+
* `disconnect()` closes it. Returns the created reader.
|
|
102
|
+
*/
|
|
103
|
+
createReader(topic: string, options?: ReaderOptions): Promise<any>;
|
|
104
|
+
}
|
|
105
|
+
export default PulsarStore;
|