ts-prorm-orm 1.1.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.
Files changed (310) hide show
  1. package/CHANGELOG.md +1111 -0
  2. package/LICENSE +21 -0
  3. package/README.md +573 -0
  4. package/dist/audit/history-query.js +180 -0
  5. package/dist/audit/index.js +23 -0
  6. package/dist/audit/logger.js +236 -0
  7. package/dist/cache/cache-manager.js +84 -0
  8. package/dist/cache/index.js +16 -0
  9. package/dist/cache/redis-cluster-cache.js +557 -0
  10. package/dist/cli.js +2200 -0
  11. package/dist/compliance/audit-trail.js +68 -0
  12. package/dist/compliance/backup-verification.js +685 -0
  13. package/dist/compliance/breach-detector.js +505 -0
  14. package/dist/compliance/consent-record.js +227 -0
  15. package/dist/compliance/consent-versioning.js +331 -0
  16. package/dist/compliance/cross-border-log.js +530 -0
  17. package/dist/compliance/data-classifier.js +258 -0
  18. package/dist/compliance/data-lineage.js +565 -0
  19. package/dist/compliance/data-masker.js +303 -0
  20. package/dist/compliance/data-portability.js +265 -0
  21. package/dist/compliance/data-retention.js +195 -0
  22. package/dist/compliance/dsar-workflow.js +342 -0
  23. package/dist/compliance/field-encryption.js +223 -0
  24. package/dist/compliance/immutable-record.js +148 -0
  25. package/dist/compliance/index.js +260 -0
  26. package/dist/compliance/privacy-impact-assessment.js +364 -0
  27. package/dist/compliance/pseudonymization.js +269 -0
  28. package/dist/compliance/query-firewall.js +1182 -0
  29. package/dist/compliance/rate-limiter.js +580 -0
  30. package/dist/compliance/right-to-erasure.js +117 -0
  31. package/dist/compliance/row-level-security.js +246 -0
  32. package/dist/compliance/security-decorator.js +574 -0
  33. package/dist/compliance/security-monitor.js +525 -0
  34. package/dist/compliance/sensitive-data-discovery.js +476 -0
  35. package/dist/compliance/session-isolation.js +472 -0
  36. package/dist/compliance/tls-enforcer.js +108 -0
  37. package/dist/compliance/worm-storage.js +712 -0
  38. package/dist/connection-manager.js +198 -0
  39. package/dist/connection-pool.js +519 -0
  40. package/dist/decorators/audit.js +136 -0
  41. package/dist/decorators/belongs-to-many.js +115 -0
  42. package/dist/decorators/belongs-to.js +115 -0
  43. package/dist/decorators/check.js +435 -0
  44. package/dist/decorators/collate.js +329 -0
  45. package/dist/decorators/comment.js +205 -0
  46. package/dist/decorators/database-settings.js +236 -0
  47. package/dist/decorators/default.js +244 -0
  48. package/dist/decorators/encryption.js +235 -0
  49. package/dist/decorators/engine.js +97 -0
  50. package/dist/decorators/fk-constraints.js +594 -0
  51. package/dist/decorators/foreign-table.js +136 -0
  52. package/dist/decorators/generated.js +274 -0
  53. package/dist/decorators/has-many.js +127 -0
  54. package/dist/decorators/has-one.js +116 -0
  55. package/dist/decorators/hstore.js +129 -0
  56. package/dist/decorators/index.js +355 -0
  57. package/dist/decorators/json-column.js +83 -0
  58. package/dist/decorators/jsonb.js +101 -0
  59. package/dist/decorators/orm-decorators.js +425 -0
  60. package/dist/decorators/permissions.js +294 -0
  61. package/dist/decorators/procedure.js +210 -0
  62. package/dist/decorators/query-options.js +556 -0
  63. package/dist/decorators/range.js +167 -0
  64. package/dist/decorators/set-column.js +83 -0
  65. package/dist/decorators/spatial.js +114 -0
  66. package/dist/decorators/storage.js +580 -0
  67. package/dist/decorators/timezone.js +512 -0
  68. package/dist/decorators/trigger.js +90 -0
  69. package/dist/decorators/uuid.js +135 -0
  70. package/dist/decorators/view.js +258 -0
  71. package/dist/diagrams/chen-diagram.js +354 -0
  72. package/dist/diagrams/class-diagram.js +384 -0
  73. package/dist/diagrams/dependency-diagram.js +432 -0
  74. package/dist/diagrams/er-diagram.js +605 -0
  75. package/dist/diagrams/flow-diagram.js +394 -0
  76. package/dist/diagrams/gantt-diagram.js +411 -0
  77. package/dist/diagrams/index-diagram.js +353 -0
  78. package/dist/diagrams/index.js +184 -0
  79. package/dist/diagrams/migration-diagram.js +316 -0
  80. package/dist/diagrams/model-diagram.js +616 -0
  81. package/dist/diagrams/package-diagram.js +376 -0
  82. package/dist/diagrams/palette.js +85 -0
  83. package/dist/diagrams/relational-diagram.js +455 -0
  84. package/dist/diagrams/schemadoc-diagram.js +309 -0
  85. package/dist/diagrams/sequence-diagram.js +307 -0
  86. package/dist/diagrams/state-diagram.js +344 -0
  87. package/dist/diagrams/svg-dom.js +111 -0
  88. package/dist/diagrams/tree-diagram.js +250 -0
  89. package/dist/dialects/clickhouse/index.js +1742 -0
  90. package/dist/dialects/cockroachdb/index.js +4677 -0
  91. package/dist/dialects/cratedb/index.js +441 -0
  92. package/dist/dialects/databricks/index.js +517 -0
  93. package/dist/dialects/db2/index.js +2225 -0
  94. package/dist/dialects/dialect.js +720 -0
  95. package/dist/dialects/duckdb/index.js +2014 -0
  96. package/dist/dialects/exasol/index.js +357 -0
  97. package/dist/dialects/firebird/index.js +495 -0
  98. package/dist/dialects/greenplum/index.js +457 -0
  99. package/dist/dialects/hana/index.js +1741 -0
  100. package/dist/dialects/mariadb/index.js +3590 -0
  101. package/dist/dialects/mssql/index.js +2296 -0
  102. package/dist/dialects/mysql/index.js +4058 -0
  103. package/dist/dialects/oracle/index.js +2999 -0
  104. package/dist/dialects/postgres/index.js +5319 -0
  105. package/dist/dialects/query-stream-helper.js +152 -0
  106. package/dist/dialects/questdb/index.js +433 -0
  107. package/dist/dialects/redshift/index.js +2277 -0
  108. package/dist/dialects/singlestore/index.js +354 -0
  109. package/dist/dialects/snowflake/index.js +2082 -0
  110. package/dist/dialects/spanner/index.js +1768 -0
  111. package/dist/dialects/sqlite/index.js +3382 -0
  112. package/dist/dialects/tidb/index.js +377 -0
  113. package/dist/dialects/timescaledb/index.js +164 -0
  114. package/dist/dialects/trino/index.js +420 -0
  115. package/dist/dialects/turso/index.js +227 -0
  116. package/dist/dialects/vertica/index.js +317 -0
  117. package/dist/dialects/yugabytedb/index.js +424 -0
  118. package/dist/errors/index.js +472 -0
  119. package/dist/errors/utils.js +340 -0
  120. package/dist/errors.js +21 -0
  121. package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
  122. package/dist/extensions/catalog/mssql-features.js +147 -0
  123. package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
  124. package/dist/extensions/catalog/oracle-db2-features.js +196 -0
  125. package/dist/extensions/catalog/postgres-extensions.js +516 -0
  126. package/dist/extensions/index.js +71 -0
  127. package/dist/extensions/types.js +13 -0
  128. package/dist/foreign-data.js +173 -0
  129. package/dist/hooks/hooks-manager.js +350 -0
  130. package/dist/hooks/index.js +37 -0
  131. package/dist/index.js +463 -0
  132. package/dist/logging.js +335 -0
  133. package/dist/migrations/index.js +40 -0
  134. package/dist/migrations/migration.js +196 -0
  135. package/dist/migrations/migrator.js +411 -0
  136. package/dist/migrations/prormmigration.js +275 -0
  137. package/dist/migrations/query-interface.js +435 -0
  138. package/dist/migrations/seeder.js +353 -0
  139. package/dist/models/associations.js +852 -0
  140. package/dist/models/constraints.js +288 -0
  141. package/dist/models/data-types.js +2518 -0
  142. package/dist/models/decorators.js +445 -0
  143. package/dist/models/index.js +33 -0
  144. package/dist/models/indexes.js +531 -0
  145. package/dist/models/methods.js +382 -0
  146. package/dist/models/model-manager.js +103 -0
  147. package/dist/models/model.js +5349 -0
  148. package/dist/models/operators.js +67 -0
  149. package/dist/models/scopes.js +189 -0
  150. package/dist/models/typescript-types.js +26 -0
  151. package/dist/nosql/aerospike/index.js +205 -0
  152. package/dist/nosql/allegrograph/index.js +169 -0
  153. package/dist/nosql/arangodb/index.js +364 -0
  154. package/dist/nosql/azure-blob/index.js +206 -0
  155. package/dist/nosql/beanstalkd/index.js +231 -0
  156. package/dist/nosql/beequeue/index.js +210 -0
  157. package/dist/nosql/bigchaindb/index.js +195 -0
  158. package/dist/nosql/bigtable/index.js +224 -0
  159. package/dist/nosql/blazegraph/index.js +173 -0
  160. package/dist/nosql/bullmq/index.js +191 -0
  161. package/dist/nosql/cassandra/index.js +174 -0
  162. package/dist/nosql/chroma/index.js +190 -0
  163. package/dist/nosql/cloudflare-kv/index.js +220 -0
  164. package/dist/nosql/coherence/index.js +200 -0
  165. package/dist/nosql/cosmosdb/index.js +157 -0
  166. package/dist/nosql/couchbase/index.js +213 -0
  167. package/dist/nosql/dax/index.js +212 -0
  168. package/dist/nosql/deno-kv/index.js +206 -0
  169. package/dist/nosql/dgraph/index.js +171 -0
  170. package/dist/nosql/doris/index.js +169 -0
  171. package/dist/nosql/druid/index.js +162 -0
  172. package/dist/nosql/dynamodb/index.js +937 -0
  173. package/dist/nosql/elasticsearch/index.js +377 -0
  174. package/dist/nosql/etcd/index.js +502 -0
  175. package/dist/nosql/eventhubs/index.js +213 -0
  176. package/dist/nosql/eventstore/index.js +254 -0
  177. package/dist/nosql/faunadb/index.js +188 -0
  178. package/dist/nosql/firestore/index.js +177 -0
  179. package/dist/nosql/fluree/index.js +148 -0
  180. package/dist/nosql/fuseki/index.js +170 -0
  181. package/dist/nosql/gcs/index.js +172 -0
  182. package/dist/nosql/gearman/index.js +160 -0
  183. package/dist/nosql/geode/index.js +196 -0
  184. package/dist/nosql/graphdb/index.js +169 -0
  185. package/dist/nosql/graylog/index.js +188 -0
  186. package/dist/nosql/gridgain/index.js +171 -0
  187. package/dist/nosql/hazelcast/index.js +162 -0
  188. package/dist/nosql/hbase/index.js +230 -0
  189. package/dist/nosql/ignite/index.js +173 -0
  190. package/dist/nosql/immudb/index.js +184 -0
  191. package/dist/nosql/index.js +232 -0
  192. package/dist/nosql/infinispan/index.js +200 -0
  193. package/dist/nosql/influxdb/index.js +0 -0
  194. package/dist/nosql/kafka/index.js +234 -0
  195. package/dist/nosql/keyspaces/index.js +189 -0
  196. package/dist/nosql/kinesis/index.js +253 -0
  197. package/dist/nosql/leveldb/index.js +153 -0
  198. package/dist/nosql/lmdb/index.js +160 -0
  199. package/dist/nosql/loki/index.js +201 -0
  200. package/dist/nosql/marklogic/index.js +204 -0
  201. package/dist/nosql/materialize/index.js +145 -0
  202. package/dist/nosql/meilisearch/index.js +154 -0
  203. package/dist/nosql/memcached/index.js +223 -0
  204. package/dist/nosql/milvus/index.js +410 -0
  205. package/dist/nosql/minio/index.js +265 -0
  206. package/dist/nosql/momento/index.js +179 -0
  207. package/dist/nosql/mongodb/index.js +461 -0
  208. package/dist/nosql/nats/index.js +247 -0
  209. package/dist/nosql/nedb/index.js +164 -0
  210. package/dist/nosql/neo4j/index.js +450 -0
  211. package/dist/nosql/neptune/index.js +470 -0
  212. package/dist/nosql/nsq/index.js +200 -0
  213. package/dist/nosql/opensearch/index.js +186 -0
  214. package/dist/nosql/orientdb/index.js +175 -0
  215. package/dist/nosql/papertrail/index.js +200 -0
  216. package/dist/nosql/pinecone/index.js +0 -0
  217. package/dist/nosql/pinot/index.js +133 -0
  218. package/dist/nosql/pouchdb/index.js +172 -0
  219. package/dist/nosql/prometheus/index.js +174 -0
  220. package/dist/nosql/provendb/index.js +147 -0
  221. package/dist/nosql/pubsub/index.js +187 -0
  222. package/dist/nosql/pulsar/index.js +232 -0
  223. package/dist/nosql/qdrant/index.js +295 -0
  224. package/dist/nosql/qldb/index.js +192 -0
  225. package/dist/nosql/r2/index.js +281 -0
  226. package/dist/nosql/rabbitmq/index.js +237 -0
  227. package/dist/nosql/ravendb/index.js +175 -0
  228. package/dist/nosql/redis/index.js +607 -0
  229. package/dist/nosql/redpanda/index.js +237 -0
  230. package/dist/nosql/resque/index.js +203 -0
  231. package/dist/nosql/rethinkdb/index.js +232 -0
  232. package/dist/nosql/rocksdb/index.js +152 -0
  233. package/dist/nosql/rockset/index.js +126 -0
  234. package/dist/nosql/s3/index.js +298 -0
  235. package/dist/nosql/scylladb/index.js +178 -0
  236. package/dist/nosql/signoz/index.js +227 -0
  237. package/dist/nosql/sns/index.js +201 -0
  238. package/dist/nosql/solr/index.js +231 -0
  239. package/dist/nosql/splunk/index.js +227 -0
  240. package/dist/nosql/sqs/index.js +246 -0
  241. package/dist/nosql/stardog/index.js +169 -0
  242. package/dist/nosql/starrocks/index.js +170 -0
  243. package/dist/nosql/store.js +2 -0
  244. package/dist/nosql/sumologic/index.js +213 -0
  245. package/dist/nosql/surrealdb/index.js +179 -0
  246. package/dist/nosql/terminusdb/index.js +151 -0
  247. package/dist/nosql/tigergraph/index.js +469 -0
  248. package/dist/nosql/typesense/index.js +148 -0
  249. package/dist/nosql/unqlite/index.js +157 -0
  250. package/dist/nosql/upstash/index.js +167 -0
  251. package/dist/nosql/vercel-kv/index.js +166 -0
  252. package/dist/nosql/victoriametrics/index.js +213 -0
  253. package/dist/nosql/virtuoso/index.js +169 -0
  254. package/dist/nosql/weaviate/index.js +276 -0
  255. package/dist/operators/index.js +108 -0
  256. package/dist/operators.js +2690 -0
  257. package/dist/prisma-migrate/index.js +38 -0
  258. package/dist/prisma-migrate/migration-generator.js +125 -0
  259. package/dist/prisma-migrate/model-generator.js +172 -0
  260. package/dist/prisma-migrate/relations.js +100 -0
  261. package/dist/prisma-migrate/schema-parser.js +167 -0
  262. package/dist/prisma-migrate/type-mapper.js +40 -0
  263. package/dist/prorm.js +6832 -0
  264. package/dist/query-builders/cte-builder.js +80 -0
  265. package/dist/query-builders/functions/aggregate.js +390 -0
  266. package/dist/query-builders/functions/conditional.js +503 -0
  267. package/dist/query-builders/functions/datetime.js +695 -0
  268. package/dist/query-builders/functions/fulltext.js +439 -0
  269. package/dist/query-builders/functions/index.js +93 -0
  270. package/dist/query-builders/functions/json.js +427 -0
  271. package/dist/query-builders/functions/math.js +399 -0
  272. package/dist/query-builders/functions/string.js +518 -0
  273. package/dist/query-builders/functions/window.js +328 -0
  274. package/dist/query-builders/include-builder.js +323 -0
  275. package/dist/query-builders/index-expression-builder.js +242 -0
  276. package/dist/query-builders/index.js +161 -0
  277. package/dist/query-builders/insert-builder.js +164 -0
  278. package/dist/query-builders/model-helpers.js +38 -0
  279. package/dist/query-builders/order-limit-builder.js +239 -0
  280. package/dist/query-builders/sql-compiler.js +2040 -0
  281. package/dist/query-builders/subquery-builder.js +152 -0
  282. package/dist/query-builders/update-builder.js +182 -0
  283. package/dist/query-builders/view-builder.js +218 -0
  284. package/dist/query-builders/where-builder.js +1532 -0
  285. package/dist/query-interface.js +622 -0
  286. package/dist/query-optimizers/batch-optimizer.js +426 -0
  287. package/dist/query-optimizers/explain-plans.js +415 -0
  288. package/dist/query-optimizers/index.js +51 -0
  289. package/dist/query-optimizers/prepared-statement-cache.js +423 -0
  290. package/dist/query-optimizers/query-hints.js +438 -0
  291. package/dist/query-optimizers/query-optimizer.js +278 -0
  292. package/dist/query-optimizers/slow-query-logger.js +271 -0
  293. package/dist/replica-manager.js +507 -0
  294. package/dist/schema/index.js +15 -0
  295. package/dist/schema/migration-generator.js +374 -0
  296. package/dist/schema/schema-differ.js +549 -0
  297. package/dist/schema/types.js +6 -0
  298. package/dist/sql-constants.js +300 -0
  299. package/dist/sqlite-advanced.js +1047 -0
  300. package/dist/streams/index.js +12 -0
  301. package/dist/streams/transforms.js +178 -0
  302. package/dist/transaction.js +456 -0
  303. package/dist/types/index.js +180 -0
  304. package/dist/user-management.js +127 -0
  305. package/dist/utils/date.js +300 -0
  306. package/dist/utils/index.js +1079 -0
  307. package/dist/utils/string.js +161 -0
  308. package/dist/validators/index.js +19 -0
  309. package/dist/validators/validator.js +911 -0
  310. package/package.json +190 -0
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RocksDBStore = void 0;
4
+ /**
5
+ * RocksDB store.
6
+ *
7
+ * RocksDB is an embedded, in-process LSM-tree key-value store (no server). A
8
+ * store is opened against a filesystem path and exposes ordered key-value
9
+ * primitives — `put`/`get`/`del`, atomic `batch` writes, and ordered
10
+ * iteration. It has no query language and no SQL-shaped surface (`query(sql)`,
11
+ * identifier escaping, DDL), so it does not fit the `Dialect` interface used by
12
+ * the SQL dialects in this repo. Instead it implements the minimal
13
+ * `NoSqlStore` marker interface (`src/nosql/store.ts`) and exposes RocksDB's
14
+ * real KV surface directly.
15
+ *
16
+ * Built on the `rocksdb` npm driver (an `abstract-level` store). The driver is
17
+ * an optional peer dependency loaded lazily inside `connect()` (via `require`)
18
+ * so importing this module never forces the driver to be installed; tests
19
+ * inject a pre-built mock `client` instead and never reach the `require`.
20
+ */
21
+ const errors_1 = require("../../errors");
22
+ /**
23
+ * `RocksDBStore` wraps a `rocksdb` client and exposes its embedded KV surface:
24
+ * `put`/`get`/`del` for single keys, `batch` for atomic multi-key writes,
25
+ * and `list` for ordered key iteration (optionally by prefix).
26
+ */
27
+ class RocksDBStore {
28
+ constructor(options = {}) {
29
+ this.name = 'rocksdb';
30
+ this.library = 'rocksdb';
31
+ this.client = null;
32
+ this.connected = false;
33
+ this.options = options;
34
+ this.path = options.path ?? './data/rocksdb';
35
+ }
36
+ async connect() {
37
+ if (this.connected && this.client) {
38
+ return;
39
+ }
40
+ try {
41
+ if (this.options.client) {
42
+ this.client = this.options.client;
43
+ }
44
+ else {
45
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
46
+ const RocksDB = require('rocksdb');
47
+ this.client = RocksDB(this.path);
48
+ }
49
+ this.connected = true;
50
+ }
51
+ catch (err) {
52
+ this.client = null;
53
+ this.connected = false;
54
+ const parent = err instanceof Error ? err : new Error(String(err));
55
+ throw new errors_1.ConnectionError(`Unable to open RocksDB: ${parent.message}`, {
56
+ parent,
57
+ database: 'rocksdb',
58
+ });
59
+ }
60
+ }
61
+ async disconnect() {
62
+ if (this.client) {
63
+ try {
64
+ await this.client.close();
65
+ }
66
+ catch {
67
+ // best-effort close
68
+ }
69
+ this.client = null;
70
+ }
71
+ this.connected = false;
72
+ }
73
+ isConnected() {
74
+ return this.connected && this.client !== null;
75
+ }
76
+ /** Returns the underlying `rocksdb` client for anything not wrapped here. */
77
+ getClient() {
78
+ return this.requireClient();
79
+ }
80
+ requireClient() {
81
+ if (!this.client || !this.connected) {
82
+ throw new errors_1.ConnectionError('RocksDB client is not connected. Call connect() first.', {
83
+ database: 'rocksdb',
84
+ });
85
+ }
86
+ return this.client;
87
+ }
88
+ wrapError(action, err) {
89
+ const parent = err instanceof Error ? err : new Error(String(err));
90
+ return errors_1.DatabaseError.from(parent, { message: `RocksDB ${action} failed: ${parent.message}` });
91
+ }
92
+ /** Writes (or overwrites) the value at `key`. */
93
+ async put(key, value) {
94
+ const client = this.requireClient();
95
+ try {
96
+ await client.put(key, value);
97
+ }
98
+ catch (err) {
99
+ throw this.wrapError('put', err);
100
+ }
101
+ }
102
+ /** Reads the value at `key`. */
103
+ async get(key) {
104
+ const client = this.requireClient();
105
+ try {
106
+ return await client.get(key);
107
+ }
108
+ catch (err) {
109
+ throw this.wrapError('get', err);
110
+ }
111
+ }
112
+ /** Deletes the value at `key`. */
113
+ async del(key) {
114
+ const client = this.requireClient();
115
+ try {
116
+ await client.del(key);
117
+ }
118
+ catch (err) {
119
+ throw this.wrapError('del', err);
120
+ }
121
+ }
122
+ /** Applies a list of `put`/`del` operations as a single atomic batch. */
123
+ async batch(ops) {
124
+ const client = this.requireClient();
125
+ try {
126
+ await client.batch(ops);
127
+ }
128
+ catch (err) {
129
+ throw this.wrapError('batch', err);
130
+ }
131
+ }
132
+ /**
133
+ * Lists keys in order. With `prefix`, restricts to keys `>= prefix` and
134
+ * `< prefix + '\xff'` (a standard prefix-scan range for byte-ordered keys).
135
+ */
136
+ async list(prefix) {
137
+ const client = this.requireClient();
138
+ try {
139
+ const range = prefix !== undefined ? { gte: prefix, lt: `${prefix}\xff` } : {};
140
+ const keys = [];
141
+ for await (const [key] of client.iterator(range)) {
142
+ keys.push(String(key));
143
+ }
144
+ return keys;
145
+ }
146
+ catch (err) {
147
+ throw this.wrapError('list', err);
148
+ }
149
+ }
150
+ }
151
+ exports.RocksDBStore = RocksDBStore;
152
+ exports.default = RocksDBStore;
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ /**
3
+ * Rockset store.
4
+ *
5
+ * Rockset is a real-time analytics database that indexes streaming and
6
+ * document data (a "converged index" over row, columnar, and inverted
7
+ * indexes) and serves low-latency SQL over it. It is a schemaless,
8
+ * document-oriented, HTTP/JSON service with an official client
9
+ * (`@rockset/client`); there is no relational connection, no server-side
10
+ * transactions, and ingestion is document-based (`addDocuments`), so it does
11
+ * not fit the SQL-shaped `Dialect` interface (`src/dialects/dialect.ts`).
12
+ * This class implements the minimal `NoSqlStore` marker interface
13
+ * (`src/nosql/store.ts`) and exposes Rockset's query + document API directly.
14
+ *
15
+ * ## Driver: `@rockset/client`
16
+ *
17
+ * The `@rockset/client` package is an optional peer dependency, lazily
18
+ * `require`d inside `connect()` so importing this module never forces it to be
19
+ * installed. Tests inject a pre-built mock client via `RocksetStoreOptions.client`,
20
+ * which skips the `require` entirely.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.RocksetStore = void 0;
24
+ const errors_1 = require("../../errors");
25
+ /**
26
+ * `RocksetStore` wraps a `@rockset/client` instance and exposes SQL querying
27
+ * (`query`) plus document ingestion (`ingest`) into a `workspace.collection`.
28
+ */
29
+ class RocksetStore {
30
+ constructor(options = {}) {
31
+ this.name = 'rockset';
32
+ this.library = '@rockset/client';
33
+ this.client = null;
34
+ this.connected = false;
35
+ this.options = options;
36
+ }
37
+ // ---------------------------------------------------------------------
38
+ // NoSqlStore lifecycle
39
+ // ---------------------------------------------------------------------
40
+ async connect() {
41
+ if (this.connected && this.client) {
42
+ return;
43
+ }
44
+ try {
45
+ let client = this.options.client;
46
+ if (!client) {
47
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
48
+ const mod = require('@rockset/client');
49
+ const factory = mod.default ?? mod;
50
+ client = factory(this.options.apiKey, this.options.host);
51
+ }
52
+ this.client = client;
53
+ this.connected = true;
54
+ }
55
+ catch (err) {
56
+ this.client = null;
57
+ this.connected = false;
58
+ const parent = err instanceof Error ? err : new Error(String(err));
59
+ throw new errors_1.ConnectionError(`Unable to connect to Rockset: ${parent.message}`, {
60
+ parent,
61
+ database: 'rockset',
62
+ host: this.options.host,
63
+ });
64
+ }
65
+ }
66
+ async disconnect() {
67
+ this.client = null;
68
+ this.connected = false;
69
+ }
70
+ isConnected() {
71
+ return this.connected && this.client !== null;
72
+ }
73
+ /** Returns the underlying `@rockset/client` instance for anything not wrapped here. */
74
+ getClient() {
75
+ return this.requireClient();
76
+ }
77
+ requireClient() {
78
+ if (!this.client || !this.connected) {
79
+ throw new errors_1.ConnectionError('Rockset client is not connected. Call connect() first.', {
80
+ database: 'rockset',
81
+ });
82
+ }
83
+ return this.client;
84
+ }
85
+ // ---------------------------------------------------------------------
86
+ // Query + ingest
87
+ // ---------------------------------------------------------------------
88
+ /**
89
+ * Run a SQL query via `client.queries.query({ sql: { query, parameters } })`
90
+ * and return the `results` array from the response.
91
+ */
92
+ async query(sql, params) {
93
+ const client = this.requireClient();
94
+ try {
95
+ const request = {
96
+ sql: params && params.length > 0 ? { query: sql, parameters: params } : { query: sql },
97
+ };
98
+ const response = await client.queries.query(request);
99
+ return (response?.results ?? []);
100
+ }
101
+ catch (err) {
102
+ const parent = err instanceof Error ? err : new Error(String(err));
103
+ throw errors_1.DatabaseError.from(parent, { message: `Rockset query failed: ${parent.message}`, sql });
104
+ }
105
+ }
106
+ /**
107
+ * Ingest `docs` into `target` (a `workspace.collection` path, or just a
108
+ * collection name — defaulting the workspace to `commons`) via
109
+ * `client.documents.addDocuments(workspace, collection, { data })`.
110
+ */
111
+ async ingest(target, docs) {
112
+ const client = this.requireClient();
113
+ const [workspace, collection] = target.includes('.')
114
+ ? [target.slice(0, target.indexOf('.')), target.slice(target.indexOf('.') + 1)]
115
+ : ['commons', target];
116
+ try {
117
+ return await client.documents.addDocuments(workspace, collection, { data: docs });
118
+ }
119
+ catch (err) {
120
+ const parent = err instanceof Error ? err : new Error(String(err));
121
+ throw errors_1.DatabaseError.from(parent, { message: `Rockset ingest failed: ${parent.message}` });
122
+ }
123
+ }
124
+ }
125
+ exports.RocksetStore = RocksetStore;
126
+ exports.default = RocksetStore;
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.S3Store = void 0;
4
+ /**
5
+ * Amazon S3 object-storage store.
6
+ *
7
+ * S3 is an object store, not a database — there is no query language, no
8
+ * rows, and no SQL-shaped access pattern. Data is organized as opaque
9
+ * objects (arbitrary byte bodies plus metadata) addressed by a `(bucket,
10
+ * key)` pair, where the "key" is a flat string that only *looks* like a
11
+ * path (`foo/bar/baz.json`) — S3 has no real directories, just an optional
12
+ * key `prefix` you can filter listings by. None of that fits the SQL-shaped
13
+ * `Dialect` interface (`src/dialects/dialect.ts`), so this store implements
14
+ * the minimal `NoSqlStore` marker interface (`src/nosql/store.ts`) and
15
+ * exposes S3's own object-level operations directly.
16
+ *
17
+ * Built on AWS SDK v3 (`@aws-sdk/client-s3`): an `S3Client` speaks the S3
18
+ * wire protocol via the command pattern — you construct a command object
19
+ * (`new PutObjectCommand(input)`) and hand it to `client.send(command)`.
20
+ * The SDK is loaded lazily inside `connect()` (via `require`) rather than a
21
+ * top-level import so that importing this module doesn't hard-require the
22
+ * `@aws-sdk/client-s3` package unless an S3 store is actually connected —
23
+ * and so tests can inject a pre-built mock `client` and never load the SDK
24
+ * at all.
25
+ */
26
+ const errors_1 = require("../../errors");
27
+ /**
28
+ * Amazon S3 store, implementing the minimal `NoSqlStore` marker interface.
29
+ * Unlike the SQL dialects, there is no `query(sql)` — S3's operations are
30
+ * object-shaped (Put/Get/Delete/List/Head/Copy) and that shape is preserved
31
+ * here rather than forced into a SQL string.
32
+ */
33
+ class S3Store {
34
+ constructor(options = {}) {
35
+ this.name = 's3';
36
+ this.library = '@aws-sdk/client-s3';
37
+ this.client = null;
38
+ this.aws = null;
39
+ this.connected = false;
40
+ this.options = options;
41
+ }
42
+ // ---------------------------------------------------------------------
43
+ // NoSqlStore lifecycle
44
+ // ---------------------------------------------------------------------
45
+ async connect() {
46
+ try {
47
+ if (this.options.client) {
48
+ // A pre-built client was injected (mock or custom). Use it directly
49
+ // and don't require the SDK at all — the command constructors are
50
+ // only needed when we build them ourselves below, but with an
51
+ // injected client the caller/test provides commands' behavior via
52
+ // the mock's `send`. We still lazy-load the SDK for the command
53
+ // classes if it happens to be available; if not, callers using an
54
+ // injected client typically only exercise `send`, and the command
55
+ // classes are loaded on demand in each method.
56
+ this.client = this.options.client;
57
+ this.tryLoadSdk();
58
+ }
59
+ else {
60
+ const aws = require('@aws-sdk/client-s3');
61
+ this.aws = aws;
62
+ this.client = new aws.S3Client({
63
+ region: this.options.region,
64
+ credentials: this.options.credentials,
65
+ endpoint: this.options.endpoint,
66
+ forcePathStyle: this.options.forcePathStyle,
67
+ });
68
+ }
69
+ this.connected = true;
70
+ }
71
+ catch (err) {
72
+ this.connected = false;
73
+ this.client = null;
74
+ this.aws = null;
75
+ throw new errors_1.ConnectionError(`Failed to connect to S3: ${err instanceof Error ? err.message : String(err)}`, { parent: err instanceof Error ? err : undefined });
76
+ }
77
+ }
78
+ /**
79
+ * Attempt to lazy-load `@aws-sdk/client-s3` for its command constructors.
80
+ * Best-effort: when a client was injected (e.g. a test mock) the SDK may
81
+ * not be installed, so a failure here is swallowed and the command classes
82
+ * are loaded on demand instead (see `command()`).
83
+ */
84
+ tryLoadSdk() {
85
+ if (this.aws)
86
+ return;
87
+ try {
88
+ this.aws = require('@aws-sdk/client-s3');
89
+ }
90
+ catch {
91
+ this.aws = null;
92
+ }
93
+ }
94
+ async disconnect() {
95
+ try {
96
+ this.client?.destroy?.();
97
+ }
98
+ finally {
99
+ this.client = null;
100
+ this.aws = null;
101
+ this.connected = false;
102
+ }
103
+ }
104
+ isConnected() {
105
+ return this.connected && this.client !== null;
106
+ }
107
+ /** Returns the underlying `S3Client` (loosely typed) for anything not wrapped here. */
108
+ getClient() {
109
+ return this.requireClient();
110
+ }
111
+ requireClient() {
112
+ if (!this.client || !this.connected) {
113
+ throw new errors_1.ConnectionError('S3 client is not connected. Call connect() first.');
114
+ }
115
+ return this.client;
116
+ }
117
+ /**
118
+ * Resolve an S3 command constructor by name from the (lazily loaded) SDK,
119
+ * so that with an injected mock client we only load `@aws-sdk/client-s3`
120
+ * the first time a command is actually built. Throws a `ConnectionError`
121
+ * if the SDK genuinely can't be resolved.
122
+ */
123
+ command(name, input) {
124
+ if (!this.aws) {
125
+ this.tryLoadSdk();
126
+ }
127
+ const Ctor = this.aws?.[name];
128
+ if (typeof Ctor !== 'function') {
129
+ throw new errors_1.ConnectionError(`S3 command '${name}' is unavailable: '@aws-sdk/client-s3' could not be loaded.`);
130
+ }
131
+ return new Ctor(input);
132
+ }
133
+ /** Wraps an AWS SDK failure in a `DatabaseError`, preserving the original error. */
134
+ wrapError(action, err) {
135
+ const parent = err instanceof Error ? err : new Error(String(err));
136
+ const name = parent.name ? ` (${parent.name})` : '';
137
+ return new errors_1.DatabaseError(`S3 ${action} failed${name}: ${parent.message}`, {
138
+ parent,
139
+ original: parent.message,
140
+ });
141
+ }
142
+ // ---------------------------------------------------------------------
143
+ // Object operations
144
+ // ---------------------------------------------------------------------
145
+ /** `PutObject` — store an object's body (and optional metadata) under `bucket`/`key`. */
146
+ async putObject(bucket, key, body, options = {}) {
147
+ const client = this.requireClient();
148
+ try {
149
+ const result = await client.send(this.command('PutObjectCommand', {
150
+ Bucket: bucket,
151
+ Key: key,
152
+ Body: body,
153
+ ContentType: options.contentType,
154
+ Metadata: options.metadata,
155
+ CacheControl: options.cacheControl,
156
+ ContentEncoding: options.contentEncoding,
157
+ ACL: options.acl,
158
+ ServerSideEncryption: options.serverSideEncryption,
159
+ }));
160
+ return { etag: result?.ETag, versionId: result?.VersionId };
161
+ }
162
+ catch (err) {
163
+ throw this.wrapError(`PutObject on '${bucket}/${key}'`, err);
164
+ }
165
+ }
166
+ /** `GetObject` — fetch an object's body and metadata. */
167
+ async getObject(bucket, key) {
168
+ const client = this.requireClient();
169
+ try {
170
+ const result = await client.send(this.command('GetObjectCommand', { Bucket: bucket, Key: key }));
171
+ return {
172
+ body: result?.Body,
173
+ contentType: result?.ContentType,
174
+ contentLength: result?.ContentLength,
175
+ etag: result?.ETag,
176
+ lastModified: result?.LastModified,
177
+ metadata: result?.Metadata,
178
+ };
179
+ }
180
+ catch (err) {
181
+ throw this.wrapError(`GetObject on '${bucket}/${key}'`, err);
182
+ }
183
+ }
184
+ /** `DeleteObject` — remove an object. Succeeds even if the key doesn't exist. */
185
+ async deleteObject(bucket, key) {
186
+ const client = this.requireClient();
187
+ try {
188
+ await client.send(this.command('DeleteObjectCommand', { Bucket: bucket, Key: key }));
189
+ }
190
+ catch (err) {
191
+ throw this.wrapError(`DeleteObject on '${bucket}/${key}'`, err);
192
+ }
193
+ }
194
+ /**
195
+ * `ListObjectsV2` — list objects in `bucket`, optionally restricted to
196
+ * those whose key starts with `prefix`. A single call returns at most
197
+ * 1000 objects; use `result.nextContinuationToken` (via the raw client)
198
+ * to page beyond that.
199
+ */
200
+ async listObjects(bucket, prefix) {
201
+ const client = this.requireClient();
202
+ try {
203
+ const result = await client.send(this.command('ListObjectsV2Command', { Bucket: bucket, Prefix: prefix }));
204
+ const contents = result?.Contents ?? [];
205
+ return {
206
+ objects: contents.map((o) => ({
207
+ key: o?.Key,
208
+ size: o?.Size,
209
+ etag: o?.ETag,
210
+ lastModified: o?.LastModified,
211
+ })),
212
+ isTruncated: Boolean(result?.IsTruncated),
213
+ nextContinuationToken: result?.NextContinuationToken,
214
+ };
215
+ }
216
+ catch (err) {
217
+ throw this.wrapError(`ListObjects on '${bucket}'`, err);
218
+ }
219
+ }
220
+ /** `HeadObject` — fetch an object's metadata without its body. Throws (NotFound) if the object doesn't exist. */
221
+ async headObject(bucket, key) {
222
+ const client = this.requireClient();
223
+ try {
224
+ const result = await client.send(this.command('HeadObjectCommand', { Bucket: bucket, Key: key }));
225
+ return {
226
+ contentType: result?.ContentType,
227
+ contentLength: result?.ContentLength,
228
+ etag: result?.ETag,
229
+ lastModified: result?.LastModified,
230
+ metadata: result?.Metadata,
231
+ };
232
+ }
233
+ catch (err) {
234
+ throw this.wrapError(`HeadObject on '${bucket}/${key}'`, err);
235
+ }
236
+ }
237
+ /**
238
+ * Whether an object exists, implemented via `HeadObject`. Returns `false`
239
+ * when S3 reports the object is missing (a `NotFound` / 404 error) rather
240
+ * than throwing; any other error (e.g. access denied) is re-thrown.
241
+ */
242
+ async objectExists(bucket, key) {
243
+ try {
244
+ await this.headObject(bucket, key);
245
+ return true;
246
+ }
247
+ catch (err) {
248
+ if (this.isNotFound(err)) {
249
+ return false;
250
+ }
251
+ throw err;
252
+ }
253
+ }
254
+ /** `CopyObject` — server-side copy from `srcBucket`/`srcKey` to `destBucket`/`destKey`. */
255
+ async copyObject(srcBucket, srcKey, destBucket, destKey) {
256
+ const client = this.requireClient();
257
+ // CopySource is a URL-encoded `bucket/key` reference to the source object.
258
+ const copySource = `${srcBucket}/${srcKey}`;
259
+ try {
260
+ const result = await client.send(this.command('CopyObjectCommand', {
261
+ Bucket: destBucket,
262
+ Key: destKey,
263
+ CopySource: copySource,
264
+ }));
265
+ return {
266
+ etag: result?.CopyObjectResult?.ETag,
267
+ lastModified: result?.CopyObjectResult?.LastModified,
268
+ };
269
+ }
270
+ catch (err) {
271
+ throw this.wrapError(`CopyObject from '${srcBucket}/${srcKey}' to '${destBucket}/${destKey}'`, err);
272
+ }
273
+ }
274
+ /**
275
+ * Recognize S3's "object does not exist" errors across the shapes the SDK
276
+ * (and its wrapped form here) can surface them: the raw error's `.name`
277
+ * (`NotFound`, `NoSuchKey`), its HTTP status (404), or the wrapped
278
+ * `DatabaseError`'s `.parent`.
279
+ */
280
+ isNotFound(err) {
281
+ const candidates = [err];
282
+ const parent = err?.parent;
283
+ if (parent)
284
+ candidates.push(parent);
285
+ for (const c of candidates) {
286
+ const name = c?.name;
287
+ if (name === 'NotFound' || name === 'NoSuchKey')
288
+ return true;
289
+ const status = c?.$metadata?.httpStatusCode ??
290
+ c?.statusCode;
291
+ if (status === 404)
292
+ return true;
293
+ }
294
+ return false;
295
+ }
296
+ }
297
+ exports.S3Store = S3Store;
298
+ exports.default = S3Store;