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,160 @@
1
+ "use strict";
2
+ /**
3
+ * Gearman job-server store.
4
+ *
5
+ * Gearman is a generic application framework for farming out work: a *client*
6
+ * submits a job for a named function, the Gearman *job server* routes it to a
7
+ * *worker* that has registered a handler for that function, and the result
8
+ * flows back. It is not a database and does not fit the SQL-shaped `Dialect`
9
+ * interface, so this class implements the minimal `NoSqlStore` marker
10
+ * interface and exposes Gearman's real submit/register operations instead.
11
+ *
12
+ * Uses the `gearman` driver. It is an optional peer loaded lazily (via
13
+ * `require`) inside `connect()`, so importing this module does not require it
14
+ * to be installed unless you actually connect. A pre-built client can be
15
+ * injected via `GearmanStoreOptions.client`, in which case `connect()` adopts
16
+ * it and skips the `require` entirely (used by the unit tests to inject a
17
+ * mock).
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.GearmanStore = void 0;
21
+ const errors_1 = require("../../errors");
22
+ function wrapConnectionError(err) {
23
+ const parent = err instanceof Error ? err : new Error(String(err));
24
+ const message = /econnrefused/i.test(parent.message)
25
+ ? 'Connection refused'
26
+ : `Unable to connect to Gearman: ${parent.message}`;
27
+ return new errors_1.ConnectionError(message, { parent, database: 'gearman' });
28
+ }
29
+ function wrapDatabaseError(err, action) {
30
+ const parent = err instanceof Error ? err : new Error(String(err));
31
+ return errors_1.DatabaseError.from(parent, { message: `Gearman ${action} failed: ${parent.message}` });
32
+ }
33
+ /**
34
+ * `GearmanStore` wraps a single `gearman` client and exposes the common queue
35
+ * surface over Gearman functions: `enqueue()` submits a job, `process()`
36
+ * registers a worker handler, and job status/removal/stats route to the
37
+ * driver's corresponding calls.
38
+ */
39
+ class GearmanStore {
40
+ constructor(options = {}) {
41
+ this.name = 'gearman';
42
+ this.library = 'gearman';
43
+ this.client = null;
44
+ this.connected = false;
45
+ this.options = options;
46
+ }
47
+ // ---------------------------------------------------------------------
48
+ // Connection lifecycle
49
+ // ---------------------------------------------------------------------
50
+ async connect() {
51
+ if (this.connected && this.client) {
52
+ return;
53
+ }
54
+ try {
55
+ if (this.options.client != null) {
56
+ this.client = this.options.client;
57
+ }
58
+ else {
59
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
60
+ const gearman = require('gearman');
61
+ const host = this.options.host || '127.0.0.1';
62
+ const port = this.options.port || 4730;
63
+ this.client =
64
+ typeof gearman.createClient === 'function'
65
+ ? gearman.createClient(port, host)
66
+ : new gearman.Client(port, host);
67
+ if (typeof this.client.connect === 'function') {
68
+ await this.client.connect();
69
+ }
70
+ }
71
+ this.connected = true;
72
+ }
73
+ catch (err) {
74
+ this.client = null;
75
+ this.connected = false;
76
+ throw wrapConnectionError(err);
77
+ }
78
+ }
79
+ async disconnect() {
80
+ try {
81
+ if (this.client) {
82
+ if (typeof this.client.close === 'function')
83
+ this.client.close();
84
+ else if (typeof this.client.disconnect === 'function')
85
+ this.client.disconnect();
86
+ }
87
+ }
88
+ catch {
89
+ // Ignore teardown errors.
90
+ }
91
+ this.client = null;
92
+ this.connected = false;
93
+ }
94
+ isConnected() {
95
+ return this.connected && this.client !== null;
96
+ }
97
+ /** Returns the underlying `gearman` client for operations not wrapped here. */
98
+ getClient() {
99
+ return this.requireClient();
100
+ }
101
+ requireClient() {
102
+ if (!this.client) {
103
+ throw new errors_1.ConnectionError('Not connected to Gearman', { database: 'gearman' });
104
+ }
105
+ return this.client;
106
+ }
107
+ async exec(fn, action) {
108
+ const client = this.requireClient();
109
+ try {
110
+ return await fn(client);
111
+ }
112
+ catch (err) {
113
+ throw wrapDatabaseError(err, action);
114
+ }
115
+ }
116
+ // ---------------------------------------------------------------------
117
+ // Queue operations
118
+ // ---------------------------------------------------------------------
119
+ /**
120
+ * Submit a job for the named function (`queue`). The payload is
121
+ * JSON-serialized (strings pass through). Returns the job handle/id the
122
+ * server assigns (`job.handle` if the driver returns a job object).
123
+ */
124
+ async enqueue(queue, jobData, opts = {}) {
125
+ return this.exec(async (client) => {
126
+ const payload = typeof jobData === 'string' ? jobData : JSON.stringify(jobData);
127
+ const job = await client.submitJob(queue, payload, opts);
128
+ if (job == null)
129
+ return '';
130
+ return typeof job === 'string' ? job : job.handle ?? job.id ?? '';
131
+ }, 'enqueue');
132
+ }
133
+ /**
134
+ * Register a worker handler for the named function (`queue`). The driver
135
+ * invokes `handler(job)` for each dispatched task. Falls back to
136
+ * `addFunction()` when the driver has no `registerWorker()`.
137
+ */
138
+ async process(queue, handler) {
139
+ return this.exec((client) => {
140
+ if (typeof client.registerWorker === 'function') {
141
+ return client.registerWorker(queue, handler);
142
+ }
143
+ return client.addFunction(queue, handler);
144
+ }, 'process');
145
+ }
146
+ /** Query the status of a submitted job by its handle/id. */
147
+ async getJob(_queue, id) {
148
+ return this.exec((client) => client.getJobStatus(id), 'getJob');
149
+ }
150
+ /** Cancel/forget a submitted job by its handle/id. */
151
+ async remove(_queue, id) {
152
+ return this.exec((client) => client.removeJob(id), 'remove');
153
+ }
154
+ /** Return job-server status (registered functions, queued/running counts). */
155
+ async stats(_queue) {
156
+ return this.exec((client) => client.getStatus(), 'stats');
157
+ }
158
+ }
159
+ exports.GearmanStore = GearmanStore;
160
+ exports.default = GearmanStore;
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * Apache Geode store implementation.
4
+ *
5
+ * Apache Geode (the engine behind Pivotal/VMware GemFire) is a distributed
6
+ * in-memory data grid. Data lives in named *regions* (its distributed maps).
7
+ * There is no SQL-shaped `query(sql)` surface for key/value access, so this
8
+ * class implements the minimal `NoSqlStore` marker interface and exposes
9
+ * Geode's region operations (getMap/put/get/remove/keys/size) as a typed,
10
+ * promise-based API.
11
+ *
12
+ * ## Transport: the Geode Developer REST API over `fetch`
13
+ *
14
+ * Geode has no canonical Node.js driver; it ships a language-neutral
15
+ * "Developer REST API". This store talks to it with the global `fetch`
16
+ * (exactly like `PrometheusStore`), so `library` is `'fetch'`. For tests
17
+ * (and callers who want their own transport) an alternative client can be
18
+ * injected via `GeodeStoreOptions.client`; when omitted a tiny internal
19
+ * `fetch` client is built at connect time.
20
+ *
21
+ * Endpoints wrapped (all under `/geode/v1`):
22
+ * - `mapPut` -> `PUT /geode/v1/<region>/<key>`
23
+ * - `mapGet` -> `GET /geode/v1/<region>/<key>`
24
+ * - `mapRemove` -> `DELETE /geode/v1/<region>/<key>`
25
+ * - `mapKeys` -> `GET /geode/v1/<region>/keys`
26
+ * - `mapSize` -> derived from `mapKeys` (the Developer REST API exposes no
27
+ * direct size endpoint)
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.GeodeStore = exports.DEFAULT_GEODE_BASE_URL = void 0;
31
+ exports.createFetchClient = createFetchClient;
32
+ const errors_1 = require("../../errors");
33
+ /** Default Geode Developer REST API base URL. */
34
+ exports.DEFAULT_GEODE_BASE_URL = 'http://localhost:8080';
35
+ /** Build a `fetch`-backed REST client for the given base URL. */
36
+ function createFetchClient(baseURL, headers) {
37
+ const base = baseURL.endsWith('/') ? baseURL : `${baseURL}/`;
38
+ const buildUrl = (path) => new URL(path.startsWith('/') ? path.slice(1) : path, base).toString();
39
+ const parse = async (res) => {
40
+ const text = await res.text();
41
+ if (!text)
42
+ return null;
43
+ try {
44
+ return JSON.parse(text);
45
+ }
46
+ catch {
47
+ return text;
48
+ }
49
+ };
50
+ return {
51
+ async get(path) {
52
+ const res = await fetch(buildUrl(path), { method: 'GET', headers });
53
+ if (res.status === 404)
54
+ return null;
55
+ if (!res.ok)
56
+ throw new Error(`HTTP ${res.status} ${res.statusText}`);
57
+ return parse(res);
58
+ },
59
+ async put(path, body, contentType = 'application/json') {
60
+ const res = await fetch(buildUrl(path), {
61
+ method: 'PUT',
62
+ body,
63
+ headers: { ...(headers ?? {}), 'Content-Type': contentType },
64
+ });
65
+ if (!res.ok)
66
+ throw new Error(`HTTP ${res.status} ${res.statusText}`);
67
+ return parse(res);
68
+ },
69
+ async delete(path) {
70
+ const res = await fetch(buildUrl(path), { method: 'DELETE', headers });
71
+ if (res.status === 404)
72
+ return null;
73
+ if (!res.ok)
74
+ throw new Error(`HTTP ${res.status} ${res.statusText}`);
75
+ return parse(res);
76
+ },
77
+ };
78
+ }
79
+ const enc = encodeURIComponent;
80
+ /**
81
+ * `GeodeStore` wraps Geode's Developer REST API behind the `NoSqlStore`
82
+ * lifecycle and exposes named-region key/value operations.
83
+ */
84
+ class GeodeStore {
85
+ constructor(options = {}) {
86
+ this.name = 'geode';
87
+ this.library = 'fetch';
88
+ this.client = null;
89
+ this.connected = false;
90
+ /** Cached region handles, keyed by name so `getMap` is idempotent. */
91
+ this.regions = new Map();
92
+ this.baseURL = options.baseURL ?? exports.DEFAULT_GEODE_BASE_URL;
93
+ this.injectedClient = options.client;
94
+ this.headers = options.headers;
95
+ }
96
+ // ---------------------------------------------------------------------
97
+ // Connection lifecycle
98
+ // ---------------------------------------------------------------------
99
+ async connect() {
100
+ if (this.connected && this.client) {
101
+ return;
102
+ }
103
+ this.client = this.injectedClient ?? createFetchClient(this.baseURL, this.headers);
104
+ this.connected = true;
105
+ }
106
+ async disconnect() {
107
+ this.client = null;
108
+ this.regions.clear();
109
+ this.connected = false;
110
+ }
111
+ isConnected() {
112
+ return this.connected && this.client !== null;
113
+ }
114
+ /** Returns the underlying (internal or injected) HTTP client. */
115
+ getClient() {
116
+ return this.requireClient();
117
+ }
118
+ requireClient() {
119
+ if (!this.client) {
120
+ throw new errors_1.ConnectionError('Not connected to Geode', {
121
+ database: 'geode',
122
+ host: this.baseURL,
123
+ });
124
+ }
125
+ return this.client;
126
+ }
127
+ wrap(err, action) {
128
+ const parent = err instanceof Error ? err : new Error(String(err));
129
+ return errors_1.DatabaseError.from(parent, { message: `Geode ${action} failed: ${parent.message}` });
130
+ }
131
+ // ---------------------------------------------------------------------
132
+ // Distributed region operations
133
+ // ---------------------------------------------------------------------
134
+ /** Resolve (and cache) a named-region handle. */
135
+ async getMap(name) {
136
+ this.requireClient();
137
+ let region = this.regions.get(name);
138
+ if (!region) {
139
+ region = { name };
140
+ this.regions.set(name, region);
141
+ }
142
+ return region;
143
+ }
144
+ /** Store `value` under `key` in `map` (`PUT /geode/v1/<region>/<key>`). */
145
+ async mapPut(map, key, value) {
146
+ const client = this.requireClient();
147
+ try {
148
+ await client.put(`/geode/v1/${enc(map.name)}/${enc(key)}`, JSON.stringify(value));
149
+ }
150
+ catch (err) {
151
+ throw this.wrap(err, 'mapPut');
152
+ }
153
+ }
154
+ /** Read `key` from `map` (`GET /geode/v1/<region>/<key>`); `null` if absent. */
155
+ async mapGet(map, key) {
156
+ const client = this.requireClient();
157
+ try {
158
+ return await client.get(`/geode/v1/${enc(map.name)}/${enc(key)}`);
159
+ }
160
+ catch (err) {
161
+ throw this.wrap(err, 'mapGet');
162
+ }
163
+ }
164
+ /** Remove `key` from `map` (`DELETE /geode/v1/<region>/<key>`). */
165
+ async mapRemove(map, key) {
166
+ const client = this.requireClient();
167
+ try {
168
+ return await client.delete(`/geode/v1/${enc(map.name)}/${enc(key)}`);
169
+ }
170
+ catch (err) {
171
+ throw this.wrap(err, 'mapRemove');
172
+ }
173
+ }
174
+ /** List all keys in `map` (`GET /geode/v1/<region>/keys`). */
175
+ async mapKeys(map) {
176
+ const client = this.requireClient();
177
+ try {
178
+ const body = await client.get(`/geode/v1/${enc(map.name)}/keys`);
179
+ // Geode replies `{ "keys": [...] }`; tolerate a bare array too.
180
+ if (Array.isArray(body))
181
+ return body;
182
+ if (body && Array.isArray(body.keys))
183
+ return body.keys;
184
+ return [];
185
+ }
186
+ catch (err) {
187
+ throw this.wrap(err, 'mapKeys');
188
+ }
189
+ }
190
+ /** Number of entries in `map` (derived from `mapKeys`). */
191
+ async mapSize(map) {
192
+ return (await this.mapKeys(map)).length;
193
+ }
194
+ }
195
+ exports.GeodeStore = GeodeStore;
196
+ exports.default = GeodeStore;
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ /**
3
+ * Ontotext GraphDB store implementation.
4
+ *
5
+ * GraphDB is an RDF triplestore that speaks the SPARQL 1.1 Protocol over HTTP.
6
+ * A repository exposes a query endpoint (`/repositories/<repo>`) and an update
7
+ * endpoint (`/repositories/<repo>/statements`). There is no SQL-shaped surface
8
+ * (no rows, no DDL, no identifier escaping), so it implements the minimal
9
+ * `NoSqlStore` marker interface (`src/nosql/store.ts`) rather than the SQL
10
+ * `Dialect` interface.
11
+ *
12
+ * ## No canonical driver - HTTP over `fetch`
13
+ *
14
+ * GraphDB has no dedicated npm client; it is just a SPARQL/HTTP endpoint. This
15
+ * store talks to the server with the global `fetch`. For tests (and for
16
+ * callers who want their own transport) an alternative client can be injected
17
+ * via `GraphdbStoreOptions.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 `/repositories/<repo>`, returns bindings
23
+ * - `update(sparql)` -> POST to `/repositories/<repo>/statements`
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.GraphdbStore = exports.DEFAULT_GRAPHDB_REPOSITORY = exports.DEFAULT_GRAPHDB_ENDPOINT = void 0;
30
+ exports.createFetchClient = createFetchClient;
31
+ const errors_1 = require("../../errors");
32
+ /** Default GraphDB base URL. */
33
+ exports.DEFAULT_GRAPHDB_ENDPOINT = 'http://localhost:7200';
34
+ /** Default repository id. */
35
+ exports.DEFAULT_GRAPHDB_REPOSITORY = 'repo';
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
+ * `GraphdbStore` wraps a GraphDB repository's SPARQL query/update endpoints
70
+ * behind the `NoSqlStore` lifecycle.
71
+ */
72
+ class GraphdbStore {
73
+ constructor(options = {}) {
74
+ this.name = 'graphdb';
75
+ this.library = 'fetch';
76
+ this.client = null;
77
+ this.connected = false;
78
+ this.endpoint = options.endpoint ?? exports.DEFAULT_GRAPHDB_ENDPOINT;
79
+ this.repository = options.repository ?? exports.DEFAULT_GRAPHDB_REPOSITORY;
80
+ this.injectedClient = options.client;
81
+ this.headers = options.headers;
82
+ }
83
+ /** SPARQL query endpoint path for the configured repository. */
84
+ get queryPath() {
85
+ return `/repositories/${this.repository}`;
86
+ }
87
+ /** SPARQL update endpoint path for the configured repository. */
88
+ get updatePath() {
89
+ return `/repositories/${this.repository}/statements`;
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 GraphDB', {
114
+ database: 'graphdb',
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: `GraphDB 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: `GraphDB 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: `GraphDB 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.GraphdbStore = GraphdbStore;