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,213 @@
1
+ "use strict";
2
+ /**
3
+ * Sumo Logic store implementation.
4
+ *
5
+ * Sumo Logic is a cloud log-management and analytics platform. Logs are
6
+ * ingested by POSTing to an HTTP Source collector URL, and searched with the
7
+ * Search Job API (create a job, then poll for status/messages). There is no
8
+ * SQL-shaped query surface, no row-level UPDATE/DELETE, and no identifier
9
+ * escaping, so Sumo Logic does not fit the SQL `Dialect` interface
10
+ * (`src/dialects/dialect.ts`). This class implements the minimal
11
+ * `NoSqlStore` marker interface (`src/nosql/store.ts`) and exposes Sumo's
12
+ * ingest/search API.
13
+ *
14
+ * ## No canonical driver - HTTP over `fetch`
15
+ *
16
+ * Sumo Logic has no single canonical npm client; it is an HTTP/JSON API.
17
+ * This store talks to it with the global `fetch` (so `library` is
18
+ * `'fetch'`). For tests (and custom transports) an alternative HTTP client
19
+ * can be injected via `SumoLogicStoreOptions.client`.
20
+ *
21
+ * Ingest and search live on different hosts: ingest targets the per-source
22
+ * `collectorURL`, while search targets the regional `apiURL`. The internal
23
+ * client resolves absolute URLs verbatim, so `push()` posts to the full
24
+ * collector URL while the search/metadata methods use relative API paths.
25
+ *
26
+ * ## Endpoints wrapped
27
+ *
28
+ * - `push(lines)` -> `POST <collectorURL>` (HTTP Source ingest)
29
+ * - `query(q, opts?)` -> `POST /api/v1/search/jobs` (create search job)
30
+ * - `messages(id)` -> `GET /api/v1/search/jobs/<id>/messages`
31
+ * - `labels()` -> `GET /api/v1/fields` (field names)
32
+ * - `streams()` -> `GET /api/v1/collectors` (collectors)
33
+ */
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.SumoLogicStore = exports.DEFAULT_SUMOLOGIC_API_URL = void 0;
36
+ exports.createFetchClient = createFetchClient;
37
+ const errors_1 = require("../../errors");
38
+ /** Default Sumo Logic API base URL. */
39
+ exports.DEFAULT_SUMOLOGIC_API_URL = 'https://api.sumologic.com';
40
+ /** Build a `fetch`-backed client for the given base URL. */
41
+ function createFetchClient(baseURL, headers) {
42
+ const buildUrl = (path, params) => {
43
+ // Absolute URLs (the collector URL) override the base entirely.
44
+ const url = new URL(path, baseURL.endsWith('/') ? baseURL : `${baseURL}/`);
45
+ for (const [key, value] of Object.entries(params ?? {})) {
46
+ if (value === undefined)
47
+ continue;
48
+ if (Array.isArray(value)) {
49
+ for (const item of value)
50
+ url.searchParams.append(key, item);
51
+ }
52
+ else {
53
+ url.searchParams.set(key, value);
54
+ }
55
+ }
56
+ return url.toString();
57
+ };
58
+ return {
59
+ async get(path, params) {
60
+ const res = await fetch(buildUrl(path, params), {
61
+ method: 'GET',
62
+ headers: { Accept: 'application/json', ...(headers ?? {}) },
63
+ });
64
+ if (!res.ok)
65
+ throw new Error(`HTTP ${res.status} ${res.statusText}`);
66
+ return res.json();
67
+ },
68
+ async post(path, body, contentType) {
69
+ const res = await fetch(buildUrl(path), {
70
+ method: 'POST',
71
+ body,
72
+ headers: { ...(headers ?? {}), ...(contentType ? { 'Content-Type': contentType } : {}) },
73
+ });
74
+ if (!res.ok)
75
+ throw new Error(`HTTP ${res.status} ${res.statusText}`);
76
+ const text = await res.text();
77
+ if (!text)
78
+ return undefined;
79
+ try {
80
+ return JSON.parse(text);
81
+ }
82
+ catch {
83
+ return text;
84
+ }
85
+ },
86
+ };
87
+ }
88
+ /**
89
+ * `SumoLogicStore` wraps Sumo Logic's HTTP Source ingest and its Search Job
90
+ * API (create job + fetch messages) plus field/collector metadata behind the
91
+ * `NoSqlStore` lifecycle.
92
+ */
93
+ class SumoLogicStore {
94
+ constructor(options = {}) {
95
+ this.name = 'sumologic';
96
+ this.library = 'fetch';
97
+ this.client = null;
98
+ this.connected = false;
99
+ this.apiURL = options.apiURL ?? exports.DEFAULT_SUMOLOGIC_API_URL;
100
+ this.collectorURL = options.collectorURL;
101
+ this.injectedClient = options.client;
102
+ this.headers = options.headers;
103
+ }
104
+ // ---------------------------------------------------------------------
105
+ // Connection lifecycle
106
+ // ---------------------------------------------------------------------
107
+ async connect() {
108
+ if (this.connected && this.client)
109
+ return;
110
+ this.client = this.injectedClient ?? createFetchClient(this.apiURL, this.headers);
111
+ this.connected = true;
112
+ }
113
+ async disconnect() {
114
+ this.client = null;
115
+ this.connected = false;
116
+ }
117
+ isConnected() {
118
+ return this.connected && this.client !== null;
119
+ }
120
+ /** Returns the underlying (internal or injected) HTTP client. */
121
+ getClient() {
122
+ return this.requireClient();
123
+ }
124
+ requireClient() {
125
+ if (!this.client) {
126
+ throw new errors_1.ConnectionError('Not connected to Sumo Logic', {
127
+ database: 'sumologic',
128
+ host: this.apiURL,
129
+ });
130
+ }
131
+ return this.client;
132
+ }
133
+ async doGet(path, params, action) {
134
+ const client = this.requireClient();
135
+ try {
136
+ return await client.get(path, params);
137
+ }
138
+ catch (err) {
139
+ const parent = err instanceof Error ? err : new Error(String(err));
140
+ throw errors_1.DatabaseError.from(parent, {
141
+ message: `Sumo Logic ${action ?? 'request'} failed: ${parent.message}`,
142
+ });
143
+ }
144
+ }
145
+ // ---------------------------------------------------------------------
146
+ // Ingest (HTTP Source)
147
+ // ---------------------------------------------------------------------
148
+ /**
149
+ * Ingests raw log lines by POSTing them (newline-delimited) to the
150
+ * configured HTTP Source `collectorURL`. Accepts a single string or an
151
+ * array of lines (joined with newlines).
152
+ */
153
+ async push(lines) {
154
+ if (!this.collectorURL) {
155
+ throw new errors_1.DatabaseError('Sumo Logic push requires a collectorURL to be configured');
156
+ }
157
+ const client = this.requireClient();
158
+ const body = Array.isArray(lines) ? lines.join('\n') : lines;
159
+ try {
160
+ return await client.post(this.collectorURL, body, 'text/plain');
161
+ }
162
+ catch (err) {
163
+ const parent = err instanceof Error ? err : new Error(String(err));
164
+ throw errors_1.DatabaseError.from(parent, { message: `Sumo Logic push failed: ${parent.message}` });
165
+ }
166
+ }
167
+ // ---------------------------------------------------------------------
168
+ // Search Job API
169
+ // ---------------------------------------------------------------------
170
+ /**
171
+ * Creates a search job via `POST /api/v1/search/jobs`. Returns the parsed
172
+ * response (typically `{ id }`); use `messages(id)` to fetch results once
173
+ * the job completes.
174
+ */
175
+ async query(q, options = {}) {
176
+ const client = this.requireClient();
177
+ const payload = {
178
+ query: q,
179
+ from: options.from === undefined ? undefined : String(options.from),
180
+ to: options.to === undefined ? undefined : String(options.to),
181
+ timeZone: options.timeZone ?? 'UTC',
182
+ byReceiptTime: options.byReceiptTime,
183
+ };
184
+ try {
185
+ return await client.post('/api/v1/search/jobs', JSON.stringify(payload), 'application/json');
186
+ }
187
+ catch (err) {
188
+ const parent = err instanceof Error ? err : new Error(String(err));
189
+ throw errors_1.DatabaseError.from(parent, { message: `Sumo Logic query failed: ${parent.message}` });
190
+ }
191
+ }
192
+ /** Fetches messages for a completed search job via `GET /api/v1/search/jobs/<id>/messages`. */
193
+ async messages(jobId, offset = 0, limit = 100) {
194
+ return this.doGet(`/api/v1/search/jobs/${encodeURIComponent(jobId)}/messages`, { offset: String(offset), limit: String(limit) }, 'messages');
195
+ }
196
+ /** Fetches the status of a search job via `GET /api/v1/search/jobs/<id>`. */
197
+ async jobStatus(jobId) {
198
+ return this.doGet(`/api/v1/search/jobs/${encodeURIComponent(jobId)}`, undefined, 'jobStatus');
199
+ }
200
+ // ---------------------------------------------------------------------
201
+ // Metadata
202
+ // ---------------------------------------------------------------------
203
+ /** Lists the configured fields via `GET /api/v1/fields`. */
204
+ async labels() {
205
+ return this.doGet('/api/v1/fields', undefined, 'labels');
206
+ }
207
+ /** Lists the collectors via `GET /api/v1/collectors`. */
208
+ async streams() {
209
+ return this.doGet('/api/v1/collectors', undefined, 'streams');
210
+ }
211
+ }
212
+ exports.SumoLogicStore = SumoLogicStore;
213
+ exports.default = SumoLogicStore;
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ /**
3
+ * SurrealDB store implementation for the Prorm NoSQL layer.
4
+ *
5
+ * SurrealDB is a multi-model database with its own record/graph model and
6
+ * the SurrealQL query language, so it does not fit the SQL-shaped `Dialect`
7
+ * interface (no identifier escaping, no SQL DDL). This class implements the
8
+ * minimal `NoSqlStore` marker interface for connection lifecycle and
9
+ * otherwise exposes SurrealDB's real API surface directly: record CRUD over
10
+ * "things" (table or `table:id` record identifiers) plus raw SurrealQL via
11
+ * `query()`.
12
+ *
13
+ * Uses the `surrealdb` driver. The driver is loaded lazily inside
14
+ * `connect()` (via `require`) so importing this module never forces the
15
+ * optional `surrealdb` dependency to be installed. For testing (or to reuse
16
+ * an already-configured connection) a pre-built `Surreal` instance can be
17
+ * injected through {@link SurrealStoreOptions.client}, in which case the
18
+ * `require` is skipped entirely.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.SurrealStore = void 0;
22
+ const errors_1 = require("../../errors");
23
+ /**
24
+ * `SurrealStore` wraps the `surrealdb` driver's `Surreal` client, exposing
25
+ * record CRUD (`create`/`select`/`update`/`merge`/`delete`) and raw
26
+ * SurrealQL (`query`) as a small promise-based API.
27
+ */
28
+ class SurrealStore {
29
+ constructor(options) {
30
+ this.name = 'surrealdb';
31
+ this.library = 'surrealdb';
32
+ this.db = null;
33
+ this.connected = false;
34
+ if (!options || !options.url) {
35
+ throw new errors_1.DatabaseError('SurrealStore requires a connection `url`', {
36
+ code: 'INVALID_CONNECTION',
37
+ });
38
+ }
39
+ this.options = options;
40
+ }
41
+ // ---------------------------------------------------------------------
42
+ // Connection lifecycle
43
+ // ---------------------------------------------------------------------
44
+ async connect() {
45
+ if (this.connected && this.db) {
46
+ return;
47
+ }
48
+ try {
49
+ let db = this.options.client;
50
+ if (!db) {
51
+ // Lazy-load the optional driver only when we actually need to build
52
+ // a connection, so importing this module never requires `surrealdb`.
53
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
54
+ const { Surreal } = require('surrealdb');
55
+ db = new Surreal();
56
+ }
57
+ await db.connect(this.options.url);
58
+ if (this.options.username !== undefined || this.options.password !== undefined) {
59
+ await db.signin({
60
+ username: this.options.username,
61
+ password: this.options.password,
62
+ });
63
+ }
64
+ if (this.options.namespace !== undefined || this.options.database !== undefined) {
65
+ await db.use({
66
+ namespace: this.options.namespace,
67
+ database: this.options.database,
68
+ });
69
+ }
70
+ this.db = db;
71
+ this.connected = true;
72
+ }
73
+ catch (error) {
74
+ this.db = null;
75
+ this.connected = false;
76
+ throw new errors_1.ConnectionError('Failed to connect to SurrealDB', {
77
+ parent: error instanceof Error ? error : undefined,
78
+ database: this.options.database,
79
+ });
80
+ }
81
+ }
82
+ async disconnect() {
83
+ const db = this.db;
84
+ this.db = null;
85
+ this.connected = false;
86
+ if (!db) {
87
+ return;
88
+ }
89
+ try {
90
+ await db.close();
91
+ }
92
+ catch (error) {
93
+ throw new errors_1.DatabaseError('Failed to disconnect from SurrealDB', {
94
+ parent: error instanceof Error ? error : undefined,
95
+ original: error instanceof Error ? error.message : String(error),
96
+ });
97
+ }
98
+ }
99
+ isConnected() {
100
+ return this.connected && this.db !== null;
101
+ }
102
+ /** Returns the underlying native `Surreal` client. */
103
+ getClient() {
104
+ return this.requireClient();
105
+ }
106
+ requireClient() {
107
+ if (!this.db || !this.connected) {
108
+ throw new errors_1.ConnectionError('SurrealStore is not connected. Call connect() first.', {
109
+ code: 'INVALID_CONNECTION',
110
+ database: this.options.database,
111
+ });
112
+ }
113
+ return this.db;
114
+ }
115
+ async exec(op, fn) {
116
+ const db = this.requireClient();
117
+ try {
118
+ return await fn(db);
119
+ }
120
+ catch (error) {
121
+ throw new errors_1.DatabaseError(`SurrealDB operation "${op}" failed`, {
122
+ code: 'QUERY_ERROR',
123
+ parent: error instanceof Error ? error : undefined,
124
+ original: error instanceof Error ? error.message : String(error),
125
+ });
126
+ }
127
+ }
128
+ // ---------------------------------------------------------------------
129
+ // Record operations
130
+ // ---------------------------------------------------------------------
131
+ /**
132
+ * Create a record. `thing` may be a table name (`'user'`, id auto-
133
+ * generated) or a specific record id (`'user:jane'`). Passthrough to the
134
+ * driver's `Surreal.create()`.
135
+ */
136
+ async create(thing, data) {
137
+ return this.exec('create', (db) => db.create(thing, data));
138
+ }
139
+ /**
140
+ * Select a record or all records in a table. Passthrough to the driver's
141
+ * `Surreal.select()`.
142
+ */
143
+ async select(thing) {
144
+ return this.exec('select', (db) => db.select(thing));
145
+ }
146
+ /**
147
+ * Replace the content of a record (or every record in a table).
148
+ * Passthrough to the driver's `Surreal.update()`.
149
+ */
150
+ async update(thing, data) {
151
+ return this.exec('update', (db) => db.update(thing, data));
152
+ }
153
+ /**
154
+ * Merge the given data into a record (or every record in a table),
155
+ * leaving unspecified fields intact. Passthrough to the driver's
156
+ * `Surreal.merge()`.
157
+ */
158
+ async merge(thing, data) {
159
+ return this.exec('merge', (db) => db.merge(thing, data));
160
+ }
161
+ /**
162
+ * Delete a record (or every record in a table). Passthrough to the
163
+ * driver's `Surreal.delete()`.
164
+ */
165
+ async delete(thing) {
166
+ return this.exec('delete', (db) => db.delete(thing));
167
+ }
168
+ /**
169
+ * Run a raw SurrealQL statement (or several `;`-separated statements),
170
+ * optionally binding `vars` as `$name` parameters. Returns the driver's
171
+ * result array (one entry per statement). Passthrough to the driver's
172
+ * `Surreal.query()`.
173
+ */
174
+ async query(surql, vars) {
175
+ return this.exec('query', (db) => db.query(surql, vars));
176
+ }
177
+ }
178
+ exports.SurrealStore = SurrealStore;
179
+ exports.default = SurrealStore;
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ /**
3
+ * TerminusDB store implementation.
4
+ *
5
+ * TerminusDB is an immutable, versioned document/graph database with a
6
+ * git-like data model: every write produces a new commit on a branch, and
7
+ * the full commit history is retained, so past states are always
8
+ * reconstructable and the store is effectively append-only/auditable.
9
+ * Documents are typed JSON objects; queries are expressed in WOQL (the Web
10
+ * Object Query Language).
11
+ *
12
+ * TerminusDB is not a SQL `Dialect`, so this class implements the minimal
13
+ * `NoSqlStore` marker interface plus the shared ledger surface:
14
+ * - `append(table, data)` -> `addDocument` of `{ '@type': table, ...data }`.
15
+ * - `get(table, id)` -> `getDocument` by `<table>/<id>`.
16
+ * - `history(table, id)` -> commit-log WOQL query for the document.
17
+ * - `verify(table, id)` -> fetch the document + report existence (its
18
+ * presence in the immutable commit graph is its provenance).
19
+ * - `query(woql)` -> raw WOQL passthrough.
20
+ *
21
+ * ## Lazy driver loading
22
+ *
23
+ * `@terminusdb/terminusdb-client` is loaded lazily inside `connect()`. Tests
24
+ * inject a pre-built, already-connected `WOQLClient` via
25
+ * `TerminusdbStoreOptions.client`, bypassing the `require`.
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.TerminusdbStore = void 0;
29
+ const errors_1 = require("../../errors");
30
+ /**
31
+ * `TerminusdbStore` wraps a `WOQLClient` behind the shared ledger surface.
32
+ */
33
+ class TerminusdbStore {
34
+ constructor(options = {}) {
35
+ this.name = 'terminusdb';
36
+ this.library = '@terminusdb/terminusdb-client';
37
+ this.client = null;
38
+ this.connected = false;
39
+ this.options = options;
40
+ }
41
+ // ---------------------------------------------------------------------
42
+ // Connection lifecycle
43
+ // ---------------------------------------------------------------------
44
+ async connect() {
45
+ if (this.connected && this.client) {
46
+ return;
47
+ }
48
+ try {
49
+ if (this.options.client) {
50
+ this.client = this.options.client;
51
+ }
52
+ else {
53
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
54
+ const mod = require('@terminusdb/terminusdb-client');
55
+ const WOQLClient = mod.WOQLClient ?? mod.default?.WOQLClient ?? mod.default;
56
+ this.client = new WOQLClient(this.options.url ?? 'http://localhost:6363', {
57
+ user: this.options.user,
58
+ key: this.options.key,
59
+ organization: this.options.organization,
60
+ });
61
+ if (typeof this.client.connect === 'function') {
62
+ await this.client.connect();
63
+ }
64
+ }
65
+ if (this.options.db && typeof this.client.db === 'function') {
66
+ this.client.db(this.options.db);
67
+ }
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 TerminusDB: ${parent.message}`, {
75
+ parent,
76
+ database: 'terminusdb',
77
+ });
78
+ }
79
+ }
80
+ async disconnect() {
81
+ this.client = null;
82
+ this.connected = false;
83
+ }
84
+ isConnected() {
85
+ return this.connected && this.client !== null;
86
+ }
87
+ /** Returns the underlying `WOQLClient` for anything not wrapped here. */
88
+ getClient() {
89
+ return this.requireClient();
90
+ }
91
+ requireClient() {
92
+ if (!this.client || !this.connected) {
93
+ throw new errors_1.ConnectionError('Not connected to TerminusDB. Call connect() first.', {
94
+ database: 'terminusdb',
95
+ });
96
+ }
97
+ return this.client;
98
+ }
99
+ fullId(table, id) {
100
+ return id.includes('/') ? id : `${table}/${id}`;
101
+ }
102
+ async run(action, fn) {
103
+ const client = this.requireClient();
104
+ try {
105
+ return await fn(client);
106
+ }
107
+ catch (err) {
108
+ const parent = err instanceof Error ? err : new Error(String(err));
109
+ throw errors_1.DatabaseError.from(parent, { message: `TerminusDB ${action} failed: ${parent.message}` });
110
+ }
111
+ }
112
+ // ---------------------------------------------------------------------
113
+ // Ledger surface
114
+ // ---------------------------------------------------------------------
115
+ /**
116
+ * Insert `data` as a new document of type `table` (a new commit). Returns
117
+ * whatever `addDocument` reports (typically the inserted document id(s)).
118
+ */
119
+ async append(table, data) {
120
+ return this.run('append', (client) => client.addDocument({ '@type': table, ...data }, undefined, undefined, `append ${table}`));
121
+ }
122
+ /** Fetch the current revision of document `<table>/<id>`. */
123
+ async get(table, id) {
124
+ return this.run('get', (client) => client.getDocument({ id: this.fullId(table, id) }));
125
+ }
126
+ /**
127
+ * Return the commit history for document `<table>/<id>` via a WOQL query
128
+ * over the commit graph. Every past revision lives in the immutable commit
129
+ * chain, so this surfaces the document's provenance.
130
+ */
131
+ async history(table, id) {
132
+ const docId = this.fullId(table, id);
133
+ return this.run('history', (client) => client.query({ '@type': 'CommitHistory', document: docId }));
134
+ }
135
+ /**
136
+ * Verify document `<table>/<id>` by reading it back from the immutable
137
+ * store. Returns `{ id, exists, document }` - existence in the commit graph
138
+ * is the provenance guarantee (TerminusDB never mutates past commits).
139
+ */
140
+ async verify(table, id) {
141
+ const docId = this.fullId(table, id);
142
+ const document = await this.run('verify', (client) => client.getDocument({ id: docId }).catch(() => null));
143
+ return { id: docId, exists: document != null, document };
144
+ }
145
+ /** Run a raw WOQL query object. */
146
+ async query(woql, commitMsg) {
147
+ return this.run('query', (client) => client.query(woql, commitMsg));
148
+ }
149
+ }
150
+ exports.TerminusdbStore = TerminusdbStore;
151
+ exports.default = TerminusdbStore;