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.
- package/CHANGELOG.md +1111 -0
- package/LICENSE +21 -0
- package/README.md +573 -0
- package/dist/audit/history-query.js +180 -0
- package/dist/audit/index.js +23 -0
- package/dist/audit/logger.js +236 -0
- package/dist/cache/cache-manager.js +84 -0
- package/dist/cache/index.js +16 -0
- package/dist/cache/redis-cluster-cache.js +557 -0
- package/dist/cli.js +2200 -0
- package/dist/compliance/audit-trail.js +68 -0
- package/dist/compliance/backup-verification.js +685 -0
- package/dist/compliance/breach-detector.js +505 -0
- package/dist/compliance/consent-record.js +227 -0
- package/dist/compliance/consent-versioning.js +331 -0
- package/dist/compliance/cross-border-log.js +530 -0
- package/dist/compliance/data-classifier.js +258 -0
- package/dist/compliance/data-lineage.js +565 -0
- package/dist/compliance/data-masker.js +303 -0
- package/dist/compliance/data-portability.js +265 -0
- package/dist/compliance/data-retention.js +195 -0
- package/dist/compliance/dsar-workflow.js +342 -0
- package/dist/compliance/field-encryption.js +223 -0
- package/dist/compliance/immutable-record.js +148 -0
- package/dist/compliance/index.js +260 -0
- package/dist/compliance/privacy-impact-assessment.js +364 -0
- package/dist/compliance/pseudonymization.js +269 -0
- package/dist/compliance/query-firewall.js +1182 -0
- package/dist/compliance/rate-limiter.js +580 -0
- package/dist/compliance/right-to-erasure.js +117 -0
- package/dist/compliance/row-level-security.js +246 -0
- package/dist/compliance/security-decorator.js +574 -0
- package/dist/compliance/security-monitor.js +525 -0
- package/dist/compliance/sensitive-data-discovery.js +476 -0
- package/dist/compliance/session-isolation.js +472 -0
- package/dist/compliance/tls-enforcer.js +108 -0
- package/dist/compliance/worm-storage.js +712 -0
- package/dist/connection-manager.js +198 -0
- package/dist/connection-pool.js +519 -0
- package/dist/decorators/audit.js +136 -0
- package/dist/decorators/belongs-to-many.js +115 -0
- package/dist/decorators/belongs-to.js +115 -0
- package/dist/decorators/check.js +435 -0
- package/dist/decorators/collate.js +329 -0
- package/dist/decorators/comment.js +205 -0
- package/dist/decorators/database-settings.js +236 -0
- package/dist/decorators/default.js +244 -0
- package/dist/decorators/encryption.js +235 -0
- package/dist/decorators/engine.js +97 -0
- package/dist/decorators/fk-constraints.js +594 -0
- package/dist/decorators/foreign-table.js +136 -0
- package/dist/decorators/generated.js +274 -0
- package/dist/decorators/has-many.js +127 -0
- package/dist/decorators/has-one.js +116 -0
- package/dist/decorators/hstore.js +129 -0
- package/dist/decorators/index.js +355 -0
- package/dist/decorators/json-column.js +83 -0
- package/dist/decorators/jsonb.js +101 -0
- package/dist/decorators/orm-decorators.js +425 -0
- package/dist/decorators/permissions.js +294 -0
- package/dist/decorators/procedure.js +210 -0
- package/dist/decorators/query-options.js +556 -0
- package/dist/decorators/range.js +167 -0
- package/dist/decorators/set-column.js +83 -0
- package/dist/decorators/spatial.js +114 -0
- package/dist/decorators/storage.js +580 -0
- package/dist/decorators/timezone.js +512 -0
- package/dist/decorators/trigger.js +90 -0
- package/dist/decorators/uuid.js +135 -0
- package/dist/decorators/view.js +258 -0
- package/dist/diagrams/chen-diagram.js +354 -0
- package/dist/diagrams/class-diagram.js +384 -0
- package/dist/diagrams/dependency-diagram.js +432 -0
- package/dist/diagrams/er-diagram.js +605 -0
- package/dist/diagrams/flow-diagram.js +394 -0
- package/dist/diagrams/gantt-diagram.js +411 -0
- package/dist/diagrams/index-diagram.js +353 -0
- package/dist/diagrams/index.js +184 -0
- package/dist/diagrams/migration-diagram.js +316 -0
- package/dist/diagrams/model-diagram.js +616 -0
- package/dist/diagrams/package-diagram.js +376 -0
- package/dist/diagrams/palette.js +85 -0
- package/dist/diagrams/relational-diagram.js +455 -0
- package/dist/diagrams/schemadoc-diagram.js +309 -0
- package/dist/diagrams/sequence-diagram.js +307 -0
- package/dist/diagrams/state-diagram.js +344 -0
- package/dist/diagrams/svg-dom.js +111 -0
- package/dist/diagrams/tree-diagram.js +250 -0
- package/dist/dialects/clickhouse/index.js +1742 -0
- package/dist/dialects/cockroachdb/index.js +4677 -0
- package/dist/dialects/cratedb/index.js +441 -0
- package/dist/dialects/databricks/index.js +517 -0
- package/dist/dialects/db2/index.js +2225 -0
- package/dist/dialects/dialect.js +720 -0
- package/dist/dialects/duckdb/index.js +2014 -0
- package/dist/dialects/exasol/index.js +357 -0
- package/dist/dialects/firebird/index.js +495 -0
- package/dist/dialects/greenplum/index.js +457 -0
- package/dist/dialects/hana/index.js +1741 -0
- package/dist/dialects/mariadb/index.js +3590 -0
- package/dist/dialects/mssql/index.js +2296 -0
- package/dist/dialects/mysql/index.js +4058 -0
- package/dist/dialects/oracle/index.js +2999 -0
- package/dist/dialects/postgres/index.js +5319 -0
- package/dist/dialects/query-stream-helper.js +152 -0
- package/dist/dialects/questdb/index.js +433 -0
- package/dist/dialects/redshift/index.js +2277 -0
- package/dist/dialects/singlestore/index.js +354 -0
- package/dist/dialects/snowflake/index.js +2082 -0
- package/dist/dialects/spanner/index.js +1768 -0
- package/dist/dialects/sqlite/index.js +3382 -0
- package/dist/dialects/tidb/index.js +377 -0
- package/dist/dialects/timescaledb/index.js +164 -0
- package/dist/dialects/trino/index.js +420 -0
- package/dist/dialects/turso/index.js +227 -0
- package/dist/dialects/vertica/index.js +317 -0
- package/dist/dialects/yugabytedb/index.js +424 -0
- package/dist/errors/index.js +472 -0
- package/dist/errors/utils.js +340 -0
- package/dist/errors.js +21 -0
- package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
- package/dist/extensions/catalog/mssql-features.js +147 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
- package/dist/extensions/catalog/oracle-db2-features.js +196 -0
- package/dist/extensions/catalog/postgres-extensions.js +516 -0
- package/dist/extensions/index.js +71 -0
- package/dist/extensions/types.js +13 -0
- package/dist/foreign-data.js +173 -0
- package/dist/hooks/hooks-manager.js +350 -0
- package/dist/hooks/index.js +37 -0
- package/dist/index.js +463 -0
- package/dist/logging.js +335 -0
- package/dist/migrations/index.js +40 -0
- package/dist/migrations/migration.js +196 -0
- package/dist/migrations/migrator.js +411 -0
- package/dist/migrations/prormmigration.js +275 -0
- package/dist/migrations/query-interface.js +435 -0
- package/dist/migrations/seeder.js +353 -0
- package/dist/models/associations.js +852 -0
- package/dist/models/constraints.js +288 -0
- package/dist/models/data-types.js +2518 -0
- package/dist/models/decorators.js +445 -0
- package/dist/models/index.js +33 -0
- package/dist/models/indexes.js +531 -0
- package/dist/models/methods.js +382 -0
- package/dist/models/model-manager.js +103 -0
- package/dist/models/model.js +5349 -0
- package/dist/models/operators.js +67 -0
- package/dist/models/scopes.js +189 -0
- package/dist/models/typescript-types.js +26 -0
- package/dist/nosql/aerospike/index.js +205 -0
- package/dist/nosql/allegrograph/index.js +169 -0
- package/dist/nosql/arangodb/index.js +364 -0
- package/dist/nosql/azure-blob/index.js +206 -0
- package/dist/nosql/beanstalkd/index.js +231 -0
- package/dist/nosql/beequeue/index.js +210 -0
- package/dist/nosql/bigchaindb/index.js +195 -0
- package/dist/nosql/bigtable/index.js +224 -0
- package/dist/nosql/blazegraph/index.js +173 -0
- package/dist/nosql/bullmq/index.js +191 -0
- package/dist/nosql/cassandra/index.js +174 -0
- package/dist/nosql/chroma/index.js +190 -0
- package/dist/nosql/cloudflare-kv/index.js +220 -0
- package/dist/nosql/coherence/index.js +200 -0
- package/dist/nosql/cosmosdb/index.js +157 -0
- package/dist/nosql/couchbase/index.js +213 -0
- package/dist/nosql/dax/index.js +212 -0
- package/dist/nosql/deno-kv/index.js +206 -0
- package/dist/nosql/dgraph/index.js +171 -0
- package/dist/nosql/doris/index.js +169 -0
- package/dist/nosql/druid/index.js +162 -0
- package/dist/nosql/dynamodb/index.js +937 -0
- package/dist/nosql/elasticsearch/index.js +377 -0
- package/dist/nosql/etcd/index.js +502 -0
- package/dist/nosql/eventhubs/index.js +213 -0
- package/dist/nosql/eventstore/index.js +254 -0
- package/dist/nosql/faunadb/index.js +188 -0
- package/dist/nosql/firestore/index.js +177 -0
- package/dist/nosql/fluree/index.js +148 -0
- package/dist/nosql/fuseki/index.js +170 -0
- package/dist/nosql/gcs/index.js +172 -0
- package/dist/nosql/gearman/index.js +160 -0
- package/dist/nosql/geode/index.js +196 -0
- package/dist/nosql/graphdb/index.js +169 -0
- package/dist/nosql/graylog/index.js +188 -0
- package/dist/nosql/gridgain/index.js +171 -0
- package/dist/nosql/hazelcast/index.js +162 -0
- package/dist/nosql/hbase/index.js +230 -0
- package/dist/nosql/ignite/index.js +173 -0
- package/dist/nosql/immudb/index.js +184 -0
- package/dist/nosql/index.js +232 -0
- package/dist/nosql/infinispan/index.js +200 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.js +234 -0
- package/dist/nosql/keyspaces/index.js +189 -0
- package/dist/nosql/kinesis/index.js +253 -0
- package/dist/nosql/leveldb/index.js +153 -0
- package/dist/nosql/lmdb/index.js +160 -0
- package/dist/nosql/loki/index.js +201 -0
- package/dist/nosql/marklogic/index.js +204 -0
- package/dist/nosql/materialize/index.js +145 -0
- package/dist/nosql/meilisearch/index.js +154 -0
- package/dist/nosql/memcached/index.js +223 -0
- package/dist/nosql/milvus/index.js +410 -0
- package/dist/nosql/minio/index.js +265 -0
- package/dist/nosql/momento/index.js +179 -0
- package/dist/nosql/mongodb/index.js +461 -0
- package/dist/nosql/nats/index.js +247 -0
- package/dist/nosql/nedb/index.js +164 -0
- package/dist/nosql/neo4j/index.js +450 -0
- package/dist/nosql/neptune/index.js +470 -0
- package/dist/nosql/nsq/index.js +200 -0
- package/dist/nosql/opensearch/index.js +186 -0
- package/dist/nosql/orientdb/index.js +175 -0
- package/dist/nosql/papertrail/index.js +200 -0
- package/dist/nosql/pinecone/index.js +0 -0
- package/dist/nosql/pinot/index.js +133 -0
- package/dist/nosql/pouchdb/index.js +172 -0
- package/dist/nosql/prometheus/index.js +174 -0
- package/dist/nosql/provendb/index.js +147 -0
- package/dist/nosql/pubsub/index.js +187 -0
- package/dist/nosql/pulsar/index.js +232 -0
- package/dist/nosql/qdrant/index.js +295 -0
- package/dist/nosql/qldb/index.js +192 -0
- package/dist/nosql/r2/index.js +281 -0
- package/dist/nosql/rabbitmq/index.js +237 -0
- package/dist/nosql/ravendb/index.js +175 -0
- package/dist/nosql/redis/index.js +607 -0
- package/dist/nosql/redpanda/index.js +237 -0
- package/dist/nosql/resque/index.js +203 -0
- package/dist/nosql/rethinkdb/index.js +232 -0
- package/dist/nosql/rocksdb/index.js +152 -0
- package/dist/nosql/rockset/index.js +126 -0
- package/dist/nosql/s3/index.js +298 -0
- package/dist/nosql/scylladb/index.js +178 -0
- package/dist/nosql/signoz/index.js +227 -0
- package/dist/nosql/sns/index.js +201 -0
- package/dist/nosql/solr/index.js +231 -0
- package/dist/nosql/splunk/index.js +227 -0
- package/dist/nosql/sqs/index.js +246 -0
- package/dist/nosql/stardog/index.js +169 -0
- package/dist/nosql/starrocks/index.js +170 -0
- package/dist/nosql/store.js +2 -0
- package/dist/nosql/sumologic/index.js +213 -0
- package/dist/nosql/surrealdb/index.js +179 -0
- package/dist/nosql/terminusdb/index.js +151 -0
- package/dist/nosql/tigergraph/index.js +469 -0
- package/dist/nosql/typesense/index.js +148 -0
- package/dist/nosql/unqlite/index.js +157 -0
- package/dist/nosql/upstash/index.js +167 -0
- package/dist/nosql/vercel-kv/index.js +166 -0
- package/dist/nosql/victoriametrics/index.js +213 -0
- package/dist/nosql/virtuoso/index.js +169 -0
- package/dist/nosql/weaviate/index.js +276 -0
- package/dist/operators/index.js +108 -0
- package/dist/operators.js +2690 -0
- package/dist/prisma-migrate/index.js +38 -0
- package/dist/prisma-migrate/migration-generator.js +125 -0
- package/dist/prisma-migrate/model-generator.js +172 -0
- package/dist/prisma-migrate/relations.js +100 -0
- package/dist/prisma-migrate/schema-parser.js +167 -0
- package/dist/prisma-migrate/type-mapper.js +40 -0
- package/dist/prorm.js +6832 -0
- package/dist/query-builders/cte-builder.js +80 -0
- package/dist/query-builders/functions/aggregate.js +390 -0
- package/dist/query-builders/functions/conditional.js +503 -0
- package/dist/query-builders/functions/datetime.js +695 -0
- package/dist/query-builders/functions/fulltext.js +439 -0
- package/dist/query-builders/functions/index.js +93 -0
- package/dist/query-builders/functions/json.js +427 -0
- package/dist/query-builders/functions/math.js +399 -0
- package/dist/query-builders/functions/string.js +518 -0
- package/dist/query-builders/functions/window.js +328 -0
- package/dist/query-builders/include-builder.js +323 -0
- package/dist/query-builders/index-expression-builder.js +242 -0
- package/dist/query-builders/index.js +161 -0
- package/dist/query-builders/insert-builder.js +164 -0
- package/dist/query-builders/model-helpers.js +38 -0
- package/dist/query-builders/order-limit-builder.js +239 -0
- package/dist/query-builders/sql-compiler.js +2040 -0
- package/dist/query-builders/subquery-builder.js +152 -0
- package/dist/query-builders/update-builder.js +182 -0
- package/dist/query-builders/view-builder.js +218 -0
- package/dist/query-builders/where-builder.js +1532 -0
- package/dist/query-interface.js +622 -0
- package/dist/query-optimizers/batch-optimizer.js +426 -0
- package/dist/query-optimizers/explain-plans.js +415 -0
- package/dist/query-optimizers/index.js +51 -0
- package/dist/query-optimizers/prepared-statement-cache.js +423 -0
- package/dist/query-optimizers/query-hints.js +438 -0
- package/dist/query-optimizers/query-optimizer.js +278 -0
- package/dist/query-optimizers/slow-query-logger.js +271 -0
- package/dist/replica-manager.js +507 -0
- package/dist/schema/index.js +15 -0
- package/dist/schema/migration-generator.js +374 -0
- package/dist/schema/schema-differ.js +549 -0
- package/dist/schema/types.js +6 -0
- package/dist/sql-constants.js +300 -0
- package/dist/sqlite-advanced.js +1047 -0
- package/dist/streams/index.js +12 -0
- package/dist/streams/transforms.js +178 -0
- package/dist/transaction.js +456 -0
- package/dist/types/index.js +180 -0
- package/dist/user-management.js +127 -0
- package/dist/utils/date.js +300 -0
- package/dist/utils/index.js +1079 -0
- package/dist/utils/string.js +161 -0
- package/dist/validators/index.js +19 -0
- package/dist/validators/validator.js +911 -0
- 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;
|