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,559 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dgraph graph dialect — DQL (GraphQL+-) queries + JSON mutations for the
|
|
4
|
+
* ORM builder API.
|
|
5
|
+
*
|
|
6
|
+
* Maps the ORM model API onto Dgraph's uid/predicate/edge model: node labels
|
|
7
|
+
* become `dgraph.type` values, finds become DQL `func: type(...)` blocks with
|
|
8
|
+
* `@filter(...)` and `expand(_all_)`, associations become edge predicates
|
|
9
|
+
* (reverse edges via `~pred` for inbound), and writes become JSON
|
|
10
|
+
* set/delete mutations (upserts resolve uids first, then mutate). Reads are
|
|
11
|
+
* parameterized with typed DQL vars (`$p0`); mutations carry structured JSON
|
|
12
|
+
* data (no string interpolation). Users never hand-write DQL/GraphQL for
|
|
13
|
+
* standard operations.
|
|
14
|
+
*
|
|
15
|
+
* Built on the optional `dgraph-js` gRPC driver, loaded lazily; a pre-built
|
|
16
|
+
* client can be injected via `options.client`.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.DgraphGraphDialect = void 0;
|
|
20
|
+
const index_1 = require("../../errors/index");
|
|
21
|
+
const types_1 = require("../../types");
|
|
22
|
+
const base_graph_dialect_1 = require("../base-graph-dialect");
|
|
23
|
+
const types_2 = require("../types");
|
|
24
|
+
const MUT_PREFIX = '#DGRAPH-MUTATE#';
|
|
25
|
+
function dqlString(value) {
|
|
26
|
+
return JSON.stringify(String(value));
|
|
27
|
+
}
|
|
28
|
+
function dqlLiteral(value) {
|
|
29
|
+
if (value === null || value === undefined)
|
|
30
|
+
return '""';
|
|
31
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
32
|
+
return String(value);
|
|
33
|
+
return dqlString(value);
|
|
34
|
+
}
|
|
35
|
+
function dqlType(value) {
|
|
36
|
+
if (typeof value === 'number')
|
|
37
|
+
return Number.isInteger(value) ? 'int' : 'float';
|
|
38
|
+
if (typeof value === 'boolean')
|
|
39
|
+
return 'bool';
|
|
40
|
+
return 'string';
|
|
41
|
+
}
|
|
42
|
+
function regexBody(value) {
|
|
43
|
+
return String(value).replace(/\//g, '\\/');
|
|
44
|
+
}
|
|
45
|
+
function likeToRegexBody(value) {
|
|
46
|
+
// Escape regex metacharacters AND the `/` delimiter — the result is embedded
|
|
47
|
+
// as `/${body}/` in DQL, so an unescaped `/` in a user value breaks out of the
|
|
48
|
+
// regex literal (query injection). Include `/` in the class.
|
|
49
|
+
const escaped = String(value).replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
|
|
50
|
+
return escaped.replace(/%/g, '.*').replace(/_/g, '.');
|
|
51
|
+
}
|
|
52
|
+
class DgraphGraphDialect extends base_graph_dialect_1.BaseGraphDialect {
|
|
53
|
+
constructor(options = {}) {
|
|
54
|
+
super(options);
|
|
55
|
+
this.name = 'dgraph';
|
|
56
|
+
this.library = 'dgraph-js';
|
|
57
|
+
this.client = null;
|
|
58
|
+
this.stub = null;
|
|
59
|
+
this.activeTxns = new Map();
|
|
60
|
+
this.currentTxnId = null;
|
|
61
|
+
this.dialectName = 'dgraph';
|
|
62
|
+
}
|
|
63
|
+
get defaultNodeVar() {
|
|
64
|
+
return 'node';
|
|
65
|
+
}
|
|
66
|
+
// -------------------------------------------------------------------
|
|
67
|
+
// Connection lifecycle
|
|
68
|
+
// -------------------------------------------------------------------
|
|
69
|
+
async connect() {
|
|
70
|
+
if (this._connected && this.client)
|
|
71
|
+
return;
|
|
72
|
+
try {
|
|
73
|
+
let client = this.options.client;
|
|
74
|
+
if (!client) {
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
76
|
+
const dgraph = require('dgraph-js');
|
|
77
|
+
const address = this.options.url || `${this.options.host || 'localhost'}:${this.options.port || 9080}`;
|
|
78
|
+
this.stub = new dgraph.DgraphClientStub(address);
|
|
79
|
+
client = new dgraph.DgraphClient(this.stub);
|
|
80
|
+
}
|
|
81
|
+
this.client = client;
|
|
82
|
+
this._connection = client;
|
|
83
|
+
this._connected = true;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
this.client = null;
|
|
87
|
+
this._connection = null;
|
|
88
|
+
this._connected = false;
|
|
89
|
+
throw new index_1.ConnectionError('Failed to connect to Dgraph', {
|
|
90
|
+
parent: error instanceof Error ? error : undefined,
|
|
91
|
+
database: this.options.database,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async disconnect() {
|
|
96
|
+
const stub = this.stub;
|
|
97
|
+
this.client = null;
|
|
98
|
+
this.stub = null;
|
|
99
|
+
this._connection = null;
|
|
100
|
+
this._connected = false;
|
|
101
|
+
this.activeTxns.clear();
|
|
102
|
+
this.currentTxnId = null;
|
|
103
|
+
if (stub && typeof stub.close === 'function') {
|
|
104
|
+
stub.close();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
requireClient() {
|
|
108
|
+
if (!this.client || !this._connected) {
|
|
109
|
+
throw new index_1.ConnectionError('DgraphGraphDialect is not connected. Call connect() first.', {
|
|
110
|
+
database: this.options.database,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return this.client;
|
|
114
|
+
}
|
|
115
|
+
async query(statement, options) {
|
|
116
|
+
if (statement.startsWith(MUT_PREFIX)) {
|
|
117
|
+
return this.runMutation(JSON.parse(statement.slice(MUT_PREFIX.length)));
|
|
118
|
+
}
|
|
119
|
+
const client = this.requireClient();
|
|
120
|
+
const vars = this.toStringVars(options?.bind);
|
|
121
|
+
const active = this.currentTxn();
|
|
122
|
+
const txn = active || client.newTxn();
|
|
123
|
+
try {
|
|
124
|
+
const res = await txn.queryWithVars(statement, vars);
|
|
125
|
+
const data = JSON.parse(res.getJson());
|
|
126
|
+
const rows = this.extractRows(data);
|
|
127
|
+
return { rows, rowCount: rows.length, fields: [] };
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
throw new index_1.DatabaseError('Dgraph query failed', {
|
|
131
|
+
code: 'QUERY_ERROR',
|
|
132
|
+
parent: error instanceof Error ? error : undefined,
|
|
133
|
+
original: error instanceof Error ? error.message : String(error),
|
|
134
|
+
sql: statement,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
if (!active)
|
|
139
|
+
await txn.discard();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
extractRows(data) {
|
|
143
|
+
if (!data || typeof data !== 'object')
|
|
144
|
+
return [];
|
|
145
|
+
const first = data.result ?? Object.values(data)[0];
|
|
146
|
+
if (Array.isArray(first))
|
|
147
|
+
return first;
|
|
148
|
+
return first ? [first] : [];
|
|
149
|
+
}
|
|
150
|
+
toStringVars(bind) {
|
|
151
|
+
const out = {};
|
|
152
|
+
for (const [k, v] of Object.entries(bind || {})) {
|
|
153
|
+
out[`$${k}`] = v === null || v === undefined ? '' : String(v);
|
|
154
|
+
}
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
async getDatabaseVersion() {
|
|
158
|
+
return 'unknown';
|
|
159
|
+
}
|
|
160
|
+
// -------------------------------------------------------------------
|
|
161
|
+
// Transactions
|
|
162
|
+
// -------------------------------------------------------------------
|
|
163
|
+
currentTxn() {
|
|
164
|
+
return this.currentTxnId ? this.activeTxns.get(this.currentTxnId) : null;
|
|
165
|
+
}
|
|
166
|
+
async startTransaction(options) {
|
|
167
|
+
const client = this.requireClient();
|
|
168
|
+
const txn = client.newTxn();
|
|
169
|
+
const transaction = new types_1.Transaction(options);
|
|
170
|
+
this.activeTxns.set(transaction.id, txn);
|
|
171
|
+
this.currentTxnId = transaction.id;
|
|
172
|
+
return transaction;
|
|
173
|
+
}
|
|
174
|
+
async commitTransaction(transaction) {
|
|
175
|
+
const txn = this.activeTxns.get(transaction.id);
|
|
176
|
+
if (!txn)
|
|
177
|
+
return;
|
|
178
|
+
try {
|
|
179
|
+
if (typeof txn.commit === 'function')
|
|
180
|
+
await txn.commit();
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
await txn.discard();
|
|
184
|
+
this.activeTxns.delete(transaction.id);
|
|
185
|
+
if (this.currentTxnId === transaction.id)
|
|
186
|
+
this.currentTxnId = null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async rollbackTransaction(transaction) {
|
|
190
|
+
const txn = this.activeTxns.get(transaction.id);
|
|
191
|
+
if (!txn)
|
|
192
|
+
return;
|
|
193
|
+
try {
|
|
194
|
+
await txn.discard();
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
this.activeTxns.delete(transaction.id);
|
|
198
|
+
if (this.currentTxnId === transaction.id)
|
|
199
|
+
this.currentTxnId = null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// -------------------------------------------------------------------
|
|
203
|
+
// Mutation execution (upserts resolve uids first, then mutate).
|
|
204
|
+
// -------------------------------------------------------------------
|
|
205
|
+
async mutate(mutation) {
|
|
206
|
+
const active = this.currentTxn();
|
|
207
|
+
const txn = active || this.requireClient().newTxn();
|
|
208
|
+
try {
|
|
209
|
+
return await txn.mutate({ ...mutation, commitNow: !active });
|
|
210
|
+
}
|
|
211
|
+
finally {
|
|
212
|
+
if (!active)
|
|
213
|
+
await txn.discard();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async resolveData(query) {
|
|
217
|
+
const client = this.requireClient();
|
|
218
|
+
const active = this.currentTxn();
|
|
219
|
+
const txn = active || client.newTxn();
|
|
220
|
+
try {
|
|
221
|
+
const res = await txn.queryWithVars(query, {});
|
|
222
|
+
return JSON.parse(res.getJson());
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
if (!active)
|
|
226
|
+
await txn.discard();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
async resolveRows(query) {
|
|
230
|
+
const data = await this.resolveData(query);
|
|
231
|
+
return Array.isArray(data.q) ? data.q : [];
|
|
232
|
+
}
|
|
233
|
+
async runMutation(desc) {
|
|
234
|
+
switch (desc.op) {
|
|
235
|
+
case 'set': {
|
|
236
|
+
await this.mutate({ setJson: desc.set });
|
|
237
|
+
return { rows: desc.set || [], rowCount: (desc.set || []).length, fields: [] };
|
|
238
|
+
}
|
|
239
|
+
case 'delete': {
|
|
240
|
+
const rows = await this.resolveRows(desc.query);
|
|
241
|
+
const nodes = rows.map((r) => ({ uid: r.uid }));
|
|
242
|
+
if (nodes.length)
|
|
243
|
+
await this.mutate({ deleteJson: nodes });
|
|
244
|
+
return { rows: nodes, rowCount: nodes.length, fields: [] };
|
|
245
|
+
}
|
|
246
|
+
case 'update': {
|
|
247
|
+
const rows = await this.resolveRows(desc.query);
|
|
248
|
+
const setNodes = rows.map((r) => ({ uid: r.uid, ...desc.set }));
|
|
249
|
+
const delNodes = [];
|
|
250
|
+
for (const r of rows) {
|
|
251
|
+
for (const f of desc.remove || [])
|
|
252
|
+
delNodes.push({ uid: r.uid, [f]: null });
|
|
253
|
+
}
|
|
254
|
+
if (setNodes.length && Object.keys(desc.set || {}).length) {
|
|
255
|
+
await this.mutate({ setJson: setNodes });
|
|
256
|
+
}
|
|
257
|
+
if (delNodes.length)
|
|
258
|
+
await this.mutate({ deleteJson: delNodes });
|
|
259
|
+
return { rows: setNodes, rowCount: setNodes.length, fields: [] };
|
|
260
|
+
}
|
|
261
|
+
case 'upsert': {
|
|
262
|
+
const rows = await this.resolveRows(desc.query);
|
|
263
|
+
const nodes = rows.length
|
|
264
|
+
? rows.map((r) => ({ uid: r.uid, ...desc.data }))
|
|
265
|
+
: [{ ...desc.data }];
|
|
266
|
+
await this.mutate({ setJson: nodes });
|
|
267
|
+
return { rows: nodes, rowCount: nodes.length, fields: [] };
|
|
268
|
+
}
|
|
269
|
+
case 'increment': {
|
|
270
|
+
const rows = await this.resolveRows(desc.query);
|
|
271
|
+
const nodes = rows.map((r) => {
|
|
272
|
+
const node = { uid: r.uid };
|
|
273
|
+
for (const [f, amt] of Object.entries(desc.increments)) {
|
|
274
|
+
node[f] = (Number(r[f]) || 0) + Number(amt);
|
|
275
|
+
}
|
|
276
|
+
return node;
|
|
277
|
+
});
|
|
278
|
+
if (nodes.length)
|
|
279
|
+
await this.mutate({ setJson: nodes });
|
|
280
|
+
return { rows: nodes, rowCount: nodes.length, fields: [] };
|
|
281
|
+
}
|
|
282
|
+
case 'edge': {
|
|
283
|
+
const data = await this.resolveData(desc.query);
|
|
284
|
+
const froms = Array.isArray(data.from) ? data.from : [];
|
|
285
|
+
const tos = Array.isArray(data.to) ? data.to : [];
|
|
286
|
+
const nodes = froms.map((f) => ({
|
|
287
|
+
uid: f.uid,
|
|
288
|
+
[desc.edge]: tos.map((t) => ({ uid: t.uid, ...(desc.props || {}) })),
|
|
289
|
+
}));
|
|
290
|
+
if (nodes.length && tos.length)
|
|
291
|
+
await this.mutate({ setJson: nodes });
|
|
292
|
+
return { rows: nodes, rowCount: nodes.length, fields: [] };
|
|
293
|
+
}
|
|
294
|
+
case 'alter': {
|
|
295
|
+
await this.requireClient().alter({ schema: desc.schema });
|
|
296
|
+
return { rows: [], rowCount: 0, fields: [] };
|
|
297
|
+
}
|
|
298
|
+
case 'noop':
|
|
299
|
+
default:
|
|
300
|
+
return { rows: [], rowCount: 0, fields: [] };
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// -------------------------------------------------------------------
|
|
304
|
+
// Predicate rendering -> DQL @filter expression.
|
|
305
|
+
// -------------------------------------------------------------------
|
|
306
|
+
renderPredicate(pred, ctx) {
|
|
307
|
+
return this.renderDql(pred, ctx.params);
|
|
308
|
+
}
|
|
309
|
+
/** Render a predicate; with `params` uses typed DQL vars, else inlines literals. */
|
|
310
|
+
renderDql(pred, params) {
|
|
311
|
+
switch (pred.kind) {
|
|
312
|
+
case 'true':
|
|
313
|
+
return '';
|
|
314
|
+
case 'and': {
|
|
315
|
+
const parts = pred.items.map((p) => this.renderDql(p, params)).filter((s) => s);
|
|
316
|
+
return parts.length > 1 ? `(${parts.join(' AND ')})` : parts[0] || '';
|
|
317
|
+
}
|
|
318
|
+
case 'or': {
|
|
319
|
+
const parts = pred.items.map((p) => this.renderDql(p, params)).filter((s) => s);
|
|
320
|
+
return parts.length > 1 ? `(${parts.join(' OR ')})` : parts[0] || '';
|
|
321
|
+
}
|
|
322
|
+
case 'not':
|
|
323
|
+
return `NOT (${this.renderDql(pred.item, params)})`;
|
|
324
|
+
case 'cmp':
|
|
325
|
+
return this.renderComparison(pred, params);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
renderComparison(pred, params) {
|
|
329
|
+
const field = (0, types_2.safeIdent)(pred.field);
|
|
330
|
+
const ref = (v) => (params ? `$${params.add(v)}` : dqlLiteral(v));
|
|
331
|
+
switch (pred.op) {
|
|
332
|
+
case 'eq':
|
|
333
|
+
return `eq(${field}, ${ref(pred.value)})`;
|
|
334
|
+
case 'ne':
|
|
335
|
+
return `NOT eq(${field}, ${ref(pred.value)})`;
|
|
336
|
+
case 'gt':
|
|
337
|
+
return `gt(${field}, ${ref(pred.value)})`;
|
|
338
|
+
case 'gte':
|
|
339
|
+
return `ge(${field}, ${ref(pred.value)})`;
|
|
340
|
+
case 'lt':
|
|
341
|
+
return `lt(${field}, ${ref(pred.value)})`;
|
|
342
|
+
case 'lte':
|
|
343
|
+
return `le(${field}, ${ref(pred.value)})`;
|
|
344
|
+
case 'in': {
|
|
345
|
+
const arr = Array.isArray(pred.value) ? pred.value : [pred.value];
|
|
346
|
+
return `eq(${field}, [${arr.map(dqlLiteral).join(', ')}])`;
|
|
347
|
+
}
|
|
348
|
+
case 'notIn': {
|
|
349
|
+
const arr = Array.isArray(pred.value) ? pred.value : [pred.value];
|
|
350
|
+
return `NOT eq(${field}, [${arr.map(dqlLiteral).join(', ')}])`;
|
|
351
|
+
}
|
|
352
|
+
case 'isNull':
|
|
353
|
+
return `NOT has(${field})`;
|
|
354
|
+
case 'isNotNull':
|
|
355
|
+
return `has(${field})`;
|
|
356
|
+
case 'like':
|
|
357
|
+
case 'notLike': {
|
|
358
|
+
const expr = `regexp(${field}, /${likeToRegexBody(pred.value)}/)`;
|
|
359
|
+
return pred.op === 'notLike' ? `NOT ${expr}` : expr;
|
|
360
|
+
}
|
|
361
|
+
case 'iLike':
|
|
362
|
+
case 'notILike': {
|
|
363
|
+
const expr = `regexp(${field}, /${likeToRegexBody(pred.value)}/i)`;
|
|
364
|
+
return pred.op === 'notILike' ? `NOT ${expr}` : expr;
|
|
365
|
+
}
|
|
366
|
+
case 'startsWith':
|
|
367
|
+
return `regexp(${field}, /^${likeToRegexBody(pred.value)}/)`;
|
|
368
|
+
case 'notStartsWith':
|
|
369
|
+
return `NOT regexp(${field}, /^${likeToRegexBody(pred.value)}/)`;
|
|
370
|
+
case 'endsWith':
|
|
371
|
+
return `regexp(${field}, /${likeToRegexBody(pred.value)}$/)`;
|
|
372
|
+
case 'notEndsWith':
|
|
373
|
+
return `NOT regexp(${field}, /${likeToRegexBody(pred.value)}$/)`;
|
|
374
|
+
case 'substring':
|
|
375
|
+
return `regexp(${field}, /${likeToRegexBody(pred.value)}/)`;
|
|
376
|
+
case 'notSubstring':
|
|
377
|
+
return `NOT regexp(${field}, /${likeToRegexBody(pred.value)}/)`;
|
|
378
|
+
case 'regexp':
|
|
379
|
+
return `regexp(${field}, /${regexBody(pred.value)}/)`;
|
|
380
|
+
case 'notRegexp':
|
|
381
|
+
return `NOT regexp(${field}, /${regexBody(pred.value)}/)`;
|
|
382
|
+
case 'between': {
|
|
383
|
+
const [lo, hi] = Array.isArray(pred.value) ? pred.value : [undefined, undefined];
|
|
384
|
+
return `(ge(${field}, ${ref(lo)}) AND le(${field}, ${ref(hi)}))`;
|
|
385
|
+
}
|
|
386
|
+
case 'notBetween': {
|
|
387
|
+
const [lo, hi] = Array.isArray(pred.value) ? pred.value : [undefined, undefined];
|
|
388
|
+
return `(lt(${field}, ${ref(lo)}) OR gt(${field}, ${ref(hi)}))`;
|
|
389
|
+
}
|
|
390
|
+
default:
|
|
391
|
+
return `eq(${field}, ${ref(pred.value)})`;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
varDefs(params) {
|
|
395
|
+
const defs = Object.entries(params.params).map(([name, value]) => `$${name}: ${dqlType(value)}`);
|
|
396
|
+
return defs.join(', ');
|
|
397
|
+
}
|
|
398
|
+
// -------------------------------------------------------------------
|
|
399
|
+
// Codegen
|
|
400
|
+
// -------------------------------------------------------------------
|
|
401
|
+
compileMatch(spec) {
|
|
402
|
+
const params = new types_2.ParamBag('p');
|
|
403
|
+
const label = (0, types_2.safeIdent)(spec.label);
|
|
404
|
+
const filter = this.renderDql((0, types_2.normalizeWhere)(spec.where), params);
|
|
405
|
+
const funcArgs = [`func: type(${label})`];
|
|
406
|
+
const order = spec.order || [];
|
|
407
|
+
if (order.length) {
|
|
408
|
+
const [f, d] = order[0];
|
|
409
|
+
funcArgs.push(`${d === 'DESC' ? 'orderdesc' : 'orderasc'}: ${(0, types_2.safeIdent)(f)}`);
|
|
410
|
+
}
|
|
411
|
+
if (spec.limit !== undefined && spec.limit !== null && String(spec.limit) !== '') {
|
|
412
|
+
funcArgs.push(`first: ${Number(spec.limit)}`);
|
|
413
|
+
}
|
|
414
|
+
if (spec.offset !== undefined && spec.offset !== null && String(spec.offset) !== '') {
|
|
415
|
+
funcArgs.push(`offset: ${Number(spec.offset)}`);
|
|
416
|
+
}
|
|
417
|
+
let inner;
|
|
418
|
+
if (spec.count) {
|
|
419
|
+
inner = 'count(uid)';
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
const attrs = Array.isArray(spec.attributes) ? spec.attributes : undefined;
|
|
423
|
+
const props = attrs && attrs.length ? attrs.map((a) => (0, types_2.safeIdent)(a)).join('\n ') : 'expand(_all_)';
|
|
424
|
+
const includeBlocks = (spec.include || [])
|
|
425
|
+
.map((step) => {
|
|
426
|
+
const pred = step.direction === 'in' ? `~${(0, types_2.safeIdent)(step.edgeLabel)}` : (0, types_2.safeIdent)(step.edgeLabel);
|
|
427
|
+
const alias = (0, types_2.safeIdent)(step.as || step.targetLabel || step.edgeLabel);
|
|
428
|
+
const stepFilter = this.renderDql((0, types_2.normalizeWhere)(step.where), params);
|
|
429
|
+
const filterClause = stepFilter ? ` @filter(${stepFilter})` : '';
|
|
430
|
+
return `${alias}: ${pred}${filterClause} {\n uid\n expand(_all_)\n }`;
|
|
431
|
+
})
|
|
432
|
+
.join('\n ');
|
|
433
|
+
inner = `uid\n dgraph.type\n ${props}${includeBlocks ? '\n ' + includeBlocks : ''}`;
|
|
434
|
+
}
|
|
435
|
+
const filterClause = filter ? ` @filter(${filter})` : '';
|
|
436
|
+
const defs = this.varDefs(params);
|
|
437
|
+
const header = defs ? `query find(${defs})` : 'query find';
|
|
438
|
+
const text = `${header} {\n result(${funcArgs.join(', ')})${filterClause} {\n ${inner}\n }\n}`;
|
|
439
|
+
return { text, params: params.params };
|
|
440
|
+
}
|
|
441
|
+
compileCreateNode(label, data) {
|
|
442
|
+
const node = { uid: '_:new', 'dgraph.type': (0, types_2.safeIdent)(label) };
|
|
443
|
+
for (const [k, v] of Object.entries(data)) {
|
|
444
|
+
if (v !== undefined)
|
|
445
|
+
node[k] = v;
|
|
446
|
+
}
|
|
447
|
+
return { text: MUT_PREFIX + JSON.stringify({ op: 'set', set: [node] }), params: {} };
|
|
448
|
+
}
|
|
449
|
+
compileUpdateNodes(label, where, values) {
|
|
450
|
+
const query = this.uidQuery(label, where);
|
|
451
|
+
const set = {};
|
|
452
|
+
const remove = [];
|
|
453
|
+
for (const [k, v] of Object.entries(values)) {
|
|
454
|
+
if (v === undefined)
|
|
455
|
+
remove.push((0, types_2.safeIdent)(k));
|
|
456
|
+
else
|
|
457
|
+
set[k] = v;
|
|
458
|
+
}
|
|
459
|
+
return {
|
|
460
|
+
text: MUT_PREFIX + JSON.stringify({ op: 'update', query, set, remove }),
|
|
461
|
+
params: {},
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
compileDeleteNodes(label, where, _detach) {
|
|
465
|
+
return {
|
|
466
|
+
text: MUT_PREFIX + JSON.stringify({ op: 'delete', query: this.uidQuery(label, where) }),
|
|
467
|
+
params: {},
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
compileUpsertNode(label, data, conflictKeys) {
|
|
471
|
+
const keys = conflictKeys.length ? conflictKeys : ['id'];
|
|
472
|
+
const preds = keys.map((k) => `eq(${(0, types_2.safeIdent)(k)}, ${dqlLiteral(data[k])})`);
|
|
473
|
+
const query = `{ q(func: type(${(0, types_2.safeIdent)(label)})) @filter(${preds.join(' AND ')}) { uid } }`;
|
|
474
|
+
const node = { 'dgraph.type': (0, types_2.safeIdent)(label) };
|
|
475
|
+
for (const [k, v] of Object.entries(data)) {
|
|
476
|
+
if (v !== undefined)
|
|
477
|
+
node[k] = v;
|
|
478
|
+
}
|
|
479
|
+
return { text: MUT_PREFIX + JSON.stringify({ op: 'upsert', query, data: node }), params: {} };
|
|
480
|
+
}
|
|
481
|
+
compileIncrement(label, fields, where, by) {
|
|
482
|
+
const map = typeof fields === 'string'
|
|
483
|
+
? { [fields]: by }
|
|
484
|
+
: Array.isArray(fields)
|
|
485
|
+
? Object.fromEntries(fields.map((f) => [f, by]))
|
|
486
|
+
: fields;
|
|
487
|
+
const selectFields = Object.keys(map).map((f) => (0, types_2.safeIdent)(f)).join('\n ');
|
|
488
|
+
const filter = this.renderDql((0, types_2.normalizeWhere)(where));
|
|
489
|
+
const filterClause = filter ? ` @filter(${filter})` : '';
|
|
490
|
+
const query = `{ q(func: type(${(0, types_2.safeIdent)(label)}))${filterClause} {\n uid\n ${selectFields}\n } }`;
|
|
491
|
+
return {
|
|
492
|
+
text: MUT_PREFIX + JSON.stringify({ op: 'increment', query, increments: map }),
|
|
493
|
+
params: {},
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
compileCreateEdge(spec) {
|
|
497
|
+
// Resolve both endpoints, then connect the source to the target via the
|
|
498
|
+
// edge predicate (a facet-less uid link). Reverse lookups are handled by
|
|
499
|
+
// Dgraph's `~pred` at query time.
|
|
500
|
+
const fromFilter = this.renderDql((0, types_2.normalizeWhere)(spec.fromWhere));
|
|
501
|
+
const toFilter = this.renderDql((0, types_2.normalizeWhere)(spec.toWhere));
|
|
502
|
+
const query = `{ ` +
|
|
503
|
+
`from(func: type(${(0, types_2.safeIdent)(spec.fromLabel)}))${fromFilter ? ` @filter(${fromFilter})` : ''} { uid } ` +
|
|
504
|
+
`to(func: type(${(0, types_2.safeIdent)(spec.toLabel)}))${toFilter ? ` @filter(${toFilter})` : ''} { uid } ` +
|
|
505
|
+
`}`;
|
|
506
|
+
return {
|
|
507
|
+
text: MUT_PREFIX +
|
|
508
|
+
JSON.stringify({ op: 'edge', query, edge: (0, types_2.safeIdent)(spec.edgeLabel), props: spec.props || {} }),
|
|
509
|
+
params: {},
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
compileTraverse(spec) {
|
|
513
|
+
const params = new types_2.ParamBag('p');
|
|
514
|
+
const label = (0, types_2.safeIdent)(spec.label);
|
|
515
|
+
const startFilter = this.renderDql((0, types_2.normalizeWhere)(spec.where), params);
|
|
516
|
+
const pred = spec.direction === 'in' ? `~${(0, types_2.safeIdent)(spec.edgeLabel || 'edge')}` : (0, types_2.safeIdent)(spec.edgeLabel || 'edge');
|
|
517
|
+
const targetFilter = this.renderDql((0, types_2.normalizeWhere)(spec.targetWhere), params);
|
|
518
|
+
const targetFilterClause = targetFilter ? ` @filter(${targetFilter})` : '';
|
|
519
|
+
const first = spec.limit !== undefined ? `, first: ${Number(spec.limit)}` : '';
|
|
520
|
+
const defs = this.varDefs(params);
|
|
521
|
+
const header = defs ? `query traverse(${defs})` : 'query traverse';
|
|
522
|
+
const startClause = startFilter ? ` @filter(${startFilter})` : '';
|
|
523
|
+
const text = `${header} {\n` +
|
|
524
|
+
` result(func: type(${label})${first})${startClause} {\n` +
|
|
525
|
+
` uid\n` +
|
|
526
|
+
` ${pred}${targetFilterClause} {\n uid\n expand(_all_)\n }\n` +
|
|
527
|
+
` }\n}`;
|
|
528
|
+
return { text, params: params.params };
|
|
529
|
+
}
|
|
530
|
+
uidQuery(label, where) {
|
|
531
|
+
const filter = this.renderDql((0, types_2.normalizeWhere)(where));
|
|
532
|
+
const filterClause = filter ? ` @filter(${filter})` : '';
|
|
533
|
+
return `{ q(func: type(${(0, types_2.safeIdent)(label)}))${filterClause} { uid } }`;
|
|
534
|
+
}
|
|
535
|
+
// Dgraph schema (types/predicate indexes) is managed via the `alter` API.
|
|
536
|
+
compileCreateConstraint(label, fields, _kind, _name) {
|
|
537
|
+
// Model a uniqueness/index hint as a predicate index alteration.
|
|
538
|
+
const schema = fields.map((f) => `${(0, types_2.safeIdent)(f)}: string @index(exact) .`).join('\n');
|
|
539
|
+
return {
|
|
540
|
+
text: MUT_PREFIX + JSON.stringify({ op: 'alter', schema, label: (0, types_2.safeIdent)(label) }),
|
|
541
|
+
params: {},
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
compileDropConstraint(_label, _name) {
|
|
545
|
+
return { text: MUT_PREFIX + JSON.stringify({ op: 'noop' }), params: {} };
|
|
546
|
+
}
|
|
547
|
+
compileCreateIndex(_label, fields, _name) {
|
|
548
|
+
const schema = fields.map((f) => `${(0, types_2.safeIdent)(f)}: string @index(term) .`).join('\n');
|
|
549
|
+
return { text: MUT_PREFIX + JSON.stringify({ op: 'alter', schema }), params: {} };
|
|
550
|
+
}
|
|
551
|
+
compileDropIndex(_label, _name) {
|
|
552
|
+
return { text: MUT_PREFIX + JSON.stringify({ op: 'noop' }), params: {} };
|
|
553
|
+
}
|
|
554
|
+
compileShowLabels() {
|
|
555
|
+
return { text: 'query labels { result(func: has(dgraph.type)) { dgraph.type } }', params: {} };
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
exports.DgraphGraphDialect = DgraphGraphDialect;
|
|
559
|
+
exports.default = DgraphGraphDialect;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gremlin graph dialect — Apache TinkerPop / Amazon Neptune traversal
|
|
3
|
+
* generation for the ORM builder API.
|
|
4
|
+
*
|
|
5
|
+
* Maps the ORM model API onto Gremlin traversals: `g.V().hasLabel(...)` for
|
|
6
|
+
* finds, `addV`/`addE` for node/edge writes, `.has(field, P.gte(x))` for
|
|
7
|
+
* `where` operators, `out`/`in`/`repeat().times()` for association
|
|
8
|
+
* traversals. Values are passed as Gremlin bindings (`b0`, `b1`, ...), never
|
|
9
|
+
* interpolated. Users never hand-write Gremlin for standard operations.
|
|
10
|
+
*
|
|
11
|
+
* The `gremlin` package is loaded lazily; a pre-built client can be injected
|
|
12
|
+
* via `options.client`.
|
|
13
|
+
*
|
|
14
|
+
* Notes on genuinely-unsupported features:
|
|
15
|
+
* - TinkerPop has no portable schema DDL, so index/constraint creation
|
|
16
|
+
* compiles to a harmless no-op traversal (real schema management is
|
|
17
|
+
* backend-specific: JanusGraph management API, Neptune auto-indexing).
|
|
18
|
+
* - Interactive multi-statement transactions are not portable across
|
|
19
|
+
* Gremlin servers (Neptune in particular), so `startTransaction` throws a
|
|
20
|
+
* typed {@link GraphCapabilityError}.
|
|
21
|
+
*/
|
|
22
|
+
import { Transaction } from '../../types';
|
|
23
|
+
import type { QueryOptions, QueryResult, TransactionOptions } from '../../types';
|
|
24
|
+
import { BaseGraphDialect, type EdgeCreateSpec, type NodeConstraintKind, type WhereRenderContext } from '../base-graph-dialect';
|
|
25
|
+
import { type GraphConnectionOptions, type GraphPredicate, type GraphStatement, type GraphTraversalSpec, type NodeMatchSpec } from '../types';
|
|
26
|
+
export declare class GremlinGraphDialect extends BaseGraphDialect {
|
|
27
|
+
readonly name = "gremlin";
|
|
28
|
+
readonly library = "gremlin";
|
|
29
|
+
private client;
|
|
30
|
+
constructor(options?: GraphConnectionOptions);
|
|
31
|
+
protected get defaultNodeVar(): string;
|
|
32
|
+
connect(): Promise<void>;
|
|
33
|
+
disconnect(): Promise<void>;
|
|
34
|
+
private requireClient;
|
|
35
|
+
query(statement: string, options?: QueryOptions): Promise<QueryResult>;
|
|
36
|
+
getDatabaseVersion(): Promise<string>;
|
|
37
|
+
startTransaction(_options?: TransactionOptions): Promise<Transaction>;
|
|
38
|
+
commitTransaction(_transaction: Transaction): Promise<void>;
|
|
39
|
+
rollbackTransaction(_transaction: Transaction): Promise<void>;
|
|
40
|
+
renderPredicate(pred: GraphPredicate, ctx: WhereRenderContext): string;
|
|
41
|
+
private renderComparison;
|
|
42
|
+
/** Strip SQL LIKE wildcards for TextP.containing (which does substring match). */
|
|
43
|
+
private likeText;
|
|
44
|
+
private filterChain;
|
|
45
|
+
compileMatch(spec: NodeMatchSpec): GraphStatement;
|
|
46
|
+
compileCreateNode(label: string, data: Record<string, unknown>): GraphStatement;
|
|
47
|
+
compileUpdateNodes(label: string, where: import('../../types').WhereOptions | undefined, values: Record<string, unknown>): GraphStatement;
|
|
48
|
+
compileDeleteNodes(label: string, where: import('../../types').WhereOptions | undefined, _detach: boolean): GraphStatement;
|
|
49
|
+
compileUpsertNode(label: string, data: Record<string, unknown>, conflictKeys: string[]): GraphStatement;
|
|
50
|
+
compileIncrement(label: string, fields: string | string[] | Record<string, number>, where: import('../../types').WhereOptions | undefined, by: number): GraphStatement;
|
|
51
|
+
compileCreateEdge(spec: EdgeCreateSpec): GraphStatement;
|
|
52
|
+
compileTraverse(spec: GraphTraversalSpec): GraphStatement;
|
|
53
|
+
compileCreateConstraint(_label: string, _fields: string[], _kind: NodeConstraintKind, _name?: string): GraphStatement;
|
|
54
|
+
compileDropConstraint(_label: string, _name: string): GraphStatement;
|
|
55
|
+
compileCreateIndex(_label: string, _fields: string[], _name?: string): GraphStatement;
|
|
56
|
+
compileDropIndex(_label: string, _name: string): GraphStatement;
|
|
57
|
+
compileShowLabels(): GraphStatement;
|
|
58
|
+
}
|
|
59
|
+
export default GremlinGraphDialect;
|