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,580 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Storage engine and physical storage decorators for the ORM.
|
|
4
|
+
*
|
|
5
|
+
* Provides decorators for configuring storage-level database options:
|
|
6
|
+
* - Storage engine (MySQL/MariaDB)
|
|
7
|
+
* - Tablespace (PostgreSQL)
|
|
8
|
+
* - Clustered/Non-clustered indexes (SQL Server)
|
|
9
|
+
* - Compression (PostgreSQL)
|
|
10
|
+
* - Row format and format options
|
|
11
|
+
* - Inheritance
|
|
12
|
+
* - Replica identity for replication
|
|
13
|
+
* - Statistics
|
|
14
|
+
* - ON COMMIT for temp tables
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
*
|
|
18
|
+
* // MySQL/MariaDB storage engine
|
|
19
|
+
* @Storage({ engine: 'InnoDB', rowFormat: 'DYNAMIC' })
|
|
20
|
+
* class Order extends Model {}
|
|
21
|
+
*
|
|
22
|
+
* // PostgreSQL tablespace
|
|
23
|
+
* @Tablespace('tablespace_name')
|
|
24
|
+
* @Table
|
|
25
|
+
* class LargeTable extends Model {}
|
|
26
|
+
*
|
|
27
|
+
* // SQL Server clustered index
|
|
28
|
+
* @Clustered(true)
|
|
29
|
+
* @Index({ columns: ['id'] })
|
|
30
|
+
* class Data extends Model {}
|
|
31
|
+
*
|
|
32
|
+
* // PostgreSQL compression
|
|
33
|
+
* @Compression({ level: 6 })
|
|
34
|
+
* @Column
|
|
35
|
+
* blobData: Buffer;
|
|
36
|
+
*
|
|
37
|
+
* // PostgreSQL inheritance
|
|
38
|
+
* @Inherits('parent_table')
|
|
39
|
+
* class ChildTable extends Model {}
|
|
40
|
+
*
|
|
41
|
+
* // PostgreSQL replica identity
|
|
42
|
+
* @ReplicaIdentity('FULL')
|
|
43
|
+
* class SensitiveData extends Model {}
|
|
44
|
+
*/
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.Storage = Storage;
|
|
47
|
+
exports.Tablespace = Tablespace;
|
|
48
|
+
exports.TablespaceOptions = TablespaceOptions;
|
|
49
|
+
exports.Clustered = Clustered;
|
|
50
|
+
exports.Compression = Compression;
|
|
51
|
+
exports.ReplicaIdentity = ReplicaIdentity;
|
|
52
|
+
exports.Statistics = Statistics;
|
|
53
|
+
exports.OnCommit = OnCommit;
|
|
54
|
+
exports.Inherits = Inherits;
|
|
55
|
+
exports.Partition = Partition;
|
|
56
|
+
exports.ColumnStorage = ColumnStorage;
|
|
57
|
+
exports.getStorageOptions = getStorageOptions;
|
|
58
|
+
exports.getTablespaceOptions = getTablespaceOptions;
|
|
59
|
+
exports.getClusteredOptions = getClusteredOptions;
|
|
60
|
+
exports.getCompressionOptions = getCompressionOptions;
|
|
61
|
+
exports.getReplicaIdentityOptions = getReplicaIdentityOptions;
|
|
62
|
+
exports.getStatisticsOptions = getStatisticsOptions;
|
|
63
|
+
exports.getOnCommitOption = getOnCommitOption;
|
|
64
|
+
exports.getInheritsOptions = getInheritsOptions;
|
|
65
|
+
exports.getColumnStorageOptions = getColumnStorageOptions;
|
|
66
|
+
exports.generateStorageSQL = generateStorageSQL;
|
|
67
|
+
exports.generateTablespaceSQL = generateTablespaceSQL;
|
|
68
|
+
exports.generateClusteredSQL = generateClusteredSQL;
|
|
69
|
+
exports.generateCompressionSQL = generateCompressionSQL;
|
|
70
|
+
exports.generateReplicaIdentitySQL = generateReplicaIdentitySQL;
|
|
71
|
+
exports.generateStatisticsSQL = generateStatisticsSQL;
|
|
72
|
+
exports.generateInheritsSQL = generateInheritsSQL;
|
|
73
|
+
exports.getPartitionOptions = getPartitionOptions;
|
|
74
|
+
exports.generatePartitionSQL = generatePartitionSQL;
|
|
75
|
+
exports.generatePartitionBoundSQL = generatePartitionBoundSQL;
|
|
76
|
+
require("reflect-metadata");
|
|
77
|
+
// ==================== Metadata Keys ====================
|
|
78
|
+
const STORAGE_KEY = Symbol('prorm:storage');
|
|
79
|
+
const TABLESPACE_KEY = Symbol('prorm:tablespace');
|
|
80
|
+
const CLUSTERED_KEY = Symbol('prorm:clustered');
|
|
81
|
+
const COMPRESSION_KEY = Symbol('prorm:compression');
|
|
82
|
+
const REPLICA_IDENTITY_KEY = Symbol('prorm:replicaIdentity');
|
|
83
|
+
const STATISTICS_KEY = Symbol('prorm:statistics');
|
|
84
|
+
const ON_COMMIT_KEY = Symbol('prorm:onCommit');
|
|
85
|
+
const INHERITS_KEY = Symbol('prorm:inherits');
|
|
86
|
+
const COLUMN_STORAGE_KEY = Symbol('prorm:columnStorage');
|
|
87
|
+
const PARTITION_KEY = Symbol('prorm:partition');
|
|
88
|
+
// ==================== Class Decorators ====================
|
|
89
|
+
/**
|
|
90
|
+
* Decorator to configure storage engine and table storage options.
|
|
91
|
+
*
|
|
92
|
+
* Usage:
|
|
93
|
+
*
|
|
94
|
+
* @Storage({ engine: 'InnoDB', rowFormat: 'DYNAMIC' })
|
|
95
|
+
* class Order extends Model {}
|
|
96
|
+
*
|
|
97
|
+
* @Storage({ engine: 'MyISAM', rowFormat: 'FIXED' })
|
|
98
|
+
* class LogData extends Model {}
|
|
99
|
+
*
|
|
100
|
+
* @param options - Storage configuration options
|
|
101
|
+
*/
|
|
102
|
+
function Storage(options = {}) {
|
|
103
|
+
return function (target) {
|
|
104
|
+
Reflect.defineMetadata(STORAGE_KEY, {
|
|
105
|
+
engine: options.engine || 'InnoDB',
|
|
106
|
+
rowFormat: options.rowFormat || 'DYNAMIC',
|
|
107
|
+
encryption: options.encryption,
|
|
108
|
+
comment: options.comment,
|
|
109
|
+
avgRowLength: options.avgRowLength,
|
|
110
|
+
maxRows: options.maxRows,
|
|
111
|
+
minRows: options.minRows,
|
|
112
|
+
password: options.password,
|
|
113
|
+
tablespace: options.tablespace,
|
|
114
|
+
}, target);
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Decorator to specify tablespace for a table (PostgreSQL/MySQL).
|
|
119
|
+
*
|
|
120
|
+
* Usage:
|
|
121
|
+
*
|
|
122
|
+
* @Tablespace('fast_storage')
|
|
123
|
+
* @Table
|
|
124
|
+
* class LargeTable extends Model {}
|
|
125
|
+
*
|
|
126
|
+
* @param name - Tablespace name
|
|
127
|
+
*/
|
|
128
|
+
function Tablespace(name) {
|
|
129
|
+
return function (target) {
|
|
130
|
+
Reflect.defineMetadata(TABLESPACE_KEY, { name }, target);
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Decorator to specify tablespace with options (PostgreSQL).
|
|
135
|
+
*
|
|
136
|
+
* Usage:
|
|
137
|
+
*
|
|
138
|
+
* @Tablespace({ name: 'fast_storage', indexTablespace: 'idx_space' })
|
|
139
|
+
* @Table
|
|
140
|
+
* class LargeTable extends Model {}
|
|
141
|
+
*
|
|
142
|
+
* @param options - Tablespace options
|
|
143
|
+
*/
|
|
144
|
+
function TablespaceOptions(options) {
|
|
145
|
+
return function (target) {
|
|
146
|
+
Reflect.defineMetadata(TABLESPACE_KEY, options, target);
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Decorator to create a clustered or non-clustered index (SQL Server).
|
|
151
|
+
*
|
|
152
|
+
* Usage:
|
|
153
|
+
*
|
|
154
|
+
* @Clustered(true)
|
|
155
|
+
* @Index({ columns: ['id'] })
|
|
156
|
+
* class Data extends Model {}
|
|
157
|
+
*
|
|
158
|
+
* @Clustered({ type: 'nonclustered', include: ['name', 'email'] })
|
|
159
|
+
* @Index({ columns: ['id'] })
|
|
160
|
+
* class UserData extends Model {}
|
|
161
|
+
*
|
|
162
|
+
* @param options - Cluster options
|
|
163
|
+
*/
|
|
164
|
+
function Clustered(options = true) {
|
|
165
|
+
return function (target) {
|
|
166
|
+
const clusteredOptions = typeof options === 'boolean' ? { type: options ? 'clustered' : 'nonclustered' } : options;
|
|
167
|
+
Reflect.defineMetadata(CLUSTERED_KEY, clusteredOptions, target);
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Decorator to specify compression options (PostgreSQL).
|
|
172
|
+
*
|
|
173
|
+
* Usage:
|
|
174
|
+
*
|
|
175
|
+
* @Compression({ algorithm: 'lz4', level: 6 })
|
|
176
|
+
* @Table
|
|
177
|
+
* class LargeTable extends Model {}
|
|
178
|
+
*
|
|
179
|
+
* @param options - Compression options
|
|
180
|
+
*/
|
|
181
|
+
function Compression(options = {}) {
|
|
182
|
+
return function (target) {
|
|
183
|
+
Reflect.defineMetadata(COMPRESSION_KEY, {
|
|
184
|
+
algorithm: options.algorithm || 'pglz',
|
|
185
|
+
level: options.level ?? 6,
|
|
186
|
+
compressLevel: options.compressLevel,
|
|
187
|
+
}, target);
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Decorator to set replica identity for logical replication (PostgreSQL).
|
|
192
|
+
*
|
|
193
|
+
* Usage:
|
|
194
|
+
*
|
|
195
|
+
* @ReplicaIdentity('FULL')
|
|
196
|
+
* class SensitiveData extends Model {}
|
|
197
|
+
*
|
|
198
|
+
* @ReplicaIdentity({ type: 'INDEX', index: 'idx_user_email' })
|
|
199
|
+
* class UserData extends Model {}
|
|
200
|
+
*
|
|
201
|
+
* @param options - Replica identity type or options
|
|
202
|
+
*/
|
|
203
|
+
function ReplicaIdentity(options) {
|
|
204
|
+
return function (target) {
|
|
205
|
+
const replicaOptions = typeof options === 'string' ? { type: options } : options;
|
|
206
|
+
Reflect.defineMetadata(REPLICA_IDENTITY_KEY, replicaOptions, target);
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Decorator to configure statistics collection (PostgreSQL).
|
|
211
|
+
*
|
|
212
|
+
* Usage:
|
|
213
|
+
*
|
|
214
|
+
* @Statistics({ for: 'columns', target: 500 })
|
|
215
|
+
* @Table
|
|
216
|
+
* class UserData extends Model {}
|
|
217
|
+
*
|
|
218
|
+
* @param options - Statistics options
|
|
219
|
+
*/
|
|
220
|
+
function Statistics(options = {}) {
|
|
221
|
+
return function (target) {
|
|
222
|
+
Reflect.defineMetadata(STATISTICS_KEY, {
|
|
223
|
+
for: options.for || 'columns',
|
|
224
|
+
columns: options.columns,
|
|
225
|
+
target: options.target,
|
|
226
|
+
}, target);
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Decorator to set ON COMMIT behavior for temp tables (PostgreSQL).
|
|
231
|
+
*
|
|
232
|
+
* Usage:
|
|
233
|
+
*
|
|
234
|
+
* @OnCommit('PRESERVE ROWS')
|
|
235
|
+
* @Table({ temporary: true })
|
|
236
|
+
* class TempData extends Model {}
|
|
237
|
+
*
|
|
238
|
+
* @param option - ON COMMIT option
|
|
239
|
+
*/
|
|
240
|
+
function OnCommit(option) {
|
|
241
|
+
return function (target) {
|
|
242
|
+
Reflect.defineMetadata(ON_COMMIT_KEY, { option }, target);
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Decorator to specify table inheritance (PostgreSQL).
|
|
247
|
+
*
|
|
248
|
+
* Usage:
|
|
249
|
+
*
|
|
250
|
+
* @Inherits('parent_table')
|
|
251
|
+
* class ChildTable extends Model {}
|
|
252
|
+
*
|
|
253
|
+
* @Inherits({ parentTable: 'parent', only: true })
|
|
254
|
+
* class ChildOnlyTable extends Model {}
|
|
255
|
+
*
|
|
256
|
+
* @param options - Inheritance options (table name string or options object)
|
|
257
|
+
*/
|
|
258
|
+
function Inherits(options) {
|
|
259
|
+
return function (target) {
|
|
260
|
+
const inheritsOptions = typeof options === 'string' ? { parentTable: options } : options;
|
|
261
|
+
Reflect.defineMetadata(INHERITS_KEY, inheritsOptions, target);
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Decorator to configure table partitioning (PostgreSQL 10+).
|
|
266
|
+
*
|
|
267
|
+
* Usage:
|
|
268
|
+
*
|
|
269
|
+
* // Range partition by date
|
|
270
|
+
* @Partition({ type: 'range', column: 'order_date' })
|
|
271
|
+
* @Table
|
|
272
|
+
* class Order extends Model {}
|
|
273
|
+
*
|
|
274
|
+
* // List partition by region
|
|
275
|
+
* @Partition({ type: 'list', column: 'region' })
|
|
276
|
+
* @Table
|
|
277
|
+
* class Customer extends Model {}
|
|
278
|
+
*
|
|
279
|
+
* // Hash partition by id
|
|
280
|
+
* @Partition({ type: 'hash', column: 'id' })
|
|
281
|
+
* @Table
|
|
282
|
+
* class Log extends Model {}
|
|
283
|
+
*
|
|
284
|
+
* @param options - Partition configuration options
|
|
285
|
+
*/
|
|
286
|
+
function Partition(options) {
|
|
287
|
+
return function (target) {
|
|
288
|
+
Reflect.defineMetadata(PARTITION_KEY, options, target);
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
// ==================== Property Decorators ====================
|
|
292
|
+
/**
|
|
293
|
+
* Decorator to specify column-level storage options (PostgreSQL).
|
|
294
|
+
*
|
|
295
|
+
* Usage:
|
|
296
|
+
*
|
|
297
|
+
* @Column(DataTypes.BLOB)
|
|
298
|
+
* @ColumnStorage({ compression: 'pglz' })
|
|
299
|
+
* blobData: Buffer;
|
|
300
|
+
*
|
|
301
|
+
* @param options - Column storage options
|
|
302
|
+
*/
|
|
303
|
+
function ColumnStorage(options) {
|
|
304
|
+
return function (target, propertyKey) {
|
|
305
|
+
const existing = Reflect.getMetadata(COLUMN_STORAGE_KEY, target) || {};
|
|
306
|
+
existing[propertyKey] = options;
|
|
307
|
+
Reflect.defineMetadata(COLUMN_STORAGE_KEY, existing, target);
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
// ==================== Helper Functions ====================
|
|
311
|
+
/**
|
|
312
|
+
* Get storage options for a model.
|
|
313
|
+
*
|
|
314
|
+
* @param target - The target class or prototype
|
|
315
|
+
* @returns Storage options or undefined
|
|
316
|
+
*/
|
|
317
|
+
function getStorageOptions(target) {
|
|
318
|
+
return Reflect.getMetadata(STORAGE_KEY, target);
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Get tablespace options for a model.
|
|
322
|
+
*
|
|
323
|
+
* @param target - The target class or prototype
|
|
324
|
+
* @returns Tablespace options or undefined
|
|
325
|
+
*/
|
|
326
|
+
function getTablespaceOptions(target) {
|
|
327
|
+
return Reflect.getMetadata(TABLESPACE_KEY, target);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Get clustered index options for a model.
|
|
331
|
+
*
|
|
332
|
+
* @param target - The target class or prototype
|
|
333
|
+
* @returns Clustered options or undefined
|
|
334
|
+
*/
|
|
335
|
+
function getClusteredOptions(target) {
|
|
336
|
+
return Reflect.getMetadata(CLUSTERED_KEY, target);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get compression options for a model.
|
|
340
|
+
*
|
|
341
|
+
* @param target - The target class or prototype
|
|
342
|
+
* @returns Compression options or undefined
|
|
343
|
+
*/
|
|
344
|
+
function getCompressionOptions(target) {
|
|
345
|
+
return Reflect.getMetadata(COMPRESSION_KEY, target);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Get replica identity options for a model.
|
|
349
|
+
*
|
|
350
|
+
* @param target - The target class or prototype
|
|
351
|
+
* @returns Replica identity options or undefined
|
|
352
|
+
*/
|
|
353
|
+
function getReplicaIdentityOptions(target) {
|
|
354
|
+
return Reflect.getMetadata(REPLICA_IDENTITY_KEY, target);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Get statistics options for a model.
|
|
358
|
+
*
|
|
359
|
+
* @param target - The target class or prototype
|
|
360
|
+
* @returns Statistics options or undefined
|
|
361
|
+
*/
|
|
362
|
+
function getStatisticsOptions(target) {
|
|
363
|
+
return Reflect.getMetadata(STATISTICS_KEY, target);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Get ON COMMIT option for a model.
|
|
367
|
+
*
|
|
368
|
+
* @param target - The target class or prototype
|
|
369
|
+
* @returns ON COMMIT option or undefined
|
|
370
|
+
*/
|
|
371
|
+
function getOnCommitOption(target) {
|
|
372
|
+
return Reflect.getMetadata(ON_COMMIT_KEY, target);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Get inheritance options for a model.
|
|
376
|
+
*
|
|
377
|
+
* @param target - The target class or prototype
|
|
378
|
+
* @returns Inheritance options or undefined
|
|
379
|
+
*/
|
|
380
|
+
function getInheritsOptions(target) {
|
|
381
|
+
return Reflect.getMetadata(INHERITS_KEY, target);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Get column storage options for a property.
|
|
385
|
+
*
|
|
386
|
+
* @param target - The target object
|
|
387
|
+
* @param propertyKey - The property key
|
|
388
|
+
* @returns Column storage options or undefined
|
|
389
|
+
*/
|
|
390
|
+
function getColumnStorageOptions(target, propertyKey) {
|
|
391
|
+
const all = Reflect.getMetadata(COLUMN_STORAGE_KEY, target);
|
|
392
|
+
return all?.[propertyKey];
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Generate storage-related SQL for a model.
|
|
396
|
+
*
|
|
397
|
+
* @param options - Storage options
|
|
398
|
+
* @param dialect - Database dialect
|
|
399
|
+
* @returns Array of SQL statements
|
|
400
|
+
*/
|
|
401
|
+
function generateStorageSQL(options, dialect) {
|
|
402
|
+
const statements = [];
|
|
403
|
+
if (dialect === 'mysql' || dialect === 'mariadb') {
|
|
404
|
+
if (options.engine) {
|
|
405
|
+
statements.push(`ENGINE = ${options.engine}`);
|
|
406
|
+
}
|
|
407
|
+
if (options.rowFormat) {
|
|
408
|
+
statements.push(`ROW_FORMAT = ${options.rowFormat}`);
|
|
409
|
+
}
|
|
410
|
+
if (options.tablespace) {
|
|
411
|
+
statements.push(`TABLESPACE = ${options.tablespace}`);
|
|
412
|
+
}
|
|
413
|
+
if (options.encryption !== undefined) {
|
|
414
|
+
const encValue = typeof options.encryption === 'string'
|
|
415
|
+
? `'${options.encryption}'`
|
|
416
|
+
: options.encryption
|
|
417
|
+
? "'Y'"
|
|
418
|
+
: "'N'";
|
|
419
|
+
statements.push(`ENCRYPTION = ${encValue}`);
|
|
420
|
+
}
|
|
421
|
+
if (options.comment) {
|
|
422
|
+
statements.push(`COMMENT = '${options.comment}'`);
|
|
423
|
+
}
|
|
424
|
+
if (options.avgRowLength) {
|
|
425
|
+
statements.push(`AVG_ROW_LENGTH = ${options.avgRowLength}`);
|
|
426
|
+
}
|
|
427
|
+
if (options.maxRows) {
|
|
428
|
+
statements.push(`MAX_ROWS = ${options.maxRows}`);
|
|
429
|
+
}
|
|
430
|
+
if (options.minRows) {
|
|
431
|
+
statements.push(`MIN_ROWS = ${options.minRows}`);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return statements;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Generate tablespace SQL for a model.
|
|
438
|
+
*
|
|
439
|
+
* @param options - Tablespace options
|
|
440
|
+
* @param dialect - Database dialect
|
|
441
|
+
* @returns SQL string or undefined
|
|
442
|
+
*/
|
|
443
|
+
function generateTablespaceSQL(options, dialect) {
|
|
444
|
+
if (dialect === 'postgres') {
|
|
445
|
+
let sql = `TABLESPACE ${options.name}`;
|
|
446
|
+
if (options.indexTablespace) {
|
|
447
|
+
sql += ` INDEX TABLESPACE ${options.indexTablespace}`;
|
|
448
|
+
}
|
|
449
|
+
return sql;
|
|
450
|
+
}
|
|
451
|
+
if ((dialect === 'mysql' || dialect === 'mariadb') && options.name) {
|
|
452
|
+
return `TABLESPACE = ${options.name}`;
|
|
453
|
+
}
|
|
454
|
+
return undefined;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Generate clustered index SQL.
|
|
458
|
+
*
|
|
459
|
+
* @param options - Clustered options
|
|
460
|
+
* @returns SQL string or undefined
|
|
461
|
+
*/
|
|
462
|
+
function generateClusteredSQL(options) {
|
|
463
|
+
const { type, unique, fillFactor, include } = options;
|
|
464
|
+
if (type === 'clustered') {
|
|
465
|
+
let sql = 'CLUSTERED';
|
|
466
|
+
if (unique)
|
|
467
|
+
sql = 'UNIQUE ' + sql;
|
|
468
|
+
if (fillFactor)
|
|
469
|
+
sql += ` (FILLFACTOR = ${fillFactor})`;
|
|
470
|
+
return sql;
|
|
471
|
+
}
|
|
472
|
+
if (type === 'nonclustered') {
|
|
473
|
+
let sql = 'NONCLUSTERED';
|
|
474
|
+
if (unique)
|
|
475
|
+
sql = 'UNIQUE ' + sql;
|
|
476
|
+
if (fillFactor)
|
|
477
|
+
sql += ` (FILLFACTOR = ${fillFactor})`;
|
|
478
|
+
if (include && include.length > 0) {
|
|
479
|
+
sql += ` INCLUDE (${include.join(', ')})`;
|
|
480
|
+
}
|
|
481
|
+
return sql;
|
|
482
|
+
}
|
|
483
|
+
return undefined;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Generate compression SQL (PostgreSQL).
|
|
487
|
+
*
|
|
488
|
+
* @param options - Compression options
|
|
489
|
+
* @returns SQL string or undefined
|
|
490
|
+
*/
|
|
491
|
+
function generateCompressionSQL(options) {
|
|
492
|
+
if (options.algorithm) {
|
|
493
|
+
return `COMPRESSION ${options.algorithm} (COMPRESS_LEVEL ${options.level || 6})`;
|
|
494
|
+
}
|
|
495
|
+
return undefined;
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Generate replica identity SQL (PostgreSQL).
|
|
499
|
+
*
|
|
500
|
+
* @param options - Replica identity options
|
|
501
|
+
* @returns SQL string
|
|
502
|
+
*/
|
|
503
|
+
function generateReplicaIdentitySQL(options) {
|
|
504
|
+
if (options.type === 'INDEX' && options.index) {
|
|
505
|
+
return `REPLICA IDENTITY INDEX ${options.index}`;
|
|
506
|
+
}
|
|
507
|
+
return `REPLICA IDENTITY ${options.type}`;
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Generate statistics SQL (PostgreSQL).
|
|
511
|
+
*
|
|
512
|
+
* @param options - Statistics options
|
|
513
|
+
* @param tableName - Table name
|
|
514
|
+
* @returns SQL string or undefined
|
|
515
|
+
*/
|
|
516
|
+
function generateStatisticsSQL(options, tableName) {
|
|
517
|
+
if (options.for === 'columns' && options.columns?.length) {
|
|
518
|
+
const colStats = options.columns.map((col) => `${col} (${options.target || 100})`).join(', ');
|
|
519
|
+
return `ALTER TABLE ${tableName} ALTER COLUMN ${colStats} SET STATISTICS ${options.target || 100}`;
|
|
520
|
+
}
|
|
521
|
+
if (options.for === 'all') {
|
|
522
|
+
return `ALTER TABLE ${tableName} ALTER COLUMN ${options.columns?.[0] || 'id'} SET STATISTICS ${options.target || 100}`;
|
|
523
|
+
}
|
|
524
|
+
return undefined;
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Generate inheritance SQL (PostgreSQL).
|
|
528
|
+
*
|
|
529
|
+
* @param options - Inheritance options
|
|
530
|
+
* @returns SQL string
|
|
531
|
+
*/
|
|
532
|
+
function generateInheritsSQL(options) {
|
|
533
|
+
const keyword = options.only ? 'INHERITS ONLY' : 'INHERITS';
|
|
534
|
+
return `${keyword} (${options.parentTable})`;
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Get partition options for a model.
|
|
538
|
+
*
|
|
539
|
+
* @param target - The target class or prototype
|
|
540
|
+
* @returns Partition options or undefined
|
|
541
|
+
*/
|
|
542
|
+
function getPartitionOptions(target) {
|
|
543
|
+
return Reflect.getMetadata(PARTITION_KEY, target);
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Generate partition by clause SQL (PostgreSQL 10+).
|
|
547
|
+
*
|
|
548
|
+
* @param options - Partition options
|
|
549
|
+
* @returns SQL string
|
|
550
|
+
*/
|
|
551
|
+
function generatePartitionSQL(options) {
|
|
552
|
+
const columns = Array.isArray(options.column) ? options.column.join(', ') : options.column;
|
|
553
|
+
return `${options.type.toUpperCase()} (${columns})`;
|
|
554
|
+
}
|
|
555
|
+
/**
|
|
556
|
+
* Generate partition bound SQL.
|
|
557
|
+
*
|
|
558
|
+
* @param bound - Partition bound options
|
|
559
|
+
* @param type - Partition type (range, list, hash)
|
|
560
|
+
* @returns SQL string
|
|
561
|
+
*/
|
|
562
|
+
function generatePartitionBoundSQL(bound, type) {
|
|
563
|
+
if (type === 'range') {
|
|
564
|
+
const from = bound.from instanceof Date ? bound.from.toISOString().split('T')[0] : bound.from;
|
|
565
|
+
const to = bound.to
|
|
566
|
+
? bound.to instanceof Date
|
|
567
|
+
? bound.to.toISOString().split('T')[0]
|
|
568
|
+
: bound.to
|
|
569
|
+
: 'MAXVALUE';
|
|
570
|
+
return `FROM (${from}) TO (${to})`;
|
|
571
|
+
}
|
|
572
|
+
if (type === 'list') {
|
|
573
|
+
const values = bound.values?.map((v) => (typeof v === 'string' ? `'${v}'` : v)).join(', ') || '';
|
|
574
|
+
return `IN (${values})`;
|
|
575
|
+
}
|
|
576
|
+
if (type === 'hash') {
|
|
577
|
+
return `WITH (MODULUS ${bound.modulus}, REMAINDER ${bound.remainder})`;
|
|
578
|
+
}
|
|
579
|
+
return '';
|
|
580
|
+
}
|