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,247 @@
1
+ "use strict";
2
+ /**
3
+ * NATS store implementation.
4
+ *
5
+ * NATS is a lightweight publish/subscribe and request/reply messaging system.
6
+ * Its JetStream layer adds persistence, including a key/value (KV) store built
7
+ * on top of streams. NATS has no query language and does not fit the
8
+ * SQL-shaped `Dialect` interface, so this class implements the minimal
9
+ * `NoSqlStore` marker interface and exposes NATS's real operations
10
+ * (core pub/sub, request/reply, and JetStream KV) instead of forcing
11
+ * everything into a `query(sql)` shape.
12
+ *
13
+ * Uses the `nats` driver (`nats.js`). The driver is lazy-loaded inside
14
+ * `connect()` via `require('nats')` so that importing this module never
15
+ * pulls in the driver unless a connection is actually opened; tests inject a
16
+ * pre-built connection through the `client` option and never touch the real
17
+ * driver or the network.
18
+ *
19
+ * Encoding: NATS messages are byte payloads (`Uint8Array`). `publish()` and
20
+ * `request()` accept either a `string` (UTF-8 encoded via `TextEncoder`) or a
21
+ * `Uint8Array` (passed through unchanged). `subscribe()` handlers and
22
+ * `request()` replies deliver the raw `Uint8Array` payload; decode with
23
+ * `TextDecoder` (or the message's own `.string()`/`.json()` helpers when using
24
+ * the real driver) as needed. JetStream KV values are encoded the same way on
25
+ * write, and `kvGet()` returns the entry's raw `Uint8Array` value (or `null`
26
+ * when the key is absent).
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.NatsStore = void 0;
30
+ const errors_1 = require("../../errors");
31
+ const textEncoder = new TextEncoder();
32
+ /** Encode a string/`Uint8Array` payload into the `Uint8Array` the driver expects. */
33
+ function encode(data) {
34
+ return typeof data === 'string' ? textEncoder.encode(data) : data;
35
+ }
36
+ function wrapConnectionError(err, servers) {
37
+ const parent = err instanceof Error ? err : new Error(String(err));
38
+ const host = Array.isArray(servers) ? servers.join(',') : servers;
39
+ return new errors_1.ConnectionError(`Unable to connect to NATS: ${parent.message}`, {
40
+ parent,
41
+ database: 'nats',
42
+ host,
43
+ });
44
+ }
45
+ function wrapDatabaseError(err, message) {
46
+ const parent = err instanceof Error ? err : new Error(String(err));
47
+ const combined = message ? `${message}: ${parent.message}` : parent.message;
48
+ return errors_1.DatabaseError.from(parent, { message: combined });
49
+ }
50
+ /**
51
+ * `NatsStore` wraps a `nats` `NatsConnection` and exposes NATS's core
52
+ * publish/subscribe and request/reply operations plus JetStream KV
53
+ * (`kvPut`/`kvGet`/`kvDelete`) as a typed, promise-based API.
54
+ */
55
+ class NatsStore {
56
+ constructor(options = {}) {
57
+ this.name = 'nats';
58
+ this.library = 'nats';
59
+ this.connection = null;
60
+ this.connected = false;
61
+ /** Cached JetStream KV bucket views, keyed by bucket name. */
62
+ this.kvCache = new Map();
63
+ this.options = options;
64
+ }
65
+ // ---------------------------------------------------------------------
66
+ // Connection lifecycle
67
+ // ---------------------------------------------------------------------
68
+ async connect() {
69
+ if (this.connected && this.connection) {
70
+ return;
71
+ }
72
+ try {
73
+ if (this.options.client) {
74
+ // A pre-built connection was injected (used by tests and by callers
75
+ // that manage the connection themselves); adopt it and skip the
76
+ // driver require entirely.
77
+ this.connection = this.options.client;
78
+ }
79
+ else {
80
+ // Lazy-load the optional `nats` driver only when actually opening a
81
+ // real connection, so importing this module never requires it.
82
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
83
+ const nats = require('nats');
84
+ this.connection = (await nats.connect({
85
+ servers: this.options.servers,
86
+ token: this.options.token,
87
+ user: this.options.user,
88
+ pass: this.options.pass,
89
+ }));
90
+ }
91
+ this.connected = true;
92
+ }
93
+ catch (err) {
94
+ this.connection = null;
95
+ this.connected = false;
96
+ throw wrapConnectionError(err, this.options.servers);
97
+ }
98
+ }
99
+ async disconnect() {
100
+ if (this.connection) {
101
+ try {
102
+ // Prefer a graceful drain (flushes pending messages and unsubscribes)
103
+ // and fall back to a hard close if the connection doesn't support it.
104
+ if (typeof this.connection.drain === 'function') {
105
+ await this.connection.drain();
106
+ }
107
+ else if (typeof this.connection.close === 'function') {
108
+ await this.connection.close();
109
+ }
110
+ }
111
+ catch {
112
+ try {
113
+ await this.connection.close?.();
114
+ }
115
+ catch {
116
+ // Ignore secondary teardown failures - we're discarding the
117
+ // connection regardless.
118
+ }
119
+ }
120
+ this.connection = null;
121
+ }
122
+ this.kvCache.clear();
123
+ this.connected = false;
124
+ }
125
+ isConnected() {
126
+ return this.connected && this.connection !== null;
127
+ }
128
+ /** Returns the underlying `nats` connection for anything not wrapped here. */
129
+ getClient() {
130
+ return this.requireConnection();
131
+ }
132
+ requireConnection() {
133
+ if (!this.connection) {
134
+ throw new errors_1.ConnectionError('Not connected to NATS', { database: 'nats' });
135
+ }
136
+ return this.connection;
137
+ }
138
+ // ---------------------------------------------------------------------
139
+ // Core pub/sub + request/reply
140
+ // ---------------------------------------------------------------------
141
+ /**
142
+ * Publish `data` to `subject`. The payload is encoded per the module's
143
+ * encoding rules (string → UTF-8, `Uint8Array` → as-is).
144
+ */
145
+ publish(subject, data) {
146
+ const connection = this.requireConnection();
147
+ try {
148
+ connection.publish(subject, encode(data));
149
+ }
150
+ catch (err) {
151
+ throw wrapDatabaseError(err, `NATS publish to "${subject}" failed`);
152
+ }
153
+ }
154
+ /**
155
+ * Subscribe to `subject`, invoking `handler` for each message via the
156
+ * driver's callback option (`subscribe(subject, { callback })`). Returns the
157
+ * driver's `Subscription` (call `.unsubscribe()` / `.drain()` on it to stop).
158
+ * The callback style is chosen over the async-iterator style so a handler
159
+ * can be registered without spawning a consuming loop.
160
+ */
161
+ subscribe(subject, handler) {
162
+ const connection = this.requireConnection();
163
+ try {
164
+ return connection.subscribe(subject, { callback: handler });
165
+ }
166
+ catch (err) {
167
+ throw wrapDatabaseError(err, `NATS subscribe to "${subject}" failed`);
168
+ }
169
+ }
170
+ /**
171
+ * Send a request to `subject` and await a single reply. `opts` is passed
172
+ * straight through to the driver (e.g. `{ timeout }`). Resolves with the
173
+ * driver's reply `Msg`; read `.data` / `.string()` / `.json()` off it.
174
+ */
175
+ async request(subject, data, opts) {
176
+ const connection = this.requireConnection();
177
+ try {
178
+ return await connection.request(subject, encode(data), opts);
179
+ }
180
+ catch (err) {
181
+ throw wrapDatabaseError(err, `NATS request to "${subject}" failed`);
182
+ }
183
+ }
184
+ // ---------------------------------------------------------------------
185
+ // JetStream KV
186
+ // ---------------------------------------------------------------------
187
+ /**
188
+ * Lazily resolve (and cache) the JetStream KV bucket view for `bucket` via
189
+ * `connection.jetstream().views.kv(bucket)`. Subsequent calls for the same
190
+ * bucket return the cached view.
191
+ */
192
+ async kv(bucket) {
193
+ const cached = this.kvCache.get(bucket);
194
+ if (cached) {
195
+ return cached;
196
+ }
197
+ const connection = this.requireConnection();
198
+ try {
199
+ const view = await connection.jetstream().views.kv(bucket);
200
+ this.kvCache.set(bucket, view);
201
+ return view;
202
+ }
203
+ catch (err) {
204
+ throw wrapDatabaseError(err, `NATS KV open bucket "${bucket}" failed`);
205
+ }
206
+ }
207
+ /**
208
+ * Put `value` at `key` in `bucket`'s KV store (encoded per the module's
209
+ * encoding rules). Returns the revision number assigned by JetStream.
210
+ */
211
+ async kvPut(bucket, key, value) {
212
+ const view = await this.kv(bucket);
213
+ try {
214
+ return await view.put(key, encode(value));
215
+ }
216
+ catch (err) {
217
+ throw wrapDatabaseError(err, `NATS KV put "${key}" in bucket "${bucket}" failed`);
218
+ }
219
+ }
220
+ /**
221
+ * Get the raw value stored at `key` in `bucket`, or `null` if the key is
222
+ * absent (or holds a deleted/purged entry). Returns the entry's
223
+ * `Uint8Array` value; decode with `TextDecoder` as needed.
224
+ */
225
+ async kvGet(bucket, key) {
226
+ const view = await this.kv(bucket);
227
+ try {
228
+ const entry = await view.get(key);
229
+ return entry ? entry.value : null;
230
+ }
231
+ catch (err) {
232
+ throw wrapDatabaseError(err, `NATS KV get "${key}" from bucket "${bucket}" failed`);
233
+ }
234
+ }
235
+ /** Delete `key` from `bucket`'s KV store. */
236
+ async kvDelete(bucket, key) {
237
+ const view = await this.kv(bucket);
238
+ try {
239
+ await view.delete(key);
240
+ }
241
+ catch (err) {
242
+ throw wrapDatabaseError(err, `NATS KV delete "${key}" from bucket "${bucket}" failed`);
243
+ }
244
+ }
245
+ }
246
+ exports.NatsStore = NatsStore;
247
+ exports.default = NatsStore;
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NedbStore = void 0;
4
+ /**
5
+ * NeDB store.
6
+ *
7
+ * NeDB is an embedded, in-process document database with a MongoDB-like API,
8
+ * backed by an append-only file (or purely in-memory). It stores documents
9
+ * addressed by an `_id` field and exposes `insert`/`findOne`/`find`/`remove`.
10
+ * It has no SQL-shaped surface, so it does not fit the `Dialect` interface
11
+ * used by the SQL dialects in this repo. Instead it implements the minimal
12
+ * `NoSqlStore` marker interface (`src/nosql/store.ts`) and maps a common
13
+ * key-value surface (`put`/`get`/`del` on `_id`) onto NeDB's document API,
14
+ * alongside the native `insert`/`find`.
15
+ *
16
+ * Built on the `nedb` npm driver (callback-based), loaded lazily inside
17
+ * `connect()` (via `require`) so importing this module never forces the driver
18
+ * to be installed; tests inject a pre-built mock `client` instead and never
19
+ * reach the `require`.
20
+ */
21
+ const errors_1 = require("../../errors");
22
+ /**
23
+ * `NedbStore` wraps a `nedb` `Datastore` and exposes both a common KV surface
24
+ * — `put`/`get`/`del` keyed on `_id`, `batch`, `list` — and NeDB's native
25
+ * document operations `insert`/`find`.
26
+ */
27
+ class NedbStore {
28
+ constructor(options = {}) {
29
+ this.name = 'nedb';
30
+ this.library = 'nedb';
31
+ this.client = null;
32
+ this.connected = false;
33
+ this.options = options;
34
+ }
35
+ async connect() {
36
+ if (this.connected && this.client) {
37
+ return;
38
+ }
39
+ try {
40
+ if (this.options.client) {
41
+ this.client = this.options.client;
42
+ }
43
+ else {
44
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
45
+ const Datastore = require('nedb');
46
+ this.client = new Datastore(this.options.filename
47
+ ? { filename: this.options.filename, autoload: true }
48
+ : {});
49
+ }
50
+ this.connected = true;
51
+ }
52
+ catch (err) {
53
+ this.client = null;
54
+ this.connected = false;
55
+ const parent = err instanceof Error ? err : new Error(String(err));
56
+ throw new errors_1.ConnectionError(`Unable to open NeDB: ${parent.message}`, {
57
+ parent,
58
+ database: 'nedb',
59
+ });
60
+ }
61
+ }
62
+ async disconnect() {
63
+ // NeDB has no explicit close; drop the reference so the store reports
64
+ // disconnected and callers can't keep using it.
65
+ this.client = null;
66
+ this.connected = false;
67
+ }
68
+ isConnected() {
69
+ return this.connected && this.client !== null;
70
+ }
71
+ /** Returns the underlying `nedb` `Datastore` for anything not wrapped here. */
72
+ getClient() {
73
+ return this.requireClient();
74
+ }
75
+ requireClient() {
76
+ if (!this.client || !this.connected) {
77
+ throw new errors_1.ConnectionError('NeDB datastore is not connected. Call connect() first.', {
78
+ database: 'nedb',
79
+ });
80
+ }
81
+ return this.client;
82
+ }
83
+ wrapError(action, err) {
84
+ const parent = err instanceof Error ? err : new Error(String(err));
85
+ return errors_1.DatabaseError.from(parent, { message: `NeDB ${action} failed: ${parent.message}` });
86
+ }
87
+ /** Wrap a callback-style NeDB call into a Promise. */
88
+ promisify(fn) {
89
+ return new Promise((resolve, reject) => {
90
+ fn((err, result) => (err ? reject(err) : resolve(result)));
91
+ });
92
+ }
93
+ /**
94
+ * Writes a document keyed by `_id = key`. Maps onto NeDB's `insert`, merging
95
+ * `key` into the document as its `_id`.
96
+ */
97
+ async put(key, value) {
98
+ const client = this.requireClient();
99
+ try {
100
+ return await this.promisify((cb) => client.insert({ _id: key, ...value }, cb));
101
+ }
102
+ catch (err) {
103
+ throw this.wrapError('put', err);
104
+ }
105
+ }
106
+ /** Reads a document by `_id` (NeDB `findOne({ _id })`). Returns `null` if absent. */
107
+ async get(key) {
108
+ const client = this.requireClient();
109
+ try {
110
+ return await this.promisify((cb) => client.findOne({ _id: key }, cb));
111
+ }
112
+ catch (err) {
113
+ throw this.wrapError('get', err);
114
+ }
115
+ }
116
+ /** Deletes a document by `_id` (NeDB `remove({ _id })`). Returns the number removed. */
117
+ async del(key) {
118
+ const client = this.requireClient();
119
+ try {
120
+ return await this.promisify((cb) => client.remove({ _id: key }, {}, cb));
121
+ }
122
+ catch (err) {
123
+ throw this.wrapError('del', err);
124
+ }
125
+ }
126
+ /** Native `insert`: adds a document (NeDB assigns an `_id` if omitted). */
127
+ async insert(doc) {
128
+ const client = this.requireClient();
129
+ try {
130
+ return await this.promisify((cb) => client.insert(doc, cb));
131
+ }
132
+ catch (err) {
133
+ throw this.wrapError('insert', err);
134
+ }
135
+ }
136
+ /** Native `find`: returns every document matching the Mongo-style `query`. */
137
+ async find(query = {}) {
138
+ const client = this.requireClient();
139
+ try {
140
+ return await this.promisify((cb) => client.find(query, cb));
141
+ }
142
+ catch (err) {
143
+ throw this.wrapError('find', err);
144
+ }
145
+ }
146
+ /** Applies a list of `put`/`del` operations sequentially. */
147
+ async batch(ops) {
148
+ for (const op of ops) {
149
+ if (op.type === 'put') {
150
+ await this.put(op.key, op.value);
151
+ }
152
+ else {
153
+ await this.del(op.key);
154
+ }
155
+ }
156
+ }
157
+ /** Lists all document `_id`s (via `find({})`). */
158
+ async list() {
159
+ const docs = await this.find({});
160
+ return docs.map((doc) => String(doc._id));
161
+ }
162
+ }
163
+ exports.NedbStore = NedbStore;
164
+ exports.default = NedbStore;