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,246 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SqsStore = void 0;
4
+ /**
5
+ * Amazon SQS (Simple Queue Service) store.
6
+ *
7
+ * SQS is a managed, pull-based message queue. It has no query language and no
8
+ * SQL-shaped access pattern, so this store implements the minimal `NoSqlStore`
9
+ * marker interface (`src/nosql/store.ts`) and exposes SQS's real operations:
10
+ * sending a message to a queue (`publish`), a long-poll receive loop that
11
+ * delivers messages to a handler and deletes (acks) them afterward
12
+ * (`subscribe`), and queue administration (`createQueue`).
13
+ *
14
+ * Built on AWS SDK v3 (`@aws-sdk/client-sqs`): an `SQSClient` speaks the wire
15
+ * protocol via the command pattern — you build a command object
16
+ * (`new SendMessageCommand(input)`) and hand it to `client.send(command)`. The
17
+ * SDK is loaded lazily inside `connect()` (via `require`) so importing this
18
+ * module never hard-requires the driver, and tests inject a mock `client`
19
+ * (with a `send(command)` method) so no real SDK or network is used.
20
+ *
21
+ * Message encoding: `publish()` accepts a `string` (sent as-is), a `Buffer`
22
+ * (decoded to UTF-8), or any other JSON-serializable value (`JSON.stringify`d).
23
+ * The result becomes the message body (SQS bodies are strings).
24
+ */
25
+ const errors_1 = require("../../errors");
26
+ /** Encode a message into the string body SQS carries. */
27
+ function toBody(message) {
28
+ if (typeof message === 'string')
29
+ return message;
30
+ if (Buffer.isBuffer(message))
31
+ return message.toString('utf8');
32
+ return JSON.stringify(message);
33
+ }
34
+ function sleep(ms) {
35
+ return new Promise((resolve) => {
36
+ const timer = setTimeout(resolve, ms);
37
+ // Don't let a pending poll-interval timer keep the process alive.
38
+ timer.unref?.();
39
+ });
40
+ }
41
+ /**
42
+ * `SqsStore` wraps an AWS v3 `SQSClient` and exposes queue sending, a
43
+ * receive-and-ack poll loop, and queue administration.
44
+ */
45
+ class SqsStore {
46
+ constructor(options = {}) {
47
+ this.name = 'sqs';
48
+ this.library = '@aws-sdk/client-sqs';
49
+ this.client = null;
50
+ this.aws = null;
51
+ this.connected = false;
52
+ /** Active subscriptions, tracked so `disconnect()` stops their receive loops. */
53
+ this.subscriptions = new Set();
54
+ this.options = options;
55
+ }
56
+ // ---------------------------------------------------------------------
57
+ // Lifecycle
58
+ // ---------------------------------------------------------------------
59
+ async connect() {
60
+ try {
61
+ if (this.options.client) {
62
+ this.client = this.options.client;
63
+ this.tryLoadSdk();
64
+ }
65
+ else {
66
+ const aws = require('@aws-sdk/client-sqs');
67
+ this.aws = aws;
68
+ this.client = new aws.SQSClient({
69
+ region: this.options.region,
70
+ credentials: this.options.credentials,
71
+ endpoint: this.options.endpoint,
72
+ });
73
+ }
74
+ this.connected = true;
75
+ }
76
+ catch (err) {
77
+ this.connected = false;
78
+ this.client = null;
79
+ this.aws = null;
80
+ throw new errors_1.ConnectionError(`Failed to connect to SQS: ${err instanceof Error ? err.message : String(err)}`, { parent: err instanceof Error ? err : undefined, database: 'sqs' });
81
+ }
82
+ }
83
+ tryLoadSdk() {
84
+ if (this.aws)
85
+ return;
86
+ try {
87
+ this.aws = require('@aws-sdk/client-sqs');
88
+ }
89
+ catch {
90
+ this.aws = null;
91
+ }
92
+ }
93
+ async disconnect() {
94
+ for (const sub of this.subscriptions) {
95
+ try {
96
+ sub.stop();
97
+ }
98
+ catch {
99
+ // Best-effort teardown.
100
+ }
101
+ }
102
+ this.subscriptions.clear();
103
+ try {
104
+ this.client?.destroy?.();
105
+ }
106
+ finally {
107
+ this.client = null;
108
+ this.aws = null;
109
+ this.connected = false;
110
+ }
111
+ }
112
+ isConnected() {
113
+ return this.connected && this.client !== null;
114
+ }
115
+ /** Returns the underlying `SQSClient` (loosely typed) for anything not wrapped here. */
116
+ getClient() {
117
+ return this.requireClient();
118
+ }
119
+ requireClient() {
120
+ if (!this.client || !this.connected) {
121
+ throw new errors_1.ConnectionError('SQS client is not connected. Call connect() first.', {
122
+ database: 'sqs',
123
+ });
124
+ }
125
+ return this.client;
126
+ }
127
+ command(name, input) {
128
+ if (!this.aws)
129
+ this.tryLoadSdk();
130
+ const Ctor = this.aws?.[name];
131
+ if (typeof Ctor !== 'function') {
132
+ throw new errors_1.ConnectionError(`SQS command '${name}' is unavailable: '@aws-sdk/client-sqs' could not be loaded.`, { database: 'sqs' });
133
+ }
134
+ return new Ctor(input);
135
+ }
136
+ wrapError(action, err) {
137
+ const parent = err instanceof Error ? err : new Error(String(err));
138
+ const name = parent.name ? ` (${parent.name})` : '';
139
+ return new errors_1.DatabaseError(`SQS ${action} failed${name}: ${parent.message}`, {
140
+ parent,
141
+ original: parent.message,
142
+ });
143
+ }
144
+ // ---------------------------------------------------------------------
145
+ // Producing
146
+ // ---------------------------------------------------------------------
147
+ /**
148
+ * `SendMessage` — publish one `message` to the queue at `queueUrl`. The
149
+ * message is encoded to a string body (string as-is, Buffer → UTF-8, else
150
+ * JSON). Returns the message id (and FIFO sequence number, if any).
151
+ */
152
+ async publish(queueUrl, message, options = {}) {
153
+ const client = this.requireClient();
154
+ try {
155
+ const result = await client.send(this.command('SendMessageCommand', {
156
+ QueueUrl: queueUrl,
157
+ MessageBody: toBody(message),
158
+ DelaySeconds: options.delaySeconds,
159
+ MessageGroupId: options.messageGroupId,
160
+ MessageDeduplicationId: options.messageDeduplicationId,
161
+ MessageAttributes: options.messageAttributes,
162
+ }));
163
+ return { messageId: result?.MessageId, sequenceNumber: result?.SequenceNumber };
164
+ }
165
+ catch (err) {
166
+ throw this.wrapError(`SendMessage to '${queueUrl}'`, err);
167
+ }
168
+ }
169
+ // ---------------------------------------------------------------------
170
+ // Queue administration
171
+ // ---------------------------------------------------------------------
172
+ /** `CreateQueue` — create a queue by name. Returns its URL. */
173
+ async createQueue(name, options = {}) {
174
+ const client = this.requireClient();
175
+ try {
176
+ const result = await client.send(this.command('CreateQueueCommand', {
177
+ QueueName: name,
178
+ Attributes: options.attributes,
179
+ tags: options.tags,
180
+ }));
181
+ return result?.QueueUrl;
182
+ }
183
+ catch (err) {
184
+ throw this.wrapError(`CreateQueue '${name}'`, err);
185
+ }
186
+ }
187
+ /** Alias for `createQueue()`, matching the common store surface. */
188
+ createTopic(name, options = {}) {
189
+ return this.createQueue(name, options);
190
+ }
191
+ // ---------------------------------------------------------------------
192
+ // Consuming
193
+ // ---------------------------------------------------------------------
194
+ /**
195
+ * Subscribe to the queue at `queueUrl`: long-poll `ReceiveMessage` in a loop,
196
+ * invoke `handler` once per message, and (by default) `DeleteMessage` to ack
197
+ * each message after the handler resolves. Returns a subscription whose
198
+ * `stop()` ends the loop; the subscription is tracked so `disconnect()` stops
199
+ * it. The loop runs detached (not awaited); this method resolves immediately.
200
+ */
201
+ subscribe(queueUrl, handler, options = {}) {
202
+ const client = this.requireClient();
203
+ const autoDelete = options.autoDelete ?? true;
204
+ const pollIntervalMs = options.pollIntervalMs ?? 0;
205
+ let stopped = false;
206
+ const subscription = {
207
+ stop: () => {
208
+ stopped = true;
209
+ this.subscriptions.delete(subscription);
210
+ },
211
+ };
212
+ this.subscriptions.add(subscription);
213
+ const loop = async () => {
214
+ while (!stopped) {
215
+ const result = await client.send(this.command('ReceiveMessageCommand', {
216
+ QueueUrl: queueUrl,
217
+ MaxNumberOfMessages: options.maxMessages ?? 10,
218
+ WaitTimeSeconds: options.waitTimeSeconds ?? 20,
219
+ VisibilityTimeout: options.visibilityTimeout,
220
+ }));
221
+ const messages = result?.Messages ?? [];
222
+ for (const message of messages) {
223
+ if (stopped)
224
+ break;
225
+ await handler(message);
226
+ if (autoDelete && message?.ReceiptHandle) {
227
+ await client.send(this.command('DeleteMessageCommand', {
228
+ QueueUrl: queueUrl,
229
+ ReceiptHandle: message.ReceiptHandle,
230
+ }));
231
+ }
232
+ }
233
+ if (stopped)
234
+ break;
235
+ if (pollIntervalMs > 0)
236
+ await sleep(pollIntervalMs);
237
+ }
238
+ };
239
+ loop().catch(() => {
240
+ /* swallow — best-effort background polling */
241
+ });
242
+ return subscription;
243
+ }
244
+ }
245
+ exports.SqsStore = SqsStore;
246
+ exports.default = SqsStore;
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ /**
3
+ * Stardog store implementation.
4
+ *
5
+ * Stardog is an enterprise knowledge-graph / RDF triplestore. It speaks the
6
+ * SPARQL 1.1 Protocol over HTTP: a database exposes a query endpoint
7
+ * (`/<db>/query`) and an update endpoint (`/<db>/update`). There is no
8
+ * SQL-shaped surface, so it implements the minimal `NoSqlStore` marker
9
+ * interface (`src/nosql/store.ts`) rather than the SQL `Dialect` interface.
10
+ *
11
+ * ## Driver strategy - prefer HTTP over `fetch`
12
+ *
13
+ * Stardog publishes a `stardog` npm client, but this store prefers the plain
14
+ * SPARQL/HTTP protocol over the global `fetch` so it has no hard dependency
15
+ * (`library='fetch'`). For tests (and for callers who want their own
16
+ * transport) an alternative client can be injected via
17
+ * `StardogStoreOptions.client`; when omitted, a tiny internal client over
18
+ * `fetch` + `endpoint` is built at connect time.
19
+ *
20
+ * ## Surface
21
+ *
22
+ * - `query(sparql)` -> POST to `/<db>/query`, returns bindings
23
+ * - `update(sparql)` -> POST to `/<db>/update`
24
+ * - `ask(sparql)` -> POST an ASK query, returns the boolean
25
+ * - `add(triples)` -> `INSERT DATA { ... }` update
26
+ * - `drop(graph?)` -> `DROP GRAPH <g>` / `DROP ALL` update
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.StardogStore = exports.DEFAULT_STARDOG_DATABASE = exports.DEFAULT_STARDOG_ENDPOINT = void 0;
30
+ exports.createFetchClient = createFetchClient;
31
+ const errors_1 = require("../../errors");
32
+ /** Default Stardog base URL. */
33
+ exports.DEFAULT_STARDOG_ENDPOINT = 'http://localhost:5820';
34
+ /** Default database name. */
35
+ exports.DEFAULT_STARDOG_DATABASE = 'db';
36
+ /** Build a `fetch`-backed SPARQL client for the given endpoint. */
37
+ function createFetchClient(endpoint, headers) {
38
+ const base = endpoint.endsWith('/') ? endpoint : `${endpoint}/`;
39
+ const buildUrl = (path) => new URL(path.replace(/^\//, ''), base).toString();
40
+ return {
41
+ async query(path, sparql) {
42
+ const res = await fetch(buildUrl(path), {
43
+ method: 'POST',
44
+ headers: {
45
+ 'Content-Type': 'application/sparql-query',
46
+ Accept: 'application/sparql-results+json',
47
+ ...(headers ?? {}),
48
+ },
49
+ body: sparql,
50
+ });
51
+ if (!res.ok)
52
+ throw new Error(`HTTP ${res.status} ${res.statusText}`);
53
+ return res.json();
54
+ },
55
+ async update(path, sparql) {
56
+ const res = await fetch(buildUrl(path), {
57
+ method: 'POST',
58
+ headers: { 'Content-Type': 'application/sparql-update', ...(headers ?? {}) },
59
+ body: sparql,
60
+ });
61
+ if (!res.ok)
62
+ throw new Error(`HTTP ${res.status} ${res.statusText}`);
63
+ const text = await res.text();
64
+ return text || undefined;
65
+ },
66
+ };
67
+ }
68
+ /**
69
+ * `StardogStore` wraps a Stardog database's SPARQL query/update endpoints
70
+ * behind the `NoSqlStore` lifecycle.
71
+ */
72
+ class StardogStore {
73
+ constructor(options = {}) {
74
+ this.name = 'stardog';
75
+ this.library = 'fetch';
76
+ this.client = null;
77
+ this.connected = false;
78
+ this.endpoint = options.endpoint ?? exports.DEFAULT_STARDOG_ENDPOINT;
79
+ this.database = options.database ?? exports.DEFAULT_STARDOG_DATABASE;
80
+ this.injectedClient = options.client;
81
+ this.headers = options.headers;
82
+ }
83
+ /** SPARQL query endpoint path for the configured database. */
84
+ get queryPath() {
85
+ return `/${this.database}/query`;
86
+ }
87
+ /** SPARQL update endpoint path for the configured database. */
88
+ get updatePath() {
89
+ return `/${this.database}/update`;
90
+ }
91
+ // ---------------------------------------------------------------------
92
+ // Connection lifecycle
93
+ // ---------------------------------------------------------------------
94
+ async connect() {
95
+ if (this.connected && this.client)
96
+ return;
97
+ this.client = this.injectedClient ?? createFetchClient(this.endpoint, this.headers);
98
+ this.connected = true;
99
+ }
100
+ async disconnect() {
101
+ this.client = null;
102
+ this.connected = false;
103
+ }
104
+ isConnected() {
105
+ return this.connected && this.client !== null;
106
+ }
107
+ /** Returns the underlying (internal or injected) SPARQL HTTP client. */
108
+ getClient() {
109
+ return this.requireClient();
110
+ }
111
+ requireClient() {
112
+ if (!this.client) {
113
+ throw new errors_1.ConnectionError('Not connected to Stardog', {
114
+ database: 'stardog',
115
+ host: this.endpoint,
116
+ });
117
+ }
118
+ return this.client;
119
+ }
120
+ // ---------------------------------------------------------------------
121
+ // SPARQL surface
122
+ // ---------------------------------------------------------------------
123
+ /** Runs a SPARQL SELECT/CONSTRUCT query; returns the result bindings. */
124
+ async query(sparql) {
125
+ const client = this.requireClient();
126
+ try {
127
+ const body = await client.query(this.queryPath, sparql);
128
+ return body?.results?.bindings ?? [];
129
+ }
130
+ catch (err) {
131
+ const parent = err instanceof Error ? err : new Error(String(err));
132
+ throw errors_1.DatabaseError.from(parent, { message: `Stardog query failed: ${parent.message}`, sql: sparql });
133
+ }
134
+ }
135
+ /** Runs a SPARQL ASK query; returns the boolean answer. */
136
+ async ask(sparql) {
137
+ const client = this.requireClient();
138
+ try {
139
+ const body = await client.query(this.queryPath, sparql);
140
+ return Boolean(body?.boolean);
141
+ }
142
+ catch (err) {
143
+ const parent = err instanceof Error ? err : new Error(String(err));
144
+ throw errors_1.DatabaseError.from(parent, { message: `Stardog ask failed: ${parent.message}`, sql: sparql });
145
+ }
146
+ }
147
+ /** Runs a SPARQL UPDATE (INSERT/DELETE/DROP/...). */
148
+ async update(sparql) {
149
+ const client = this.requireClient();
150
+ try {
151
+ return await client.update(this.updatePath, sparql);
152
+ }
153
+ catch (err) {
154
+ const parent = err instanceof Error ? err : new Error(String(err));
155
+ throw errors_1.DatabaseError.from(parent, { message: `Stardog update failed: ${parent.message}`, sql: sparql });
156
+ }
157
+ }
158
+ /** Inserts triples via `INSERT DATA { ... }`. Accepts a triple string or array. */
159
+ async add(triples, graph) {
160
+ const body = Array.isArray(triples) ? triples.join('\n') : triples;
161
+ const inner = graph ? `GRAPH <${graph}> { ${body} }` : body;
162
+ return this.update(`INSERT DATA { ${inner} }`);
163
+ }
164
+ /** Drops a named graph, or all graphs when no graph is given. */
165
+ async drop(graph) {
166
+ return this.update(graph ? `DROP GRAPH <${graph}>` : 'DROP ALL');
167
+ }
168
+ }
169
+ exports.StardogStore = StardogStore;
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ /**
3
+ * StarRocks store.
4
+ *
5
+ * StarRocks is a high-performance real-time analytical (MPP OLAP) database.
6
+ * Crucially it speaks the **MySQL wire protocol**, so it is queried with the
7
+ * `mysql2` driver over a normal MySQL connection/pool. Despite the MySQL
8
+ * wire, StarRocks is a columnar analytics engine (no OLTP transactions, no
9
+ * row-level UPDATE/DELETE in the usual sense on most table types), which does
10
+ * not fit this ORM's SQL `Dialect` abstraction cleanly, so it is modelled as
11
+ * a `NoSqlStore` (`src/nosql/store.ts`) exposing a direct `query`/`ingest`
12
+ * surface.
13
+ *
14
+ * ## Driver: `mysql2` (MySQL-wire)
15
+ *
16
+ * The `mysql2` package is an optional peer dependency, lazily `require`d
17
+ * inside `connect()` so importing this module never forces it to be
18
+ * installed. Tests inject a pre-built mock connection via
19
+ * `StarrocksStoreOptions.client`, which skips the `require` entirely.
20
+ *
21
+ * ## Ingestion
22
+ *
23
+ * `ingest()` here performs a batched `INSERT` over the MySQL wire, which is
24
+ * convenient for small/medium loads. For high-throughput loading StarRocks
25
+ * also offers **Stream Load** (an HTTP `PUT /api/{db}/{table}/_stream_load`
26
+ * endpoint). Stream Load is intentionally *not* wired here (it is a separate
27
+ * HTTP transport, optional); use the `mysql2`-based `ingest()` for wire-level
28
+ * inserts, or POST to the Stream Load endpoint yourself for bulk pipelines.
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.StarrocksStore = void 0;
32
+ const errors_1 = require("../../errors");
33
+ /**
34
+ * `StarrocksStore` wraps a `mysql2` connection to a StarRocks frontend and
35
+ * exposes `query(sql, params)` for reads/DDL and `ingest(table, rows)` for
36
+ * batched wire-level inserts.
37
+ */
38
+ class StarrocksStore {
39
+ constructor(options = {}) {
40
+ this.name = 'starrocks';
41
+ this.library = 'mysql2';
42
+ this.client = null;
43
+ this.connected = false;
44
+ this.options = options;
45
+ }
46
+ // ---------------------------------------------------------------------
47
+ // NoSqlStore lifecycle
48
+ // ---------------------------------------------------------------------
49
+ async connect() {
50
+ if (this.connected && this.client) {
51
+ return;
52
+ }
53
+ try {
54
+ let client = this.options.client;
55
+ if (!client) {
56
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
57
+ const mysql = require('mysql2/promise');
58
+ client = (await mysql.createConnection({
59
+ host: this.options.host,
60
+ port: this.options.port,
61
+ user: this.options.user,
62
+ password: this.options.password,
63
+ database: this.options.database,
64
+ ...this.options.connectionOptions,
65
+ }));
66
+ }
67
+ this.client = client;
68
+ this.connected = true;
69
+ }
70
+ catch (err) {
71
+ this.client = null;
72
+ this.connected = false;
73
+ const parent = err instanceof Error ? err : new Error(String(err));
74
+ throw new errors_1.ConnectionError(`Unable to connect to StarRocks: ${parent.message}`, {
75
+ parent,
76
+ database: 'starrocks',
77
+ host: this.options.host,
78
+ });
79
+ }
80
+ }
81
+ async disconnect() {
82
+ if (this.client) {
83
+ try {
84
+ await this.client.end?.();
85
+ }
86
+ finally {
87
+ this.client = null;
88
+ this.connected = false;
89
+ }
90
+ }
91
+ else {
92
+ this.connected = false;
93
+ }
94
+ }
95
+ isConnected() {
96
+ return this.connected && this.client !== null;
97
+ }
98
+ /** Returns the underlying `mysql2` connection for anything not wrapped here. */
99
+ getClient() {
100
+ return this.requireClient();
101
+ }
102
+ requireClient() {
103
+ if (!this.client || !this.connected) {
104
+ throw new errors_1.ConnectionError('StarRocks client is not connected. Call connect() first.', {
105
+ database: 'starrocks',
106
+ });
107
+ }
108
+ return this.client;
109
+ }
110
+ // ---------------------------------------------------------------------
111
+ // Query + ingest
112
+ // ---------------------------------------------------------------------
113
+ /**
114
+ * Execute a SQL statement over the MySQL wire with optional positional
115
+ * `params` and return the result rows (the first element of `mysql2`'s
116
+ * `[rows, fields]` tuple).
117
+ */
118
+ async query(sql, params) {
119
+ const client = this.requireClient();
120
+ try {
121
+ const [rows] = await client.query(sql, params);
122
+ return (rows ?? []);
123
+ }
124
+ catch (err) {
125
+ const parent = err instanceof Error ? err : new Error(String(err));
126
+ throw errors_1.DatabaseError.from(parent, {
127
+ message: `StarRocks query failed: ${parent.message}`,
128
+ sql,
129
+ });
130
+ }
131
+ }
132
+ /**
133
+ * Batch-insert `rows` into `table` via a single parameterized
134
+ * `INSERT INTO table (cols) VALUES (...)` over the MySQL wire. Columns are
135
+ * taken from the first row. Returns the driver result (`OkPacket`).
136
+ *
137
+ * For high-throughput bulk loading, use StarRocks Stream Load (HTTP) instead
138
+ * — see the module header.
139
+ */
140
+ async ingest(table, rows) {
141
+ if (rows.length === 0) {
142
+ throw new errors_1.DatabaseError('ingest() requires at least one row', {
143
+ original: 'empty rows array',
144
+ });
145
+ }
146
+ const columns = Object.keys(rows[0]);
147
+ if (columns.length === 0) {
148
+ throw new errors_1.DatabaseError('ingest() requires at least one column', {
149
+ original: 'empty row object',
150
+ });
151
+ }
152
+ const values = rows.map((r) => columns.map((c) => r[c]));
153
+ const client = this.requireClient();
154
+ // mysql2 expands a single `?` bound to a nested array into a bulk VALUES list.
155
+ const sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES ?`;
156
+ try {
157
+ const [result] = await client.query(sql, [values]);
158
+ return result;
159
+ }
160
+ catch (err) {
161
+ const parent = err instanceof Error ? err : new Error(String(err));
162
+ throw errors_1.DatabaseError.from(parent, {
163
+ message: `StarRocks ingest failed: ${parent.message}`,
164
+ sql,
165
+ });
166
+ }
167
+ }
168
+ }
169
+ exports.StarrocksStore = StarrocksStore;
170
+ exports.default = StarrocksStore;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });