ts-prorm-orm 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +194 -72
  3. package/dist/audit/history-query.d.ts +35 -0
  4. package/dist/audit/index.d.ts +16 -0
  5. package/dist/audit/logger.d.ts +126 -0
  6. package/dist/cache/cache-manager.d.ts +341 -0
  7. package/dist/cache/index.d.ts +8 -0
  8. package/dist/cache/redis-cluster-cache.d.ts +164 -0
  9. package/dist/cache/redis-cluster-cache.js +19 -36
  10. package/dist/cli/cloud.d.ts +55 -0
  11. package/dist/cli/cloud.js +318 -0
  12. package/dist/cli/commands/auth.d.ts +2 -0
  13. package/dist/cli/commands/auth.js +345 -0
  14. package/dist/cli/commands/billing.d.ts +2 -0
  15. package/dist/cli/commands/billing.js +135 -0
  16. package/dist/cli/commands/code.d.ts +2 -0
  17. package/dist/cli/commands/code.js +168 -0
  18. package/dist/cli/commands/config.d.ts +2 -0
  19. package/dist/cli/commands/config.js +154 -0
  20. package/dist/cli/commands/db.d.ts +2 -0
  21. package/dist/cli/commands/db.js +189 -0
  22. package/dist/cli/commands/index.d.ts +1 -0
  23. package/dist/cli/commands/index.js +22 -0
  24. package/dist/cli/commands/keys.d.ts +2 -0
  25. package/dist/cli/commands/keys.js +100 -0
  26. package/dist/cli/commands/misc.d.ts +2 -0
  27. package/dist/cli/commands/misc.js +282 -0
  28. package/dist/cli/commands/pull.d.ts +2 -0
  29. package/dist/cli/commands/pull.js +306 -0
  30. package/dist/cli/commands/runners.d.ts +2 -0
  31. package/dist/cli/commands/runners.js +218 -0
  32. package/dist/cli/commands/scaffold.d.ts +2 -0
  33. package/dist/cli/commands/scaffold.js +383 -0
  34. package/dist/cli/commands/secrets.d.ts +2 -0
  35. package/dist/cli/commands/secrets.js +162 -0
  36. package/dist/cli/commands/store.d.ts +2 -0
  37. package/dist/cli/commands/store.js +274 -0
  38. package/dist/cli/commands/system.d.ts +10 -0
  39. package/dist/cli/commands/system.js +169 -0
  40. package/dist/cli/commands/teams.d.ts +2 -0
  41. package/dist/cli/commands/teams.js +189 -0
  42. package/dist/cli/commands/user.d.ts +2 -0
  43. package/dist/cli/commands/user.js +171 -0
  44. package/dist/cli/framework.d.ts +103 -0
  45. package/dist/cli/framework.js +436 -0
  46. package/dist/cli/io.d.ts +26 -0
  47. package/dist/cli/io.js +181 -0
  48. package/dist/cli/keychain.d.ts +10 -0
  49. package/dist/cli/keychain.js +101 -0
  50. package/dist/cli/prompt.d.ts +20 -0
  51. package/dist/cli/prompt.js +111 -0
  52. package/dist/cli.d.ts +214 -0
  53. package/dist/cli.js +72 -5
  54. package/dist/compliance/audit-trail.d.ts +66 -0
  55. package/dist/compliance/backup-verification.d.ts +279 -0
  56. package/dist/compliance/breach-detector.d.ts +197 -0
  57. package/dist/compliance/consent-record.d.ts +107 -0
  58. package/dist/compliance/consent-versioning.d.ts +169 -0
  59. package/dist/compliance/cross-border-log.d.ts +254 -0
  60. package/dist/compliance/data-classifier.d.ts +127 -0
  61. package/dist/compliance/data-lineage.d.ts +268 -0
  62. package/dist/compliance/data-masker.d.ts +110 -0
  63. package/dist/compliance/data-portability.d.ts +98 -0
  64. package/dist/compliance/data-retention.d.ts +108 -0
  65. package/dist/compliance/dsar-workflow.d.ts +175 -0
  66. package/dist/compliance/field-encryption.d.ts +84 -0
  67. package/dist/compliance/immutable-record.d.ts +84 -0
  68. package/dist/compliance/index.d.ts +93 -0
  69. package/dist/compliance/privacy-impact-assessment.d.ts +196 -0
  70. package/dist/compliance/pseudonymization.d.ts +96 -0
  71. package/dist/compliance/query-firewall.d.ts +661 -0
  72. package/dist/compliance/rate-limiter.d.ts +203 -0
  73. package/dist/compliance/right-to-erasure.d.ts +96 -0
  74. package/dist/compliance/row-level-security.d.ts +152 -0
  75. package/dist/compliance/security-decorator.d.ts +388 -0
  76. package/dist/compliance/security-monitor.d.ts +170 -0
  77. package/dist/compliance/sensitive-data-discovery.d.ts +151 -0
  78. package/dist/compliance/session-isolation.d.ts +286 -0
  79. package/dist/compliance/tls-enforcer.d.ts +51 -0
  80. package/dist/compliance/worm-storage.d.ts +225 -0
  81. package/dist/connection-manager.d.ts +130 -0
  82. package/dist/connection-pool.d.ts +311 -0
  83. package/dist/decorators/audit.d.ts +49 -0
  84. package/dist/decorators/check.d.ts +218 -0
  85. package/dist/decorators/collate.d.ts +346 -0
  86. package/dist/decorators/comment.d.ts +51 -0
  87. package/dist/decorators/database-settings.d.ts +193 -0
  88. package/dist/decorators/default.d.ts +148 -0
  89. package/dist/decorators/encryption.d.ts +175 -0
  90. package/dist/decorators/engine.d.ts +97 -0
  91. package/dist/decorators/fk-constraints.d.ts +387 -0
  92. package/dist/decorators/foreign-table.d.ts +57 -0
  93. package/dist/decorators/generated.d.ts +232 -0
  94. package/dist/decorators/hstore.d.ts +96 -0
  95. package/dist/decorators/index.d.ts +57 -0
  96. package/dist/decorators/index.js +14 -30
  97. package/dist/decorators/json-column.d.ts +47 -0
  98. package/dist/decorators/jsonb.d.ts +83 -0
  99. package/dist/decorators/orm-decorators.d.ts +274 -0
  100. package/dist/decorators/permissions.d.ts +192 -0
  101. package/dist/decorators/procedure.d.ts +168 -0
  102. package/dist/decorators/procedure.js +31 -7
  103. package/dist/decorators/query-options.d.ts +527 -0
  104. package/dist/decorators/range.d.ts +122 -0
  105. package/dist/decorators/set-column.d.ts +43 -0
  106. package/dist/decorators/spatial.d.ts +60 -0
  107. package/dist/decorators/storage.d.ts +561 -0
  108. package/dist/decorators/timezone.d.ts +319 -0
  109. package/dist/decorators/trigger.d.ts +50 -0
  110. package/dist/decorators/uuid.d.ts +102 -0
  111. package/dist/decorators/view.d.ts +213 -0
  112. package/dist/diagrams/chen-diagram.d.ts +70 -0
  113. package/dist/diagrams/chen-diagram.js +33 -31
  114. package/dist/diagrams/class-diagram.d.ts +78 -0
  115. package/dist/diagrams/class-diagram.js +23 -27
  116. package/dist/diagrams/dependency-diagram.d.ts +82 -0
  117. package/dist/diagrams/dependency-diagram.js +18 -9
  118. package/dist/diagrams/er-diagram.d.ts +82 -0
  119. package/dist/diagrams/er-diagram.js +174 -231
  120. package/dist/diagrams/flow-diagram.d.ts +70 -0
  121. package/dist/diagrams/flow-diagram.js +23 -18
  122. package/dist/diagrams/gantt-diagram.d.ts +67 -0
  123. package/dist/diagrams/gantt-diagram.js +20 -18
  124. package/dist/diagrams/index-diagram.d.ts +61 -0
  125. package/dist/diagrams/index-diagram.js +36 -31
  126. package/dist/diagrams/index.d.ts +155 -0
  127. package/dist/diagrams/index.js +7 -1
  128. package/dist/diagrams/migration-diagram.d.ts +67 -0
  129. package/dist/diagrams/migration-diagram.js +45 -57
  130. package/dist/diagrams/model-diagram.d.ts +85 -0
  131. package/dist/diagrams/model-diagram.js +225 -287
  132. package/dist/diagrams/package-diagram.d.ts +69 -0
  133. package/dist/diagrams/package-diagram.js +30 -32
  134. package/dist/diagrams/palette.d.ts +138 -0
  135. package/dist/diagrams/palette.js +134 -25
  136. package/dist/diagrams/relational-diagram.d.ts +82 -0
  137. package/dist/diagrams/relational-diagram.js +51 -59
  138. package/dist/diagrams/schemadoc-diagram.d.ts +57 -0
  139. package/dist/diagrams/schemadoc-diagram.js +36 -28
  140. package/dist/diagrams/sequence-diagram.d.ts +61 -0
  141. package/dist/diagrams/sequence-diagram.js +20 -11
  142. package/dist/diagrams/state-diagram.d.ts +85 -0
  143. package/dist/diagrams/state-diagram.js +21 -17
  144. package/dist/diagrams/svg-dom.d.ts +62 -0
  145. package/dist/diagrams/svg-dom.js +11 -0
  146. package/dist/diagrams/tree-diagram.d.ts +47 -0
  147. package/dist/diagrams/tree-diagram.js +19 -10
  148. package/dist/dialects/clickhouse/index.d.ts +660 -0
  149. package/dist/dialects/clickhouse/index.js +107 -2
  150. package/dist/dialects/cockroachdb/index.d.ts +1708 -0
  151. package/dist/dialects/cockroachdb/index.js +139 -10
  152. package/dist/dialects/cratedb/index.d.ts +262 -0
  153. package/dist/dialects/cratedb/index.js +148 -0
  154. package/dist/dialects/databricks/index.d.ts +397 -0
  155. package/dist/dialects/databricks/index.js +233 -11
  156. package/dist/dialects/db2/index.d.ts +729 -0
  157. package/dist/dialects/db2/index.js +152 -2
  158. package/dist/dialects/dialect.d.ts +1653 -0
  159. package/dist/dialects/duckdb/index.d.ts +440 -0
  160. package/dist/dialects/duckdb/index.js +21 -37
  161. package/dist/dialects/exasol/index.d.ts +197 -0
  162. package/dist/dialects/exasol/index.js +14 -0
  163. package/dist/dialects/firebird/index.d.ts +286 -0
  164. package/dist/dialects/firebird/index.js +135 -0
  165. package/dist/dialects/greenplum/index.d.ts +336 -0
  166. package/dist/dialects/greenplum/index.js +168 -0
  167. package/dist/dialects/hana/index.d.ts +512 -0
  168. package/dist/dialects/hana/index.js +17 -35
  169. package/dist/dialects/mariadb/index.d.ts +1241 -0
  170. package/dist/dialects/mariadb/index.js +181 -43
  171. package/dist/dialects/mssql/index.d.ts +729 -0
  172. package/dist/dialects/mssql/index.js +76 -7
  173. package/dist/dialects/mysql/index.d.ts +1233 -0
  174. package/dist/dialects/mysql/index.js +87 -19
  175. package/dist/dialects/oracle/index.d.ts +1222 -0
  176. package/dist/dialects/oracle/index.js +210 -9
  177. package/dist/dialects/postgres/index.d.ts +1598 -0
  178. package/dist/dialects/postgres/index.js +34 -13
  179. package/dist/dialects/query-stream-helper.d.ts +58 -0
  180. package/dist/dialects/questdb/index.d.ts +430 -0
  181. package/dist/dialects/questdb/index.js +292 -0
  182. package/dist/dialects/redshift/index.d.ts +933 -0
  183. package/dist/dialects/redshift/index.js +17 -5
  184. package/dist/dialects/singlestore/index.d.ts +233 -0
  185. package/dist/dialects/singlestore/index.js +53 -0
  186. package/dist/dialects/snowflake/index.d.ts +727 -0
  187. package/dist/dialects/snowflake/index.js +154 -5
  188. package/dist/dialects/spanner/index.d.ts +660 -0
  189. package/dist/dialects/spanner/index.js +43 -21
  190. package/dist/dialects/sqlite/index.d.ts +1133 -0
  191. package/dist/dialects/sqlite/index.js +168 -30
  192. package/dist/dialects/tidb/index.d.ts +226 -0
  193. package/dist/dialects/tidb/index.js +10 -0
  194. package/dist/dialects/timescaledb/index.d.ts +286 -0
  195. package/dist/dialects/timescaledb/index.js +179 -0
  196. package/dist/dialects/trino/index.d.ts +230 -0
  197. package/dist/dialects/trino/index.js +85 -10
  198. package/dist/dialects/turso/index.d.ts +98 -0
  199. package/dist/dialects/turso/index.js +10 -0
  200. package/dist/dialects/vertica/index.d.ts +321 -0
  201. package/dist/dialects/vertica/index.js +161 -0
  202. package/dist/dialects/yugabytedb/index.d.ts +276 -0
  203. package/dist/dialects/yugabytedb/index.js +121 -0
  204. package/dist/errors/index.d.ts +378 -0
  205. package/dist/errors/index.js +29 -1
  206. package/dist/errors/utils.d.ts +53 -0
  207. package/dist/errors.d.ts +5 -0
  208. package/dist/extensions/catalog/cloud-warehouse-features.d.ts +27 -0
  209. package/dist/extensions/catalog/mssql-features.d.ts +20 -0
  210. package/dist/extensions/catalog/mysql-mariadb-plugins.d.ts +18 -0
  211. package/dist/extensions/catalog/oracle-db2-features.d.ts +17 -0
  212. package/dist/extensions/catalog/postgres-extensions.d.ts +15 -0
  213. package/dist/extensions/index.d.ts +34 -0
  214. package/dist/extensions/types.d.ts +43 -0
  215. package/dist/external-fields/adapters.d.ts +50 -0
  216. package/dist/external-fields/adapters.js +227 -0
  217. package/dist/external-fields/decorator.d.ts +77 -0
  218. package/dist/external-fields/decorator.js +80 -0
  219. package/dist/external-fields/index.d.ts +10 -0
  220. package/dist/external-fields/index.js +19 -0
  221. package/dist/external-fields/runtime.d.ts +39 -0
  222. package/dist/external-fields/runtime.js +221 -0
  223. package/dist/foreign-data.d.ts +168 -0
  224. package/dist/graph/base-graph-dialect.d.ts +250 -0
  225. package/dist/graph/base-graph-dialect.js +539 -0
  226. package/dist/graph/dgraph/index.d.ts +65 -0
  227. package/dist/graph/dgraph/index.js +559 -0
  228. package/dist/graph/gremlin/index.d.ts +59 -0
  229. package/dist/graph/gremlin/index.js +378 -0
  230. package/dist/graph/index.d.ts +60 -0
  231. package/dist/graph/index.js +67 -0
  232. package/dist/graph/neo4j/index.d.ts +50 -0
  233. package/dist/graph/neo4j/index.js +462 -0
  234. package/dist/graph/types.d.ts +213 -0
  235. package/dist/graph/types.js +234 -0
  236. package/dist/hooks/hooks-manager.d.ts +189 -0
  237. package/dist/hooks/index.d.ts +8 -0
  238. package/dist/index.d.ts +713 -0
  239. package/dist/index.js +36 -4
  240. package/dist/logging.d.ts +183 -0
  241. package/dist/migrations/index.d.ts +9 -0
  242. package/dist/migrations/migration.d.ts +143 -0
  243. package/dist/migrations/migrator.d.ts +199 -0
  244. package/dist/migrations/prormmigration.d.ts +131 -0
  245. package/dist/migrations/query-interface.d.ts +335 -0
  246. package/dist/migrations/seeder.d.ts +167 -0
  247. package/dist/models/associations.d.ts +131 -0
  248. package/dist/models/associations.js +7 -2
  249. package/dist/models/constraints.d.ts +175 -0
  250. package/dist/models/data-types.d.ts +1656 -0
  251. package/dist/models/decorators.d.ts +328 -0
  252. package/dist/models/decorators.js +61 -82
  253. package/dist/models/eager-load.d.ts +86 -0
  254. package/dist/models/eager-load.js +369 -0
  255. package/dist/models/index.d.ts +13 -0
  256. package/dist/models/indexes.d.ts +325 -0
  257. package/dist/models/methods.d.ts +419 -0
  258. package/dist/models/model-manager.d.ts +76 -0
  259. package/dist/models/model.d.ts +820 -0
  260. package/dist/models/model.js +15 -101
  261. package/dist/models/operators.d.ts +29 -0
  262. package/dist/models/scopes.d.ts +71 -0
  263. package/dist/models/typescript-types.d.ts +177 -0
  264. package/dist/nosql/aerospike/index.d.ts +126 -0
  265. package/dist/nosql/allegrograph/index.d.ts +86 -0
  266. package/dist/nosql/arangodb/index.d.ts +285 -0
  267. package/dist/nosql/arangodb/index.js +274 -2
  268. package/dist/nosql/arangodb/where.d.ts +38 -0
  269. package/dist/nosql/arangodb/where.js +94 -0
  270. package/dist/nosql/azure-blob/index.d.ts +104 -0
  271. package/dist/nosql/beanstalkd/index.d.ts +88 -0
  272. package/dist/nosql/beequeue/index.d.ts +99 -0
  273. package/dist/nosql/bigchaindb/index.d.ts +113 -0
  274. package/dist/nosql/bigtable/index.d.ts +144 -0
  275. package/dist/nosql/blazegraph/index.d.ts +88 -0
  276. package/dist/nosql/bullmq/index.d.ts +83 -0
  277. package/dist/nosql/cassandra/index.d.ts +119 -0
  278. package/dist/nosql/chroma/index.d.ts +151 -0
  279. package/dist/nosql/cloudflare-kv/index.d.ts +120 -0
  280. package/dist/nosql/coherence/index.d.ts +91 -0
  281. package/dist/nosql/cosmosdb/index.d.ts +78 -0
  282. package/dist/nosql/couchbase/index.d.ts +103 -0
  283. package/dist/nosql/dax/index.d.ts +118 -0
  284. package/dist/nosql/deno-kv/index.d.ts +109 -0
  285. package/dist/nosql/dgraph/index.d.ts +80 -0
  286. package/dist/nosql/doris/index.d.ts +88 -0
  287. package/dist/nosql/druid/index.d.ts +95 -0
  288. package/dist/nosql/dynamodb/index.d.ts +643 -0
  289. package/dist/nosql/dynamodb/index.js +423 -0
  290. package/dist/nosql/elasticsearch/index.d.ts +239 -0
  291. package/dist/nosql/etcd/index.d.ts +243 -0
  292. package/dist/nosql/eventhubs/index.d.ts +89 -0
  293. package/dist/nosql/eventstore/index.d.ts +102 -0
  294. package/dist/nosql/faunadb/index.d.ts +141 -0
  295. package/dist/nosql/faunadb/index.js +329 -0
  296. package/dist/nosql/firestore/index.d.ts +67 -0
  297. package/dist/nosql/fluree/index.d.ts +88 -0
  298. package/dist/nosql/fuseki/index.d.ts +94 -0
  299. package/dist/nosql/gcs/index.d.ts +62 -0
  300. package/dist/nosql/gearman/index.d.ts +77 -0
  301. package/dist/nosql/geode/index.d.ts +93 -0
  302. package/dist/nosql/graphdb/index.d.ts +86 -0
  303. package/dist/nosql/graylog/index.d.ts +118 -0
  304. package/dist/nosql/gridgain/index.d.ts +78 -0
  305. package/dist/nosql/hazelcast/index.d.ts +73 -0
  306. package/dist/nosql/hbase/index.d.ts +123 -0
  307. package/dist/nosql/ignite/index.d.ts +80 -0
  308. package/dist/nosql/immudb/index.d.ts +131 -0
  309. package/dist/nosql/index.d.ts +215 -0
  310. package/dist/nosql/infinispan/index.d.ts +95 -0
  311. package/dist/nosql/influxdb/flux-compiler.d.ts +23 -0
  312. package/dist/nosql/influxdb/flux-compiler.js +170 -0
  313. package/dist/nosql/influxdb/index.d.ts +300 -0
  314. package/dist/nosql/influxdb/index.js +0 -0
  315. package/dist/nosql/kafka/index.d.ts +113 -0
  316. package/dist/nosql/keyspaces/index.d.ts +122 -0
  317. package/dist/nosql/kinesis/index.d.ts +121 -0
  318. package/dist/nosql/leveldb/index.d.ts +112 -0
  319. package/dist/nosql/leveldb/index.js +103 -1
  320. package/dist/nosql/lmdb/index.d.ts +76 -0
  321. package/dist/nosql/loki/index.d.ts +126 -0
  322. package/dist/nosql/marklogic/index.d.ts +76 -0
  323. package/dist/nosql/materialize/index.d.ts +91 -0
  324. package/dist/nosql/meilisearch/index.d.ts +76 -0
  325. package/dist/nosql/memcached/index.d.ts +138 -0
  326. package/dist/nosql/milvus/index.d.ts +167 -0
  327. package/dist/nosql/minio/index.d.ts +122 -0
  328. package/dist/nosql/momento/index.d.ts +99 -0
  329. package/dist/nosql/mongodb/index.d.ts +265 -0
  330. package/dist/nosql/mongodb/index.js +139 -0
  331. package/dist/nosql/mongodb/where.d.ts +8 -0
  332. package/dist/nosql/mongodb/where.js +181 -0
  333. package/dist/nosql/nats/index.d.ts +139 -0
  334. package/dist/nosql/nedb/index.d.ts +79 -0
  335. package/dist/nosql/neo4j/index.d.ts +217 -0
  336. package/dist/nosql/neo4j/index.js +26 -14
  337. package/dist/nosql/neptune/index.d.ts +234 -0
  338. package/dist/nosql/neptune/index.js +23 -9
  339. package/dist/nosql/nsq/index.d.ts +93 -0
  340. package/dist/nosql/opensearch/index.d.ts +97 -0
  341. package/dist/nosql/orientdb/index.d.ts +72 -0
  342. package/dist/nosql/papertrail/index.d.ts +120 -0
  343. package/dist/nosql/pinecone/index.d.ts +148 -0
  344. package/dist/nosql/pinot/index.d.ts +90 -0
  345. package/dist/nosql/pouchdb/index.d.ts +95 -0
  346. package/dist/nosql/prometheus/index.d.ts +112 -0
  347. package/dist/nosql/provendb/index.d.ts +143 -0
  348. package/dist/nosql/provendb/index.js +262 -0
  349. package/dist/nosql/pubsub/index.d.ts +83 -0
  350. package/dist/nosql/pulsar/index.d.ts +105 -0
  351. package/dist/nosql/qdrant/index.d.ts +231 -0
  352. package/dist/nosql/qldb/index.d.ts +182 -0
  353. package/dist/nosql/qldb/index.js +302 -1
  354. package/dist/nosql/r2/index.d.ts +160 -0
  355. package/dist/nosql/rabbitmq/index.d.ts +131 -0
  356. package/dist/nosql/ravendb/index.d.ts +138 -0
  357. package/dist/nosql/ravendb/index.js +323 -9
  358. package/dist/nosql/ravendb/where.d.ts +38 -0
  359. package/dist/nosql/ravendb/where.js +94 -0
  360. package/dist/nosql/redis/index.d.ts +267 -0
  361. package/dist/nosql/redis/index.js +19 -5
  362. package/dist/nosql/redpanda/index.d.ts +117 -0
  363. package/dist/nosql/resque/index.d.ts +91 -0
  364. package/dist/nosql/rethinkdb/index.d.ts +194 -0
  365. package/dist/nosql/rethinkdb/index.js +290 -0
  366. package/dist/nosql/rethinkdb/where.d.ts +38 -0
  367. package/dist/nosql/rethinkdb/where.js +94 -0
  368. package/dist/nosql/rocksdb/document-layer.d.ts +162 -0
  369. package/dist/nosql/rocksdb/document-layer.js +338 -0
  370. package/dist/nosql/rocksdb/index.d.ts +112 -0
  371. package/dist/nosql/rocksdb/index.js +103 -1
  372. package/dist/nosql/rocksdb/where-match.d.ts +21 -0
  373. package/dist/nosql/rocksdb/where-match.js +238 -0
  374. package/dist/nosql/rockset/index.d.ts +84 -0
  375. package/dist/nosql/s3/index.d.ts +170 -0
  376. package/dist/nosql/scylladb/index.d.ts +117 -0
  377. package/dist/nosql/signoz/index.d.ts +116 -0
  378. package/dist/nosql/sns/index.d.ts +99 -0
  379. package/dist/nosql/solr/index.d.ts +129 -0
  380. package/dist/nosql/splunk/index.d.ts +125 -0
  381. package/dist/nosql/sqs/index.d.ts +116 -0
  382. package/dist/nosql/stardog/index.d.ts +86 -0
  383. package/dist/nosql/starrocks/index.d.ts +89 -0
  384. package/dist/nosql/store.d.ts +23 -0
  385. package/dist/nosql/sumologic/index.d.ts +119 -0
  386. package/dist/nosql/surrealdb/index.d.ts +156 -0
  387. package/dist/nosql/surrealdb/index.js +174 -1
  388. package/dist/nosql/surrealdb/query-compiler.d.ts +26 -0
  389. package/dist/nosql/surrealdb/query-compiler.js +193 -0
  390. package/dist/nosql/terminusdb/index.d.ts +95 -0
  391. package/dist/nosql/tigergraph/index.d.ts +314 -0
  392. package/dist/nosql/typesense/index.d.ts +82 -0
  393. package/dist/nosql/unqlite/index.d.ts +68 -0
  394. package/dist/nosql/upstash/index.d.ts +80 -0
  395. package/dist/nosql/vercel-kv/index.d.ts +82 -0
  396. package/dist/nosql/victoriametrics/index.d.ts +129 -0
  397. package/dist/nosql/virtuoso/index.d.ts +87 -0
  398. package/dist/nosql/weaviate/index.d.ts +196 -0
  399. package/dist/operators/index.d.ts +7 -0
  400. package/dist/operators.d.ts +2947 -0
  401. package/dist/operators.js +46 -1
  402. package/dist/prisma-migrate/index.d.ts +28 -0
  403. package/dist/prisma-migrate/migration-generator.d.ts +21 -0
  404. package/dist/prisma-migrate/model-generator.d.ts +12 -0
  405. package/dist/prisma-migrate/relations.d.ts +28 -0
  406. package/dist/prisma-migrate/schema-parser.d.ts +42 -0
  407. package/dist/prisma-migrate/type-mapper.d.ts +20 -0
  408. package/dist/prorm.d.ts +2093 -0
  409. package/dist/prorm.js +721 -302
  410. package/dist/query-builders/cte-builder.d.ts +104 -0
  411. package/dist/query-builders/functions/aggregate.d.ts +199 -0
  412. package/dist/query-builders/functions/conditional.d.ts +195 -0
  413. package/dist/query-builders/functions/datetime.d.ts +202 -0
  414. package/dist/query-builders/functions/fulltext.d.ts +220 -0
  415. package/dist/query-builders/functions/index.d.ts +17 -0
  416. package/dist/query-builders/functions/json.d.ts +157 -0
  417. package/dist/query-builders/functions/math.d.ts +215 -0
  418. package/dist/query-builders/functions/string.d.ts +233 -0
  419. package/dist/query-builders/functions/window.d.ts +209 -0
  420. package/dist/query-builders/include-builder.d.ts +85 -0
  421. package/dist/query-builders/index-expression-builder.d.ts +153 -0
  422. package/dist/query-builders/index.d.ts +121 -0
  423. package/dist/query-builders/index.js +10 -0
  424. package/dist/query-builders/insert-builder.d.ts +62 -0
  425. package/dist/query-builders/model-helpers.d.ts +28 -0
  426. package/dist/query-builders/order-limit-builder.d.ts +84 -0
  427. package/dist/query-builders/sql-compiler.d.ts +562 -0
  428. package/dist/query-builders/subquery-builder.d.ts +133 -0
  429. package/dist/query-builders/update-builder.d.ts +71 -0
  430. package/dist/query-builders/view-builder.d.ts +189 -0
  431. package/dist/query-builders/where-builder.d.ts +124 -0
  432. package/dist/query-interface.d.ts +407 -0
  433. package/dist/query-interface.js +84 -0
  434. package/dist/query-optimizers/batch-optimizer.d.ts +175 -0
  435. package/dist/query-optimizers/explain-plans.d.ts +187 -0
  436. package/dist/query-optimizers/index.d.ts +27 -0
  437. package/dist/query-optimizers/prepared-statement-cache.d.ts +252 -0
  438. package/dist/query-optimizers/query-hints.d.ts +201 -0
  439. package/dist/query-optimizers/query-optimizer.d.ts +162 -0
  440. package/dist/query-optimizers/slow-query-logger.d.ts +186 -0
  441. package/dist/replica-manager.d.ts +235 -0
  442. package/dist/schema/index.d.ts +7 -0
  443. package/dist/schema/migration-generator.d.ts +74 -0
  444. package/dist/schema/schema-differ.d.ts +114 -0
  445. package/dist/schema/types.d.ts +246 -0
  446. package/dist/schema-objects.d.ts +78 -0
  447. package/dist/schema-objects.js +203 -0
  448. package/dist/sql-constants.d.ts +240 -0
  449. package/dist/sqlite-advanced.d.ts +572 -0
  450. package/dist/streams/index.d.ts +5 -0
  451. package/dist/streams/transforms.d.ts +120 -0
  452. package/dist/transaction.d.ts +221 -0
  453. package/dist/types/index.d.ts +3123 -0
  454. package/dist/user-management.d.ts +141 -0
  455. package/dist/utils/date.d.ts +149 -0
  456. package/dist/utils/index.d.ts +359 -0
  457. package/dist/utils/string.d.ts +88 -0
  458. package/dist/validators/index.d.ts +7 -0
  459. package/dist/validators/validator.d.ts +306 -0
  460. package/package.json +20 -5
@@ -0,0 +1,285 @@
1
+ /**
2
+ * ArangoDB store implementation.
3
+ *
4
+ * ArangoDB is a multi-model database: it stores JSON documents (like a
5
+ * document store), lets those documents form named graphs (vertices/edges),
6
+ * and queries both shapes through a single query language, AQL. None of
7
+ * that fits the SQL-shaped `Dialect` interface (no `JOIN`, no relational
8
+ * schema, no `query(sql)` returning rows in the SQL sense), so this class
9
+ * implements the minimal `NoSqlStore` marker interface and exposes
10
+ * ArangoDB's real surface directly: collection management, document CRUD,
11
+ * parameterized AQL queries with cursor-based iteration, graph/edge
12
+ * operations (including AQL graph traversal), and index management.
13
+ *
14
+ * Uses the official `arangojs` driver (v10).
15
+ */
16
+ import type { Database } from 'arangojs';
17
+ import type { ConfigOptions } from 'arangojs/configuration';
18
+ import type { CreateCollectionOptions as ArangoCreateCollectionOptions, CollectionDescription, DropCollectionOptions } from 'arangojs/collections';
19
+ import type { Document as ArangoDocument, DocumentData, DocumentMetadata, DocumentOperationFailure, DocumentOperationMetadata, DocumentSelector, InsertDocumentOptions, Patch, ReadDocumentOptions, RemoveDocumentOptions, ReplaceDocumentOptions, UpdateDocumentOptions } from 'arangojs/documents';
20
+ import type { Cursor } from 'arangojs/cursors';
21
+ import type { QueryOptions } from 'arangojs/queries';
22
+ import type { CreateGraphOptions, EdgeDefinitionOptions, GraphDescription } from 'arangojs/graphs';
23
+ import type { IndexDescription, IndexSelector } from 'arangojs/indexes';
24
+ import { NoSqlStore } from '../store';
25
+ /**
26
+ * Connection options for `ArangoStore`.
27
+ *
28
+ * This is `arangojs`'s own `ConfigOptions` passed straight through: `url`
29
+ * (single URL or a list, for cluster/load-balanced setups), `databaseName`
30
+ * (defaults to `"_system"`), `auth` (`{ username, password }` or
31
+ * `{ token }`), plus pool size, load-balancing strategy, and fetch options.
32
+ */
33
+ export type ArangoStoreOptions = ConfigOptions;
34
+ /** Options for `createCollection()`/`createEdgeCollection()` (collection `type` is set by the method you call). */
35
+ export type ArangoCollectionOptions = Omit<ArangoCreateCollectionOptions, 'type'>;
36
+ /**
37
+ * Index types accepted by `createIndex()`.
38
+ *
39
+ * `"hash"` and `"skiplist"` are historical ArangoDB index type names that
40
+ * modern ArangoDB (3.12+) treats as aliases for `"persistent"` - both are
41
+ * accepted here and normalized to `"persistent"` before being sent to the
42
+ * server, so existing code/config referring to them by their old names
43
+ * keeps working.
44
+ */
45
+ export type ArangoIndexType = 'persistent' | 'hash' | 'skiplist' | 'geo' | 'fulltext' | 'ttl';
46
+ /** Options for `createIndex()`. Which fields are meaningful depends on `type`. */
47
+ export interface CreateIndexOptions {
48
+ type: ArangoIndexType;
49
+ /** Document fields the index covers (e.g. `['email']`, `['location']`). */
50
+ fields: string[];
51
+ /** Explicit index name. Auto-generated by the server if omitted. */
52
+ name?: string;
53
+ /** `persistent`/`hash`/`skiplist`: enforce uniqueness of the indexed field(s). */
54
+ unique?: boolean;
55
+ /** `persistent`/`hash`/`skiplist`/`geo`: exclude documents missing the indexed field(s). */
56
+ sparse?: boolean;
57
+ /** `geo`: interpret the indexed field as a GeoJSON object rather than `[lat, lon]`. */
58
+ geoJson?: boolean;
59
+ /** `fulltext`: minimum word length to index. */
60
+ minLength?: number;
61
+ /** `ttl`: seconds after the indexed timestamp field at which documents expire. */
62
+ expireAfter?: number;
63
+ /** Build the index without blocking other operations on the collection. */
64
+ inBackground?: boolean;
65
+ }
66
+ /** Direction of an AQL graph traversal. */
67
+ export type TraverseDirection = 'OUTBOUND' | 'INBOUND' | 'ANY';
68
+ /** Options for `traverse()`. */
69
+ export interface TraverseOptions {
70
+ /** Traversal direction relative to the start vertex. Default `'OUTBOUND'`. */
71
+ direction?: TraverseDirection;
72
+ /** Minimum traversal depth (1 = direct neighbors). Default `1`. */
73
+ minDepth?: number;
74
+ /** Maximum traversal depth. Default `1`. */
75
+ maxDepth?: number;
76
+ /**
77
+ * Raw AQL boolean expression appended as a `FILTER` clause, evaluated
78
+ * per visited path with `v` (vertex), `e` (edge), and `p` (path) bound as
79
+ * in a normal AQL graph traversal (e.g. `'v.active == true'`).
80
+ * Interpolated directly into the query - do not build this from
81
+ * unsanitized user input.
82
+ */
83
+ filter?: string;
84
+ /** Cap the number of visited paths returned. */
85
+ limit?: number;
86
+ }
87
+ /** One visited path from `traverse()`: the vertex reached, the edge taken to reach it (`null` at depth 0), and the full path. */
88
+ export interface TraversalResult<V = Record<string, unknown>, E = Record<string, unknown>> {
89
+ vertex: V;
90
+ edge: E | null;
91
+ path: {
92
+ vertices: V[];
93
+ edges: E[];
94
+ };
95
+ }
96
+ /** One `[field, direction]` ordering term, e.g. `['createdAt', 'DESC']`. */
97
+ export type OrderTerm = [string, 'ASC' | 'DESC'] | string;
98
+ /** Options for {@link ArangoStore.findAll}/{@link ArangoStore.findOne}. */
99
+ export interface ArangoFindOptions {
100
+ /** Ordering terms applied in sequence. A bare string sorts ascending. */
101
+ order?: OrderTerm | OrderTerm[];
102
+ /** Maximum number of documents to return. */
103
+ limit?: number;
104
+ /** Number of leading documents to skip (offset). */
105
+ offset?: number;
106
+ }
107
+ /** A group-aggregation request for {@link ArangoStore.aggregate}. */
108
+ export interface ArangoAggregateOptions {
109
+ /** ORM `where` filter applied before grouping. */
110
+ where?: Record<string | symbol, unknown>;
111
+ /** Field(s) to group by. Omit for a single whole-collection group. */
112
+ groupBy?: string | string[];
113
+ /** Emit a `count` per group. */
114
+ count?: boolean;
115
+ /** Fields to `sum` per group, keyed by output name → source field. */
116
+ sum?: Record<string, string>;
117
+ /** Fields to `avg` per group, keyed by output name → source field. */
118
+ avg?: Record<string, string>;
119
+ /** Fields to `min` per group, keyed by output name → source field. */
120
+ min?: Record<string, string>;
121
+ /** Fields to `max` per group, keyed by output name → source field. */
122
+ max?: Record<string, string>;
123
+ }
124
+ /**
125
+ * `ArangoStore` wraps the official `arangojs` driver's `Database`/
126
+ * `Collection`/`Graph`/`Cursor` API in a typed, promise-based convenience
127
+ * layer covering document CRUD, AQL queries, graphs, and indexes.
128
+ */
129
+ export declare class ArangoStore implements NoSqlStore {
130
+ readonly name = "arangodb";
131
+ readonly library = "arangojs";
132
+ private readonly options;
133
+ private db;
134
+ private connected;
135
+ constructor(options?: ArangoStoreOptions);
136
+ /**
137
+ * `arangojs`'s `Database` is a thin HTTP client wrapper with no persistent
138
+ * socket to open, so "connecting" here means constructing it and making
139
+ * one real request (`version()`) to fail fast on a bad URL/host/auth
140
+ * instead of only discovering the problem on the first real operation.
141
+ */
142
+ connect(): Promise<void>;
143
+ disconnect(): Promise<void>;
144
+ isConnected(): boolean;
145
+ /** Returns the underlying `arangojs` `Database` instance for anything not wrapped here. */
146
+ getClient(): Database;
147
+ private requireDb;
148
+ private exec;
149
+ /** Create a document collection. */
150
+ createCollection(collectionName: string, options?: ArangoCollectionOptions): Promise<CollectionDescription>;
151
+ /** Create an edge collection (documents store `_from`/`_to` and can be traversed as graph edges). */
152
+ createEdgeCollection(collectionName: string, options?: ArangoCollectionOptions): Promise<CollectionDescription>;
153
+ /** Drop a collection (document or edge). */
154
+ dropCollection(collectionName: string, options?: DropCollectionOptions): Promise<boolean>;
155
+ /** Whether a collection with this name exists. */
156
+ collectionExists(collectionName: string): Promise<boolean>;
157
+ /** List collections in the database (excludes system collections like `_users` by default). */
158
+ listCollections(excludeSystem?: boolean): Promise<CollectionDescription[]>;
159
+ /** Remove all documents from a collection without dropping the collection itself. */
160
+ truncateCollection(collectionName: string): Promise<void>;
161
+ /** Number of documents currently in a collection. */
162
+ collectionCount(collectionName: string): Promise<number>;
163
+ /** Insert a single document. Pass `_key` in `data` to choose the key explicitly; otherwise ArangoDB generates one. */
164
+ insert<T extends Record<string, unknown> = Record<string, unknown>>(collectionName: string, data: DocumentData<T>, options?: InsertDocumentOptions): Promise<DocumentOperationMetadata & {
165
+ new?: ArangoDocument<T>;
166
+ }>;
167
+ /** Insert multiple documents in one request. Per-document failures (e.g. duplicate `_key`) come back as entries with `error: true` rather than throwing. */
168
+ insertMany<T extends Record<string, unknown> = Record<string, unknown>>(collectionName: string, data: Array<DocumentData<T>>, options?: InsertDocumentOptions): Promise<Array<(DocumentOperationMetadata & {
169
+ new?: ArangoDocument<T>;
170
+ }) | DocumentOperationFailure>>;
171
+ /** Fetch a single document by key/id. Returns `null` if it does not exist (rather than throwing). */
172
+ getDocument<T extends Record<string, unknown> = Record<string, unknown>>(collectionName: string, selector: DocumentSelector, options?: Omit<ReadDocumentOptions, 'graceful'>): Promise<ArangoDocument<T> | null>;
173
+ /** Fetch multiple documents by key/id. Entries for documents that don't exist come back as `null`. */
174
+ getDocuments<T extends Record<string, unknown> = Record<string, unknown>>(collectionName: string, selectors: string[]): Promise<Array<ArangoDocument<T> | null>>;
175
+ /** Whether a document with this key/id exists in the collection. */
176
+ documentExists(collectionName: string, selector: DocumentSelector): Promise<boolean>;
177
+ /** Partially update a document (shallow/deep merge of `patch` into the existing document, per ArangoDB's `PATCH` semantics). */
178
+ updateDocument<T extends Record<string, unknown> = Record<string, unknown>>(collectionName: string, selector: DocumentSelector, patch: Patch<DocumentData<T>>, options?: UpdateDocumentOptions): Promise<DocumentOperationMetadata & {
179
+ new?: ArangoDocument<T>;
180
+ old?: ArangoDocument<T>;
181
+ }>;
182
+ /** Fully replace a document's content (unlike `updateDocument`, unspecified fields are dropped). */
183
+ replaceDocument<T extends Record<string, unknown> = Record<string, unknown>>(collectionName: string, selector: DocumentSelector, data: DocumentData<T>, options?: ReplaceDocumentOptions): Promise<DocumentOperationMetadata & {
184
+ new?: ArangoDocument<T>;
185
+ old?: ArangoDocument<T>;
186
+ }>;
187
+ /** Delete a single document by key/id. */
188
+ removeDocument(collectionName: string, selector: DocumentSelector, options?: RemoveDocumentOptions): Promise<DocumentMetadata>;
189
+ /** Delete multiple documents by key/id in one request. */
190
+ removeDocuments(collectionName: string, selectors: string[]): Promise<Array<DocumentMetadata | DocumentOperationFailure>>;
191
+ /**
192
+ * Run a parameterized AQL query and return the (cursor-based) result
193
+ * set as a native `arangojs` `Cursor` - iterate it with `for await`,
194
+ * `cursor.next()`, or `cursor.all()` to page through large result sets
195
+ * without loading everything into memory at once. Use `@name` in `query`
196
+ * for bind parameters and supply their values via `bindVars` (never
197
+ * string-interpolate untrusted values into `query` itself).
198
+ */
199
+ query<T = unknown>(query: string, bindVars?: Record<string, unknown>, options?: QueryOptions): Promise<Cursor<T>>;
200
+ /** Convenience wrapper around `query()` that depletes the cursor and returns all results as an array. */
201
+ queryAll<T = unknown>(query: string, bindVars?: Record<string, unknown>, options?: QueryOptions): Promise<T[]>;
202
+ /**
203
+ * Fetch all documents in `collectionName` matching an ORM `where` clause,
204
+ * with optional ordering, offset, and limit. The `where` object accepts the
205
+ * full ORM operator surface (`Op.gt`, `Op.in`, `Op.between`, `Op.like`,
206
+ * `Op.and`/`Op.or`, ...), compiled to a parameterized AQL `FILTER` (values
207
+ * and field names are always bound, never interpolated) - so standard
208
+ * queries never require hand-written AQL.
209
+ */
210
+ findAll<T = Record<string, unknown>>(collectionName: string, where?: Record<string | symbol, unknown>, options?: ArangoFindOptions): Promise<T[]>;
211
+ /** Fetch the first document in `collectionName` matching an ORM `where` clause (respecting `order`), or `null`. */
212
+ findOne<T = Record<string, unknown>>(collectionName: string, where?: Record<string | symbol, unknown>, options?: Omit<ArangoFindOptions, 'limit'>): Promise<T | null>;
213
+ /** Count documents in `collectionName` matching an ORM `where` clause. */
214
+ count(collectionName: string, where?: Record<string | symbol, unknown>): Promise<number>;
215
+ /**
216
+ * Update every document in `collectionName` matching an ORM `where` clause,
217
+ * merging `patch` into each. Returns the updated documents (`RETURN NEW`).
218
+ */
219
+ updateWhere<T = Record<string, unknown>>(collectionName: string, where: Record<string | symbol, unknown>, patch: Record<string, unknown>): Promise<T[]>;
220
+ /**
221
+ * Remove every document in `collectionName` matching an ORM `where` clause.
222
+ * Returns the removed documents (`RETURN OLD`).
223
+ */
224
+ removeWhere<T = Record<string, unknown>>(collectionName: string, where: Record<string | symbol, unknown>): Promise<T[]>;
225
+ /**
226
+ * Native AQL `UPSERT`: find a document matching `search`; if none exists
227
+ * insert `insert`, otherwise update the match with `update` (defaults to
228
+ * `insert`). Returns the resulting document (`RETURN NEW`).
229
+ */
230
+ upsert<T = Record<string, unknown>>(collectionName: string, search: Record<string, unknown>, insert: Record<string, unknown>, update?: Record<string, unknown>): Promise<T | null>;
231
+ /**
232
+ * Grouped aggregation over `collectionName` using AQL's native
233
+ * `COLLECT ... AGGREGATE` (`count`/`sum`/`avg`/`min`/`max`), with an optional
234
+ * ORM `where` pre-filter. Returns one entry per group: `{ group, ...aggregates }`
235
+ * (`group` is `null` when no `groupBy` is given).
236
+ */
237
+ aggregate(collectionName: string, options?: ArangoAggregateOptions): Promise<Array<Record<string, unknown>>>;
238
+ /**
239
+ * Create a named graph over one or more edge definitions (each mapping
240
+ * an edge collection to the vertex collection(s) it connects `from` and
241
+ * `to`). Collections referenced by the edge definitions that don't exist
242
+ * yet are created automatically by ArangoDB.
243
+ */
244
+ createGraph(graphName: string, edgeDefinitions: EdgeDefinitionOptions[], options?: CreateGraphOptions): Promise<GraphDescription>;
245
+ /** Drop a graph. If `dropCollections` is `true`, also drops the graph's vertex/edge collections (as long as they aren't used by another graph). */
246
+ dropGraph(graphName: string, dropCollections?: boolean): Promise<boolean>;
247
+ /** Whether a graph with this name exists. */
248
+ graphExists(graphName: string): Promise<boolean>;
249
+ /** List all graphs in the database. */
250
+ listGraphs(): Promise<GraphDescription[]>;
251
+ /** Add an existing (or new) vertex collection to a graph as an orphan collection (not tied to a specific edge definition). */
252
+ addVertexCollection(graphName: string, collectionName: string): Promise<GraphDescription>;
253
+ /** Add a new edge definition to an existing graph. */
254
+ addEdgeDefinition(graphName: string, edgeDefinition: EdgeDefinitionOptions): Promise<GraphDescription>;
255
+ /** Insert an edge document into an edge collection, connecting `from` and `to` (each a document `_id`, e.g. `'people/alice'`). */
256
+ insertEdge<T extends Record<string, unknown> = Record<string, unknown>>(edgeCollectionName: string, from: string, to: string, data?: T, options?: InsertDocumentOptions): Promise<DocumentOperationMetadata & {
257
+ new?: ArangoDocument<T>;
258
+ }>;
259
+ /**
260
+ * Traverse a named graph from a start vertex using AQL's
261
+ * `FOR v, e, p IN min..max DIRECTION start GRAPH graphName` syntax,
262
+ * returning each visited vertex (`v`), the edge that reached it (`e`,
263
+ * `null` at depth 0), and the full path (`p`) as vertex/edge arrays.
264
+ *
265
+ * @param startVertexId - Start vertex `_id`, e.g. `'people/alice'`.
266
+ * @param graphName - Name of a graph created with `createGraph()`.
267
+ */
268
+ traverse<V extends Record<string, unknown> = Record<string, unknown>, E extends Record<string, unknown> = Record<string, unknown>>(startVertexId: string, graphName: string, options?: TraverseOptions): Promise<TraversalResult<V, E>[]>;
269
+ /** Create an index on a collection. `type: 'hash'`/`'skiplist'` are normalized to `'persistent'` (see `ArangoIndexType`). */
270
+ createIndex(collectionName: string, options: CreateIndexOptions): Promise<IndexDescription>;
271
+ /** Drop an index by id or name. */
272
+ dropIndex(collectionName: string, selector: IndexSelector): Promise<boolean>;
273
+ /** List all indexes on a collection (including the automatic primary/edge indexes). */
274
+ listIndexes(collectionName: string): Promise<IndexDescription[]>;
275
+ /** Fetch a single index's description by id or name. */
276
+ getIndex(collectionName: string, selector: IndexSelector): Promise<IndexDescription>;
277
+ /**
278
+ * Resolve a `{ name }`-only `IndexSelector` to an `{ id }` one by looking
279
+ * it up via `listIndexes()` first. String selectors and selectors that
280
+ * already carry an `id` are passed through unchanged - see
281
+ * `isNameOnlySelector()` for why this is necessary.
282
+ */
283
+ private resolveIndexSelector;
284
+ }
285
+ export default ArangoStore;
@@ -16,8 +16,25 @@
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.ArangoStore = void 0;
19
- const arangojs_1 = require("arangojs");
19
+ // Lazily-loaded `arangojs` driver. Required only when a connection is opened,
20
+ // so importing this ORM never loads the arangojs driver.
21
+ let arangojsModule = null;
22
+ function loadArangoJs() {
23
+ if (!arangojsModule) {
24
+ try {
25
+ arangojsModule = require('arangojs');
26
+ }
27
+ catch (err) {
28
+ throw new Error("The 'arangojs' package is required to use the ArangoDB store but could not be loaded. " +
29
+ 'Install it with `npm install arangojs`. Original error: ' +
30
+ (err instanceof Error ? err.message : String(err)));
31
+ }
32
+ }
33
+ return arangojsModule;
34
+ }
20
35
  const errors_1 = require("../../errors");
36
+ const operators_1 = require("../../operators");
37
+ const where_1 = require("./where");
21
38
  function wrapConnectionError(err, url) {
22
39
  const parent = err instanceof Error ? err : new Error(String(err));
23
40
  const host = Array.isArray(url) ? url[0] : url;
@@ -35,6 +52,145 @@ function wrapDatabaseError(err, message) {
35
52
  const combined = message ? `${message}: ${parent.message}` : parent.message;
36
53
  return errors_1.DatabaseError.from(parent, { message: combined });
37
54
  }
55
+ /**
56
+ * Accumulates AQL bind variables while building a query, minting unique
57
+ * `@vN` names so untrusted values (and dynamic field names) are always sent
58
+ * as bind parameters rather than string-interpolated into the query.
59
+ */
60
+ class AqlBinder {
61
+ constructor() {
62
+ this.counter = 0;
63
+ this.bindVars = {};
64
+ }
65
+ /** Bind a value and return its `@vN` placeholder for interpolation into the query. */
66
+ add(value) {
67
+ const name = `v${this.counter++}`;
68
+ this.bindVars[name] = value;
69
+ return `@${name}`;
70
+ }
71
+ }
72
+ /** Escape a literal for an AQL `LIKE` pattern (`%`, `_`, and `\` are special). */
73
+ function escapeAqlLike(s) {
74
+ return s.replace(/[\\%_]/g, '\\$&');
75
+ }
76
+ /**
77
+ * Render a {@link WhereNode} tree into an AQL boolean expression over the loop
78
+ * variable `docVar` (e.g. `doc`), binding all values/field names through
79
+ * `binder`. This is what lets callers pass ORM `where` clauses instead of
80
+ * hand-writing AQL FILTER expressions.
81
+ */
82
+ function buildAqlFilter(node, docVar, binder) {
83
+ switch (node.kind) {
84
+ case 'true':
85
+ return 'true';
86
+ case 'and': {
87
+ const parts = node.nodes.map((n) => buildAqlFilter(n, docVar, binder));
88
+ return parts.length ? `(${parts.join(' AND ')})` : 'true';
89
+ }
90
+ case 'or': {
91
+ const parts = node.nodes.map((n) => buildAqlFilter(n, docVar, binder));
92
+ return parts.length ? `(${parts.join(' OR ')})` : 'false';
93
+ }
94
+ case 'not':
95
+ return `NOT (${buildAqlFilter(node.node, docVar, binder)})`;
96
+ case 'cmp':
97
+ return buildAqlCmp(node.field, node.op, node.value, docVar, binder);
98
+ }
99
+ }
100
+ function buildAqlCmp(field, op, value, docVar, binder) {
101
+ // Dynamic, injection-safe attribute access: doc[@vN] with field name bound.
102
+ const lhs = `${docVar}[${binder.add(field)}]`;
103
+ switch (op) {
104
+ case operators_1.Op.eq:
105
+ return `${lhs} == ${binder.add(value)}`;
106
+ case operators_1.Op.ne:
107
+ return `${lhs} != ${binder.add(value)}`;
108
+ case operators_1.Op.gt:
109
+ return `${lhs} > ${binder.add(value)}`;
110
+ case operators_1.Op.gte:
111
+ return `${lhs} >= ${binder.add(value)}`;
112
+ case operators_1.Op.lt:
113
+ return `${lhs} < ${binder.add(value)}`;
114
+ case operators_1.Op.lte:
115
+ return `${lhs} <= ${binder.add(value)}`;
116
+ case operators_1.Op.in:
117
+ return `${lhs} IN ${binder.add(value)}`;
118
+ case operators_1.Op.notIn:
119
+ return `${lhs} NOT IN ${binder.add(value)}`;
120
+ case operators_1.Op.between: {
121
+ const [lo, hi] = value;
122
+ return `(${lhs} >= ${binder.add(lo)} AND ${lhs} <= ${binder.add(hi)})`;
123
+ }
124
+ case operators_1.Op.notBetween: {
125
+ const [lo, hi] = value;
126
+ return `NOT (${lhs} >= ${binder.add(lo)} AND ${lhs} <= ${binder.add(hi)})`;
127
+ }
128
+ case operators_1.Op.isNull:
129
+ return `${lhs} == null`;
130
+ case operators_1.Op.isNotNull:
131
+ return `${lhs} != null`;
132
+ case operators_1.Op.like:
133
+ return `LIKE(${lhs}, ${binder.add(value)}, false)`;
134
+ case operators_1.Op.iLike:
135
+ return `LIKE(${lhs}, ${binder.add(value)}, true)`;
136
+ case operators_1.Op.notLike:
137
+ return `NOT LIKE(${lhs}, ${binder.add(value)}, false)`;
138
+ case operators_1.Op.notILike:
139
+ return `NOT LIKE(${lhs}, ${binder.add(value)}, true)`;
140
+ case operators_1.Op.startsWith:
141
+ return `LIKE(${lhs}, ${binder.add(`${escapeAqlLike(String(value))}%`)}, false)`;
142
+ case operators_1.Op.endsWith:
143
+ return `LIKE(${lhs}, ${binder.add(`%${escapeAqlLike(String(value))}`)}, false)`;
144
+ case operators_1.Op.substring:
145
+ case operators_1.Op.contains:
146
+ return `LIKE(${lhs}, ${binder.add(`%${escapeAqlLike(String(value))}%`)}, false)`;
147
+ case operators_1.Op.regexp:
148
+ return `REGEX_TEST(${lhs}, ${binder.add(String(value))}, false)`;
149
+ case operators_1.Op.iRegexp:
150
+ return `REGEX_TEST(${lhs}, ${binder.add(String(value))}, true)`;
151
+ case operators_1.Op.notRegexp:
152
+ return `NOT REGEX_TEST(${lhs}, ${binder.add(String(value))}, false)`;
153
+ case operators_1.Op.notIRegexp:
154
+ return `NOT REGEX_TEST(${lhs}, ${binder.add(String(value))}, true)`;
155
+ default:
156
+ throw new errors_1.DatabaseError(`ArangoDB: unsupported where operator "${op.toString()}"`, {
157
+ code: errors_1.ErrorCodes.QUERY_ERROR,
158
+ });
159
+ }
160
+ }
161
+ /** Build an AQL `SORT` clause from ordering terms, binding field names safely. */
162
+ function buildAqlSort(order, docVar, binder) {
163
+ if (order === undefined)
164
+ return '';
165
+ const single = Array.isArray(order) && order.length === 2 && typeof order[0] === 'string' && (order[1] === 'ASC' || order[1] === 'DESC');
166
+ const terms = (Array.isArray(order) && !single ? order : [order]);
167
+ const parts = terms.map((term) => {
168
+ if (typeof term === 'string')
169
+ return `${docVar}[${binder.add(term)}] ASC`;
170
+ return `${docVar}[${binder.add(term[0])}] ${term[1] === 'DESC' ? 'DESC' : 'ASC'}`;
171
+ });
172
+ return parts.length ? `SORT ${parts.join(', ')}` : '';
173
+ }
174
+ /**
175
+ * Validate an aggregate output alias is a safe AQL identifier before it is
176
+ * interpolated as a `COLLECT ... AGGREGATE` variable and result key (aliases
177
+ * are identifiers, not values, so they cannot be bind parameters).
178
+ */
179
+ function sanitizeAlias(alias) {
180
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(alias)) {
181
+ throw new errors_1.DatabaseError(`ArangoDB: invalid aggregate alias "${alias}" (must be a valid identifier)`, {
182
+ code: errors_1.ErrorCodes.QUERY_ERROR,
183
+ });
184
+ }
185
+ return alias;
186
+ }
187
+ /** Validate that a value is a non-negative integer (for inlining into AQL `LIMIT`). */
188
+ function requireNonNegInt(value, label) {
189
+ if (!Number.isInteger(value) || value < 0) {
190
+ throw new errors_1.DatabaseError(`ArangoDB: ${label} must be a non-negative integer`, { code: errors_1.ErrorCodes.QUERY_ERROR });
191
+ }
192
+ return value;
193
+ }
38
194
  /** Normalize `"hash"`/`"skiplist"` (legacy names) to `"persistent"`, the type ArangoDB 3.12+ actually stores them as. */
39
195
  function normalizeIndexType(type) {
40
196
  return type === 'hash' || type === 'skiplist' ? 'persistent' : type;
@@ -81,7 +237,7 @@ class ArangoStore {
81
237
  return;
82
238
  }
83
239
  try {
84
- const db = new arangojs_1.Database(this.options);
240
+ const db = new (loadArangoJs().Database)(this.options);
85
241
  await db.version();
86
242
  this.db = db;
87
243
  this.connected = true;
@@ -235,6 +391,122 @@ class ArangoStore {
235
391
  return cursor.all();
236
392
  }
237
393
  // ---------------------------------------------------------------------
394
+ // ORM-shaped queries (no hand-written AQL required)
395
+ // ---------------------------------------------------------------------
396
+ /**
397
+ * Fetch all documents in `collectionName` matching an ORM `where` clause,
398
+ * with optional ordering, offset, and limit. The `where` object accepts the
399
+ * full ORM operator surface (`Op.gt`, `Op.in`, `Op.between`, `Op.like`,
400
+ * `Op.and`/`Op.or`, ...), compiled to a parameterized AQL `FILTER` (values
401
+ * and field names are always bound, never interpolated) - so standard
402
+ * queries never require hand-written AQL.
403
+ */
404
+ async findAll(collectionName, where = {}, options = {}) {
405
+ const binder = new AqlBinder();
406
+ binder.bindVars['@col'] = collectionName;
407
+ const filter = buildAqlFilter((0, where_1.parseWhere)(where), 'doc', binder);
408
+ const sort = buildAqlSort(options.order, 'doc', binder);
409
+ let limitClause = '';
410
+ if (typeof options.limit === 'number' || typeof options.offset === 'number') {
411
+ const offset = requireNonNegInt(options.offset ?? 0, 'offset');
412
+ const limit = requireNonNegInt(options.limit ?? Number.MAX_SAFE_INTEGER, 'limit');
413
+ limitClause = `LIMIT ${offset}, ${limit}`;
414
+ }
415
+ const aql = `FOR doc IN @@col FILTER ${filter} ${sort} ${limitClause} RETURN doc`;
416
+ return this.queryAll(aql, binder.bindVars);
417
+ }
418
+ /** Fetch the first document in `collectionName` matching an ORM `where` clause (respecting `order`), or `null`. */
419
+ async findOne(collectionName, where = {}, options = {}) {
420
+ const rows = await this.findAll(collectionName, where, { ...options, limit: 1 });
421
+ return rows.length > 0 ? rows[0] : null;
422
+ }
423
+ /** Count documents in `collectionName` matching an ORM `where` clause. */
424
+ async count(collectionName, where = {}) {
425
+ const binder = new AqlBinder();
426
+ binder.bindVars['@col'] = collectionName;
427
+ const filter = buildAqlFilter((0, where_1.parseWhere)(where), 'doc', binder);
428
+ const aql = `FOR doc IN @@col FILTER ${filter} COLLECT WITH COUNT INTO n RETURN n`;
429
+ const rows = await this.queryAll(aql, binder.bindVars);
430
+ return rows[0] ?? 0;
431
+ }
432
+ /**
433
+ * Update every document in `collectionName` matching an ORM `where` clause,
434
+ * merging `patch` into each. Returns the updated documents (`RETURN NEW`).
435
+ */
436
+ async updateWhere(collectionName, where, patch) {
437
+ const binder = new AqlBinder();
438
+ binder.bindVars['@col'] = collectionName;
439
+ const filter = buildAqlFilter((0, where_1.parseWhere)(where), 'doc', binder);
440
+ const patchRef = binder.add(patch);
441
+ const aql = `FOR doc IN @@col FILTER ${filter} UPDATE doc WITH ${patchRef} IN @@col RETURN NEW`;
442
+ return this.queryAll(aql, binder.bindVars);
443
+ }
444
+ /**
445
+ * Remove every document in `collectionName` matching an ORM `where` clause.
446
+ * Returns the removed documents (`RETURN OLD`).
447
+ */
448
+ async removeWhere(collectionName, where) {
449
+ const binder = new AqlBinder();
450
+ binder.bindVars['@col'] = collectionName;
451
+ const filter = buildAqlFilter((0, where_1.parseWhere)(where), 'doc', binder);
452
+ const aql = `FOR doc IN @@col FILTER ${filter} REMOVE doc IN @@col RETURN OLD`;
453
+ return this.queryAll(aql, binder.bindVars);
454
+ }
455
+ /**
456
+ * Native AQL `UPSERT`: find a document matching `search`; if none exists
457
+ * insert `insert`, otherwise update the match with `update` (defaults to
458
+ * `insert`). Returns the resulting document (`RETURN NEW`).
459
+ */
460
+ async upsert(collectionName, search, insert, update) {
461
+ const binder = new AqlBinder();
462
+ binder.bindVars['@col'] = collectionName;
463
+ const searchRef = binder.add(search);
464
+ const insertRef = binder.add(insert);
465
+ const updateRef = binder.add(update ?? insert);
466
+ const aql = `UPSERT ${searchRef} INSERT ${insertRef} UPDATE ${updateRef} IN @@col RETURN NEW`;
467
+ const rows = await this.queryAll(aql, binder.bindVars);
468
+ return rows.length > 0 ? rows[0] : null;
469
+ }
470
+ /**
471
+ * Grouped aggregation over `collectionName` using AQL's native
472
+ * `COLLECT ... AGGREGATE` (`count`/`sum`/`avg`/`min`/`max`), with an optional
473
+ * ORM `where` pre-filter. Returns one entry per group: `{ group, ...aggregates }`
474
+ * (`group` is `null` when no `groupBy` is given).
475
+ */
476
+ async aggregate(collectionName, options = {}) {
477
+ const binder = new AqlBinder();
478
+ binder.bindVars['@col'] = collectionName;
479
+ const filter = buildAqlFilter((0, where_1.parseWhere)(options.where ?? {}), 'doc', binder);
480
+ const groupFields = options.groupBy
481
+ ? Array.isArray(options.groupBy)
482
+ ? options.groupBy
483
+ : [options.groupBy]
484
+ : [];
485
+ const collectParts = groupFields.map((f, i) => `g${i} = doc[${binder.add(f)}]`);
486
+ const aggParts = [];
487
+ const hasOtherAgg = !!(options.sum || options.avg || options.min || options.max);
488
+ if (options.count || !hasOtherAgg)
489
+ aggParts.push('count = LENGTH(doc)');
490
+ for (const [out, src] of Object.entries(options.sum ?? {}))
491
+ aggParts.push(`${sanitizeAlias(out)} = SUM(doc[${binder.add(src)}])`);
492
+ for (const [out, src] of Object.entries(options.avg ?? {}))
493
+ aggParts.push(`${sanitizeAlias(out)} = AVERAGE(doc[${binder.add(src)}])`);
494
+ for (const [out, src] of Object.entries(options.min ?? {}))
495
+ aggParts.push(`${sanitizeAlias(out)} = MIN(doc[${binder.add(src)}])`);
496
+ for (const [out, src] of Object.entries(options.max ?? {}))
497
+ aggParts.push(`${sanitizeAlias(out)} = MAX(doc[${binder.add(src)}])`);
498
+ const collectClause = collectParts.length ? `COLLECT ${collectParts.join(', ')}` : 'COLLECT';
499
+ const aggregateClause = aggParts.length ? `AGGREGATE ${aggParts.join(', ')}` : '';
500
+ const groupExpr = groupFields.length === 0
501
+ ? 'null'
502
+ : groupFields.length === 1
503
+ ? 'g0'
504
+ : `[${groupFields.map((_, i) => `g${i}`).join(', ')}]`;
505
+ const returnFields = ['group: ' + groupExpr, ...aggParts.map((p) => p.split(' = ')[0]).map((a) => `${a}: ${a}`)];
506
+ const aql = `FOR doc IN @@col FILTER ${filter} ${collectClause} ${aggregateClause} RETURN { ${returnFields.join(', ')} }`;
507
+ return this.queryAll(aql, binder.bindVars);
508
+ }
509
+ // ---------------------------------------------------------------------
238
510
  // Graphs
239
511
  // ---------------------------------------------------------------------
240
512
  /**
@@ -0,0 +1,38 @@
1
+ /** A single field comparison, e.g. `age >= 18`. */
2
+ export interface CmpNode {
3
+ kind: 'cmp';
4
+ field: string;
5
+ op: symbol;
6
+ value: unknown;
7
+ }
8
+ /** A normalized boolean tree produced by {@link parseWhere}. */
9
+ export type WhereNode = CmpNode | {
10
+ kind: 'and';
11
+ nodes: WhereNode[];
12
+ } | {
13
+ kind: 'or';
14
+ nodes: WhereNode[];
15
+ } | {
16
+ kind: 'not';
17
+ node: WhereNode;
18
+ } | {
19
+ kind: 'true';
20
+ };
21
+ /**
22
+ * Parse an ORM `where` object into a {@link WhereNode} tree.
23
+ *
24
+ * - String keys are field conditions: a scalar means equality, an array means
25
+ * `Op.in`, and a nested `{ [Op.*]: value }` object expands to one comparison
26
+ * per operator.
27
+ * - `Op.and`/`Op.or` take an array of sub-`where` objects; `Op.not` negates a
28
+ * single sub-`where`.
29
+ */
30
+ export declare function parseWhere(where: Record<string | symbol, unknown> | undefined | null): WhereNode;
31
+ /** Escape a string for safe inclusion in a regular expression. */
32
+ export declare function escapeRegex(s: string): string;
33
+ /**
34
+ * Translate a SQL `LIKE`/`ILIKE` pattern into an anchored regular expression
35
+ * (`%` → `.*`, `_` → `.`), so stores that only speak regex can honor ORM
36
+ * `Op.like` queries without the caller hand-writing a pattern.
37
+ */
38
+ export declare function likeToRegex(pattern: string, caseInsensitive?: boolean): string;