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,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
+ }