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,12 @@
1
+ "use strict";
2
+ /**
3
+ * Stream utilities for ORM operations
4
+ * Provides transform streams for streaming data processing
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.StreamIterator = exports.BatchTransform = exports.FilterTransform = exports.MapTransform = void 0;
8
+ var transforms_1 = require("./transforms");
9
+ Object.defineProperty(exports, "MapTransform", { enumerable: true, get: function () { return transforms_1.MapTransform; } });
10
+ Object.defineProperty(exports, "FilterTransform", { enumerable: true, get: function () { return transforms_1.FilterTransform; } });
11
+ Object.defineProperty(exports, "BatchTransform", { enumerable: true, get: function () { return transforms_1.BatchTransform; } });
12
+ Object.defineProperty(exports, "StreamIterator", { enumerable: true, get: function () { return transforms_1.StreamIterator; } });
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ /**
3
+ * Transform streams for ORM operations
4
+ * Provides MapTransform and FilterTransform for streaming data processing
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.StreamIterator = exports.BatchTransform = exports.FilterTransform = exports.MapTransform = void 0;
8
+ const stream_1 = require("stream");
9
+ /**
10
+ * Transform stream that maps each record through a transform function
11
+ * Supports both synchronous and asynchronous transform functions
12
+ */
13
+ class MapTransform extends stream_1.Transform {
14
+ constructor(options) {
15
+ super({
16
+ objectMode: true,
17
+ highWaterMark: options.highWaterMark || 1000,
18
+ });
19
+ this.mapFn = options.mapFn;
20
+ }
21
+ /**
22
+ * Transform a chunk (record)
23
+ */
24
+ async _transform(record, encoding, callback) {
25
+ try {
26
+ const result = await this.mapFn(record);
27
+ callback(null, result);
28
+ }
29
+ catch (error) {
30
+ callback(error);
31
+ }
32
+ }
33
+ }
34
+ exports.MapTransform = MapTransform;
35
+ /**
36
+ * Transform stream that filters records based on a predicate function
37
+ * Supports both synchronous and asynchronous filter functions
38
+ */
39
+ class FilterTransform extends stream_1.Transform {
40
+ constructor(options) {
41
+ super({
42
+ objectMode: true,
43
+ highWaterMark: options.highWaterMark || 1000,
44
+ });
45
+ this.filterFn = options.filterFn;
46
+ }
47
+ /**
48
+ * Transform and filter a chunk (record)
49
+ */
50
+ async _transform(record, encoding, callback) {
51
+ try {
52
+ const shouldInclude = await this.filterFn(record);
53
+ if (shouldInclude) {
54
+ callback(null, record);
55
+ }
56
+ else {
57
+ // Skip this record but don't end the stream
58
+ callback(null);
59
+ }
60
+ }
61
+ catch (error) {
62
+ callback(error);
63
+ }
64
+ }
65
+ }
66
+ exports.FilterTransform = FilterTransform;
67
+ /**
68
+ * Transform stream that batches records into arrays
69
+ */
70
+ class BatchTransform extends stream_1.Transform {
71
+ constructor(options) {
72
+ super({
73
+ objectMode: true,
74
+ highWaterMark: options.highWaterMark || 1000,
75
+ });
76
+ this.buffer = [];
77
+ this.batchSize = options.batchSize;
78
+ }
79
+ /**
80
+ * Transform - batch records
81
+ */
82
+ _transform(record, encoding, callback) {
83
+ this.buffer.push(record);
84
+ if (this.buffer.length >= this.batchSize) {
85
+ const batch = this.buffer.slice();
86
+ this.buffer = [];
87
+ callback(null, batch);
88
+ }
89
+ else {
90
+ callback(null);
91
+ }
92
+ }
93
+ /**
94
+ * Flush remaining records in buffer
95
+ */
96
+ _flush(callback) {
97
+ if (this.buffer.length > 0) {
98
+ callback(null, this.buffer.slice());
99
+ }
100
+ else {
101
+ callback(null);
102
+ }
103
+ }
104
+ }
105
+ exports.BatchTransform = BatchTransform;
106
+ /**
107
+ * Transform stream that converts a readable stream into an async iterator
108
+ * Allows using stream.pipe(new StreamIterator()) and then for await...of
109
+ */
110
+ class StreamIterator extends stream_1.Transform {
111
+ constructor(options) {
112
+ super({
113
+ objectMode: true,
114
+ highWaterMark: options?.highWaterMark || 1000,
115
+ });
116
+ this.buffer = [];
117
+ this.waiting = [];
118
+ this.ended = false;
119
+ this.error = null;
120
+ }
121
+ /**
122
+ * Transform a chunk
123
+ */
124
+ _transform(chunk, encoding, callback) {
125
+ const record = chunk;
126
+ this.buffer.push(record);
127
+ this._processWaiting();
128
+ callback(null);
129
+ }
130
+ /**
131
+ * Handle stream end
132
+ */
133
+ _flush(callback) {
134
+ this.ended = true;
135
+ this._processWaiting();
136
+ callback(null);
137
+ }
138
+ /**
139
+ * Process waiting promises
140
+ */
141
+ _processWaiting() {
142
+ while (this.waiting.length > 0 && this.buffer.length > 0) {
143
+ const record = this.buffer.shift();
144
+ const waiter = this.waiting.shift();
145
+ waiter({ value: record, done: false });
146
+ }
147
+ // If stream ended and no more data
148
+ if (this.ended && this.buffer.length === 0) {
149
+ while (this.waiting.length > 0) {
150
+ const waiter = this.waiting.shift();
151
+ waiter({ value: undefined, done: true });
152
+ }
153
+ }
154
+ }
155
+ /**
156
+ * Create async iterator from this transform stream
157
+ */
158
+ [Symbol.asyncIterator]() {
159
+ const self = this;
160
+ return {
161
+ next() {
162
+ return new Promise((resolve) => {
163
+ if (self.buffer.length > 0) {
164
+ const record = self.buffer.shift();
165
+ resolve({ value: record, done: false });
166
+ }
167
+ else if (self.ended) {
168
+ resolve({ value: undefined, done: true });
169
+ }
170
+ else {
171
+ self.waiting.push(resolve);
172
+ }
173
+ });
174
+ },
175
+ };
176
+ }
177
+ }
178
+ exports.StreamIterator = StreamIterator;
@@ -0,0 +1,456 @@
1
+ "use strict";
2
+ /**
3
+ * Transaction Support
4
+ * Provides transaction management with commit and rollback functionality
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TransactionWrapper = exports.TransactionManager = exports.Transaction = exports.defaultTransactionOptions = exports.IsolationLevels = exports.TransactionState = void 0;
8
+ exports.createTransaction = createTransaction;
9
+ exports.createTransactionManager = createTransactionManager;
10
+ /**
11
+ * Transaction states
12
+ */
13
+ var TransactionState;
14
+ (function (TransactionState) {
15
+ /** Transaction has not started yet */
16
+ TransactionState["STARTED"] = "started";
17
+ /** Transaction is currently active */
18
+ TransactionState["ACTIVE"] = "active";
19
+ /** Transaction has been committed */
20
+ TransactionState["COMMITTED"] = "committed";
21
+ /** Transaction has been rolled back */
22
+ TransactionState["ROLLED_BACK"] = "rolled_back";
23
+ })(TransactionState || (exports.TransactionState = TransactionState = {}));
24
+ /**
25
+ * Transaction isolation levels with their SQL representations
26
+ */
27
+ exports.IsolationLevels = {
28
+ 'READ UNCOMMITTED': 'READ UNCOMMITTED',
29
+ 'READ COMMITTED': 'READ COMMITTED',
30
+ 'REPEATABLE READ': 'REPEATABLE READ',
31
+ SERIALIZABLE: 'SERIALIZABLE',
32
+ };
33
+ /**
34
+ * Default transaction options
35
+ */
36
+ exports.defaultTransactionOptions = {
37
+ autocommit: true,
38
+ isolationLevel: 'REPEATABLE READ',
39
+ type: 'DEFERRED',
40
+ deferrable: '',
41
+ lock: false,
42
+ };
43
+ /**
44
+ * Savepoint naming strategy
45
+ */
46
+ let savepointCounter = 0;
47
+ /**
48
+ * Generate a unique savepoint name
49
+ */
50
+ function generateSavepointName() {
51
+ return `sp_${Date.now()}_${++savepointCounter}`;
52
+ }
53
+ /**
54
+ * Transaction class for managing database transactions
55
+ * Supports savepoints, commit, rollback, and isolation levels
56
+ */
57
+ class Transaction {
58
+ /**
59
+ * Create a new transaction
60
+ * @param options - Transaction configuration options
61
+ */
62
+ constructor(options = {}) {
63
+ /** Current state of the transaction */
64
+ this.state = TransactionState.STARTED;
65
+ /** Parent transaction (for nested transactions/savepoints) */
66
+ this.parent = null;
67
+ /** Child transactions/savepoints */
68
+ this.children = [];
69
+ this.id = `txn_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
70
+ this.startedAt = new Date();
71
+ this.options = {
72
+ ...exports.defaultTransactionOptions,
73
+ ...options,
74
+ };
75
+ this.savepointName = generateSavepointName();
76
+ this.isSavepoint = false;
77
+ this.depth = 0;
78
+ }
79
+ /**
80
+ * Private constructor for creating savepoints
81
+ */
82
+ static createSavepoint(parent, options) {
83
+ const savepoint = Object.create(Transaction.prototype);
84
+ savepoint.id = `txn_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
85
+ savepoint.startedAt = new Date();
86
+ savepoint.options = {
87
+ ...exports.defaultTransactionOptions,
88
+ ...options,
89
+ };
90
+ savepoint.savepointName = generateSavepointName();
91
+ savepoint.parent = parent;
92
+ savepoint.isSavepoint = true;
93
+ savepoint.depth = parent.depth + 1;
94
+ savepoint.state = TransactionState.STARTED;
95
+ savepoint.children = [];
96
+ savepoint.id = `${parent.id}.${savepoint.depth}`;
97
+ savepoint.finishedAt = undefined;
98
+ parent.children.push(savepoint);
99
+ return savepoint;
100
+ }
101
+ /**
102
+ * Check if the transaction is active
103
+ */
104
+ get isActive() {
105
+ return this.state === TransactionState.STARTED || this.state === TransactionState.ACTIVE;
106
+ }
107
+ /**
108
+ * Check if the transaction is finished (committed or rolled back)
109
+ */
110
+ get isFinished() {
111
+ return this.state === TransactionState.COMMITTED || this.state === TransactionState.ROLLED_BACK;
112
+ }
113
+ /**
114
+ * Check if the transaction was committed
115
+ */
116
+ get isCommitted() {
117
+ return this.state === TransactionState.COMMITTED;
118
+ }
119
+ /**
120
+ * Check if the transaction was rolled back
121
+ */
122
+ get isRolledBack() {
123
+ return this.state === TransactionState.ROLLED_BACK;
124
+ }
125
+ /**
126
+ * Get the isolation level SQL
127
+ */
128
+ getIsolationLevelSql() {
129
+ const level = this.options.isolationLevel
130
+ ? exports.IsolationLevels[this.options.isolationLevel]
131
+ : undefined;
132
+ return level ? `ISOLATION LEVEL ${level}` : '';
133
+ }
134
+ /**
135
+ * Get the transaction type SQL
136
+ */
137
+ getTransactionTypeSql() {
138
+ if (this.options.type) {
139
+ return this.options.type;
140
+ }
141
+ return '';
142
+ }
143
+ /**
144
+ * Create a savepoint within the transaction
145
+ * @param options - Savepoint options
146
+ */
147
+ createSavepoint(options) {
148
+ if (!this.isActive) {
149
+ throw new Error(`Cannot create savepoint: Transaction is ${this.state}`);
150
+ }
151
+ return Transaction.createSavepoint(this, options);
152
+ }
153
+ /**
154
+ * Create a named savepoint and return its name
155
+ * @param name - Optional custom savepoint name
156
+ * @returns The savepoint name
157
+ */
158
+ savepoint(name) {
159
+ if (!this.isActive) {
160
+ throw new Error(`Cannot create savepoint: Transaction is ${this.state}`);
161
+ }
162
+ const savepointName = name || generateSavepointName();
163
+ return savepointName;
164
+ }
165
+ /**
166
+ * Release a savepoint
167
+ * @param name - The savepoint name to release
168
+ */
169
+ async releaseSavepoint(name) {
170
+ if (!this.isActive) {
171
+ throw new Error(`Cannot release savepoint: Transaction is ${this.state}`);
172
+ }
173
+ // Savepoint release is handled at the database level
174
+ // This is a placeholder for database-specific implementation
175
+ }
176
+ /**
177
+ * Rollback to a savepoint
178
+ * @param name - The savepoint name to rollback to
179
+ */
180
+ async rollbackToSavepoint(name) {
181
+ if (!this.isActive) {
182
+ throw new Error(`Cannot rollback to savepoint: Transaction is ${this.state}`);
183
+ }
184
+ // Savepoint rollback is handled at the database level
185
+ // This is a placeholder for database-specific implementation
186
+ }
187
+ /**
188
+ * Mark the transaction as started
189
+ */
190
+ start() {
191
+ this.state = TransactionState.ACTIVE;
192
+ }
193
+ /**
194
+ * Commit the transaction
195
+ * @throws Error if transaction is not active
196
+ */
197
+ async commit() {
198
+ if (!this.isActive) {
199
+ throw new Error(`Cannot commit: Transaction is ${this.state}`);
200
+ }
201
+ this.state = TransactionState.COMMITTED;
202
+ this.finishedAt = new Date();
203
+ // Commit all child savepoints first
204
+ for (const child of this.children) {
205
+ if (child.isActive) {
206
+ await child.commit();
207
+ }
208
+ }
209
+ }
210
+ /**
211
+ * Rollback the transaction
212
+ * @param savepoint - Optional savepoint to rollback to
213
+ * @throws Error if transaction is not active
214
+ */
215
+ async rollback(savepoint) {
216
+ if (!this.isActive) {
217
+ throw new Error(`Cannot rollback: Transaction is ${this.state}`);
218
+ }
219
+ // If a specific savepoint is provided, rollback to it
220
+ if (savepoint) {
221
+ if (!this.children.includes(savepoint)) {
222
+ throw new Error('Savepoint does not belong to this transaction');
223
+ }
224
+ // Rollback all children after the savepoint
225
+ const savepointIndex = this.children.indexOf(savepoint);
226
+ for (let i = this.children.length - 1; i >= savepointIndex; i--) {
227
+ const child = this.children[i];
228
+ if (child.isActive) {
229
+ await child.rollback();
230
+ }
231
+ }
232
+ return;
233
+ }
234
+ // Rollback all child savepoints
235
+ for (const child of this.children) {
236
+ if (child.isActive) {
237
+ await child.rollback();
238
+ }
239
+ }
240
+ this.state = TransactionState.ROLLED_BACK;
241
+ this.finishedAt = new Date();
242
+ }
243
+ /**
244
+ * Get the duration of the transaction
245
+ */
246
+ getDuration() {
247
+ const endTime = this.finishedAt || new Date();
248
+ return endTime.getTime() - this.startedAt.getTime();
249
+ }
250
+ /**
251
+ * Convert to a plain object for serialization
252
+ */
253
+ toJSON() {
254
+ return {
255
+ id: this.id,
256
+ state: this.state,
257
+ options: this.options,
258
+ depth: this.depth,
259
+ isSavepoint: this.isSavepoint,
260
+ startedAt: this.startedAt,
261
+ finishedAt: this.finishedAt,
262
+ duration: this.getDuration(),
263
+ };
264
+ }
265
+ }
266
+ exports.Transaction = Transaction;
267
+ /**
268
+ * Transaction manager for handling multiple transactions
269
+ */
270
+ class TransactionManager {
271
+ constructor() {
272
+ this.currentTransaction = null;
273
+ this.transactionCount = 0;
274
+ }
275
+ /**
276
+ * Get the current active transaction
277
+ */
278
+ getActiveTransaction() {
279
+ return this.currentTransaction;
280
+ }
281
+ /**
282
+ * Check if there's an active transaction
283
+ */
284
+ hasActiveTransaction() {
285
+ return this.currentTransaction !== null && this.currentTransaction.isActive;
286
+ }
287
+ /**
288
+ * Start a new transaction
289
+ * @param options - Transaction options
290
+ */
291
+ startTransaction(options) {
292
+ const transaction = new Transaction(options);
293
+ this.currentTransaction = transaction;
294
+ this.transactionCount++;
295
+ transaction.start();
296
+ return transaction;
297
+ }
298
+ /**
299
+ * Commit the current transaction
300
+ */
301
+ async commitTransaction() {
302
+ if (!this.currentTransaction) {
303
+ throw new Error('No active transaction to commit');
304
+ }
305
+ await this.currentTransaction.commit();
306
+ if (!this.currentTransaction.isSavepoint) {
307
+ this.currentTransaction = null;
308
+ }
309
+ else {
310
+ // For savepoints, go back to parent
311
+ this.currentTransaction = this.currentTransaction.parent;
312
+ }
313
+ }
314
+ /**
315
+ * Rollback the current transaction
316
+ * @param savepoint - Optional savepoint to rollback to
317
+ */
318
+ async rollbackTransaction(savepoint) {
319
+ if (!this.currentTransaction) {
320
+ throw new Error('No active transaction to rollback');
321
+ }
322
+ await this.currentTransaction.rollback(savepoint);
323
+ if (!this.currentTransaction.isSavepoint) {
324
+ this.currentTransaction = null;
325
+ }
326
+ else {
327
+ // For savepoints, go back to parent
328
+ this.currentTransaction = this.currentTransaction.parent;
329
+ }
330
+ }
331
+ /**
332
+ * Get transaction count
333
+ */
334
+ getTransactionCount() {
335
+ return this.transactionCount;
336
+ }
337
+ /**
338
+ * Run a function within a transaction
339
+ * Automatically commits on success, rolls back on error
340
+ * @param fn - Function to run within the transaction
341
+ * @param options - Transaction options
342
+ */
343
+ async runInTransaction(fn, options) {
344
+ const transaction = this.startTransaction(options);
345
+ try {
346
+ const result = await fn(transaction);
347
+ await this.commitTransaction();
348
+ return result;
349
+ }
350
+ catch (error) {
351
+ await this.rollbackTransaction();
352
+ throw error;
353
+ }
354
+ }
355
+ /**
356
+ * Run a function within a savepoint
357
+ * @param fn - Function to run within the savepoint
358
+ * @param options - Savepoint options
359
+ */
360
+ async runInSavepoint(fn, options) {
361
+ if (!this.currentTransaction || !this.currentTransaction.isActive) {
362
+ throw new Error('No active transaction to create savepoint in');
363
+ }
364
+ const savepoint = this.currentTransaction.createSavepoint(options);
365
+ try {
366
+ const result = await fn(savepoint);
367
+ await savepoint.commit();
368
+ return result;
369
+ }
370
+ catch (error) {
371
+ await savepoint.rollback();
372
+ throw error;
373
+ }
374
+ }
375
+ }
376
+ exports.TransactionManager = TransactionManager;
377
+ /**
378
+ * Transaction wrapper for automatic cleanup
379
+ * Ensures transaction is properly committed or rolled back
380
+ */
381
+ class TransactionWrapper {
382
+ /**
383
+ * Create a transaction wrapper
384
+ * @param transaction - The transaction to wrap
385
+ */
386
+ constructor(transaction) {
387
+ this.transaction = null;
388
+ this.committed = false;
389
+ this.transaction = transaction;
390
+ }
391
+ /**
392
+ * Get the wrapped transaction
393
+ */
394
+ getTransaction() {
395
+ return this.transaction;
396
+ }
397
+ /**
398
+ * Commit the transaction
399
+ */
400
+ async commit() {
401
+ if (this.transaction && !this.committed) {
402
+ await this.transaction.commit();
403
+ this.committed = true;
404
+ }
405
+ }
406
+ /**
407
+ * Rollback the transaction
408
+ */
409
+ async rollback() {
410
+ if (this.transaction && this.transaction.isActive) {
411
+ await this.transaction.rollback();
412
+ }
413
+ }
414
+ /**
415
+ * Ensure the transaction is properly cleaned up
416
+ * Call this in a finally block or use the static helper
417
+ */
418
+ async ensureCleanup() {
419
+ if (!this.committed && this.transaction?.isActive) {
420
+ await this.rollback();
421
+ }
422
+ }
423
+ /**
424
+ * Static helper to run a function with automatic cleanup
425
+ * @param transaction - The transaction to wrap
426
+ * @param fn - Function to run
427
+ */
428
+ static async withCleanup(transaction, fn) {
429
+ const wrapper = new TransactionWrapper(transaction);
430
+ try {
431
+ return await fn();
432
+ }
433
+ catch (error) {
434
+ await wrapper.rollback();
435
+ throw error;
436
+ }
437
+ finally {
438
+ await wrapper.ensureCleanup();
439
+ }
440
+ }
441
+ }
442
+ exports.TransactionWrapper = TransactionWrapper;
443
+ /**
444
+ * Create a new transaction
445
+ * @param options - Transaction options
446
+ */
447
+ function createTransaction(options) {
448
+ return new Transaction(options);
449
+ }
450
+ /**
451
+ * Create a new transaction manager
452
+ */
453
+ function createTransactionManager() {
454
+ return new TransactionManager();
455
+ }
456
+ exports.default = Transaction;