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,435 @@
1
+ "use strict";
2
+ /**
3
+ * QueryInterface for migrations
4
+ * Provides methods for schema modifications during migrations
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.QueryInterface = void 0;
8
+ exports.createQueryInterface = createQueryInterface;
9
+ /**
10
+ * QueryInterface class for migrations
11
+ * Provides a unified API for schema modifications across dialects
12
+ */
13
+ class QueryInterface {
14
+ /**
15
+ * Create a new QueryInterface instance
16
+ * @param dialect - The database dialect to use
17
+ */
18
+ constructor(dialect) {
19
+ this.transaction = null;
20
+ this.dialect = dialect;
21
+ }
22
+ /**
23
+ * Set the current transaction
24
+ */
25
+ setTransaction(transaction) {
26
+ this.transaction = transaction;
27
+ }
28
+ /**
29
+ * Get the current transaction
30
+ */
31
+ getTransaction() {
32
+ return this.transaction;
33
+ }
34
+ /**
35
+ * Get the underlying dialect
36
+ */
37
+ getDialect() {
38
+ return this.dialect;
39
+ }
40
+ /**
41
+ * Create a new table
42
+ * @param tableName - Name of the table to create
43
+ * @param columns - Column definitions
44
+ * @param options - Table options
45
+ */
46
+ async createTable(tableName, columns, options) {
47
+ await this.dialect.createTable(tableName, columns, options);
48
+ }
49
+ /**
50
+ * Drop a table
51
+ * @param tableName - Name of the table to drop
52
+ * @param options - Drop options
53
+ */
54
+ async dropTable(tableName, options) {
55
+ await this.dialect.dropTable(tableName, options);
56
+ }
57
+ /**
58
+ * Drop all tables (dialect-specific)
59
+ */
60
+ async dropAllTables(_options) {
61
+ const tables = await this.showTables();
62
+ for (const table of tables) {
63
+ await this.dropTable(table);
64
+ }
65
+ }
66
+ /**
67
+ * Rename a table
68
+ * @param oldName - Current table name
69
+ * @param newName - New table name
70
+ */
71
+ async renameTable(oldName, newName) {
72
+ await this.dialect.renameTable(oldName, newName);
73
+ }
74
+ /**
75
+ * Show all tables in the database
76
+ */
77
+ async showTables() {
78
+ return this.dialect.showTables();
79
+ }
80
+ /**
81
+ * Describe a table (get column information)
82
+ * @param tableName - Name of the table to describe
83
+ */
84
+ async describeTable(tableName) {
85
+ const description = await this.dialect.describeTable(tableName);
86
+ return description;
87
+ }
88
+ /**
89
+ * Add a column to a table
90
+ * @param tableName - Name of the table
91
+ * @param columnName - Name of the new column
92
+ * @param definition - Column definition
93
+ */
94
+ async addColumn(tableName, columnName, definition) {
95
+ await this.dialect.addColumn(tableName, columnName, definition);
96
+ }
97
+ /**
98
+ * Remove a column from a table
99
+ * @param tableName - Name of the table
100
+ * @param columnName - Name of the column to remove
101
+ */
102
+ async removeColumn(tableName, columnName) {
103
+ await this.dialect.removeColumn(tableName, columnName);
104
+ }
105
+ /**
106
+ * Change a column definition
107
+ * @param tableName - Name of the table
108
+ * @param columnName - Name of the column to change
109
+ * @param definition - New column definition
110
+ */
111
+ async changeColumn(tableName, columnName, definition) {
112
+ await this.dialect.changeColumn(tableName, columnName, definition);
113
+ }
114
+ /**
115
+ * Rename a column
116
+ * @param tableName - Name of the table
117
+ * @param oldColumnName - Current column name
118
+ * @param newColumnName - New column name
119
+ */
120
+ async renameColumn(tableName, oldColumnName, newColumnName) {
121
+ // Get current column definition
122
+ const description = await this.describeTable(tableName);
123
+ const columnDef = description[oldColumnName];
124
+ if (!columnDef) {
125
+ throw new Error(`Column ${oldColumnName} does not exist in table ${tableName}`);
126
+ }
127
+ // Add new column with new name
128
+ await this.addColumn(tableName, newColumnName, {
129
+ type: columnDef.type,
130
+ allowNull: columnDef.allowNull,
131
+ defaultValue: columnDef.defaultValue,
132
+ });
133
+ // Copy data from old column
134
+ await this.prormQuery(`UPDATE ${this.dialect.escapeId(tableName)} SET ${this.dialect.escapeId(newColumnName)} = ${this.dialect.escapeId(oldColumnName)}`);
135
+ // Remove old column
136
+ await this.removeColumn(tableName, oldColumnName);
137
+ }
138
+ /**
139
+ * Add an index to a table
140
+ * @param tableName - Name of the table
141
+ * @param indexName - Name of the index
142
+ * @param fields - Fields to index
143
+ * @param options - Index options
144
+ */
145
+ async addIndex(tableName, indexName, fields, options) {
146
+ await this.dialect.addIndex(tableName, indexName, fields, options);
147
+ }
148
+ /**
149
+ * Remove an index from a table
150
+ * @param tableName - Name of the table
151
+ * @param indexName - Name of the index
152
+ */
153
+ async removeIndex(tableName, indexName) {
154
+ await this.dialect.removeIndex(tableName, indexName);
155
+ }
156
+ /**
157
+ * Show indexes for a table
158
+ * @param tableName - Name of the table
159
+ */
160
+ async showIndexes(tableName) {
161
+ // Delegate to the dialect so each database uses its own system-table query
162
+ // (SQLite PRAGMA, Postgres pg_indexes, MySQL SHOW INDEX, etc.) instead of
163
+ // hardcoding sqlite_master.
164
+ const indexes = await this.dialect.showIndexes(tableName);
165
+ return indexes.map((idx) => ({
166
+ name: idx.name,
167
+ unique: idx.unique ?? false,
168
+ fields: idx.fields ?? [],
169
+ type: idx.type,
170
+ }));
171
+ }
172
+ /**
173
+ * Add a constraint to a table
174
+ * @param tableName - Name of the table
175
+ * @param constraintName - Name of the constraint
176
+ * @param constraintDefinition - Constraint definition
177
+ */
178
+ async addConstraint(tableName, constraintName, constraintDefinition) {
179
+ // A UNIQUE constraint is portably expressed as a unique index, so keep the
180
+ // existing index-based path (round-trips with removeConstraint below).
181
+ if (constraintDefinition.type === 'unique') {
182
+ if (constraintDefinition.fields && constraintDefinition.fields.length > 0) {
183
+ await this.addIndex(tableName, constraintName, constraintDefinition.fields, {
184
+ unique: true,
185
+ });
186
+ }
187
+ return;
188
+ }
189
+ // PRIMARY KEY / FOREIGN KEY / CHECK are delegated to the dialect's
190
+ // createConstraint, which actually applies the constraint (via ALTER TABLE
191
+ // ADD CONSTRAINT, or a table rebuild for SQLite) instead of silently
192
+ // succeeding. Unsupported cases surface as a clear dialect error.
193
+ const typeMap = {
194
+ primaryKey: 'PRIMARY KEY',
195
+ foreignKey: 'FOREIGN KEY',
196
+ check: 'CHECK',
197
+ };
198
+ const constraintDef = {
199
+ name: constraintName,
200
+ type: typeMap[constraintDefinition.type],
201
+ fields: constraintDefinition.fields,
202
+ };
203
+ if (constraintDefinition.references) {
204
+ const refFields = constraintDefinition.references.fields;
205
+ constraintDef.references = {
206
+ table: constraintDefinition.references.table,
207
+ // createConstraint accepts a single field or a composite array; pass the
208
+ // array through for composite keys.
209
+ field: (refFields.length === 1 ? refFields[0] : refFields),
210
+ onDelete: constraintDefinition.onDelete,
211
+ onUpdate: constraintDefinition.onUpdate,
212
+ };
213
+ }
214
+ await this.dialect.createConstraint(tableName, constraintDef);
215
+ }
216
+ /**
217
+ * Remove a constraint from a table
218
+ * @param tableName - Name of the table
219
+ * @param constraintName - Name of the constraint
220
+ * @param constraintType - Type of constraint
221
+ */
222
+ async removeConstraint(tableName, constraintName, constraintType) {
223
+ // UNIQUE constraints are created as unique indexes above, so drop the index.
224
+ if (constraintType === 'unique') {
225
+ await this.removeIndex(tableName, constraintName);
226
+ return;
227
+ }
228
+ // PRIMARY KEY / FOREIGN KEY / CHECK are delegated to the dialect's
229
+ // dropConstraint (ALTER TABLE DROP CONSTRAINT) instead of silently no-oping.
230
+ // Dialects that cannot drop constraints in place throw a clear error.
231
+ await this.dialect.dropConstraint(tableName, constraintName);
232
+ }
233
+ /**
234
+ * Bulk insert records into a table
235
+ * @param tableName - Name of the table
236
+ * @param records - Array of records to insert
237
+ */
238
+ async bulkInsert(tableName, records) {
239
+ if (records.length === 0) {
240
+ return 0;
241
+ }
242
+ const columns = Object.keys(records[0]);
243
+ const values = records.map((record) => {
244
+ return columns.map((col) => this.dialect.escape(record[col])).join(', ');
245
+ });
246
+ const columnList = columns.map((col) => this.dialect.escapeId(col)).join(', ');
247
+ const valueList = values.map((v) => `(${v})`).join(',\n');
248
+ const sql = `INSERT INTO ${this.dialect.escapeId(tableName)} (${columnList}) VALUES ${valueList}`;
249
+ const result = await this.dialect.query(sql);
250
+ return result.rowCount;
251
+ }
252
+ /**
253
+ * Bulk update records in a table
254
+ * @param tableName - Name of the table
255
+ * @param values - Values to update
256
+ * @param where - Where conditions
257
+ */
258
+ async bulkUpdate(tableName, values, where) {
259
+ const setClause = Object.entries(values)
260
+ .map(([key, value]) => `${this.dialect.escapeId(key)} = ${this.dialect.escape(value)}`)
261
+ .join(', ');
262
+ const whereClause = this.buildWhereClause(where);
263
+ const sql = `UPDATE ${this.dialect.escapeId(tableName)} SET ${setClause} ${whereClause.sql}`;
264
+ const result = await this.dialect.query(sql, { replacements: whereClause.values });
265
+ return result.rowCount;
266
+ }
267
+ /**
268
+ * Bulk delete records from a table
269
+ * @param tableName - Name of the table
270
+ * @param where - Where conditions
271
+ */
272
+ async bulkDelete(tableName, where) {
273
+ const whereClause = this.buildWhereClause(where);
274
+ const sql = `DELETE FROM ${this.dialect.escapeId(tableName)} ${whereClause.sql}`;
275
+ const result = await this.dialect.query(sql, { replacements: whereClause.values });
276
+ return result.rowCount;
277
+ }
278
+ /**
279
+ * Check if a table exists
280
+ * @param tableName - Name of the table
281
+ */
282
+ async tableExists(tableName) {
283
+ const tables = await this.showTables();
284
+ return tables.includes(tableName);
285
+ }
286
+ /**
287
+ * Check if a column exists
288
+ * @param tableName - Name of the table
289
+ * @param columnName - Name of the column
290
+ */
291
+ async columnExists(tableName, columnName) {
292
+ const description = await this.describeTable(tableName);
293
+ return columnName in description;
294
+ }
295
+ /**
296
+ * Check if an index exists
297
+ * @param tableName - Name of the table
298
+ * @param indexName - Name of the index
299
+ */
300
+ async indexExists(tableName, indexName) {
301
+ const indexes = await this.showIndexes(tableName);
302
+ return indexes.some((idx) => idx.name === indexName);
303
+ }
304
+ /**
305
+ * Get all foreign keys for a table
306
+ * @param tableName - Name of the table
307
+ */
308
+ async getForeignKeysForTable(tableName) {
309
+ // Simplified implementation
310
+ // Real implementation would query database-specific system tables
311
+ const description = await this.describeTable(tableName);
312
+ const foreignKeys = [];
313
+ for (const [columnName, columnDef] of Object.entries(description)) {
314
+ if (columnDef.references) {
315
+ foreignKeys.push({
316
+ name: `${tableName}_${columnName}_fkey`,
317
+ field: columnName,
318
+ references: columnDef.references,
319
+ });
320
+ }
321
+ }
322
+ return foreignKeys;
323
+ }
324
+ /**
325
+ * Remove foreign key
326
+ * @param tableName - Name of the table
327
+ * @param foreignKeyName - Name of the foreign key
328
+ */
329
+ async removeForeignKey(tableName, foreignKeyName) {
330
+ // A foreign key is a named constraint, so delegate to the dialect's
331
+ // dropConstraint. This avoids emitting MySQL-only `DROP FOREIGN KEY`, which
332
+ // is invalid on Postgres and others that require `DROP CONSTRAINT`.
333
+ await this.dialect.dropConstraint(tableName, foreignKeyName);
334
+ }
335
+ /**
336
+ * Add foreign key
337
+ * @param tableName - Name of the table
338
+ * @param columnName - Name of the column
339
+ * @param references - Reference definition
340
+ */
341
+ async addForeignKey(tableName, columnName, references, onDelete, onUpdate) {
342
+ let sql = `ALTER TABLE ${this.dialect.escapeId(tableName)} ADD CONSTRAINT `;
343
+ sql += `${this.dialect.escapeId(`${tableName}_${columnName}_fkey`)} `;
344
+ sql += `FOREIGN KEY (${this.dialect.escapeId(columnName)}) `;
345
+ sql += `REFERENCES ${this.dialect.escapeId(references.table)} (${this.dialect.escapeId(references.field)})`;
346
+ if (onDelete) {
347
+ sql += ` ON DELETE ${onDelete}`;
348
+ }
349
+ if (onUpdate) {
350
+ sql += ` ON UPDATE ${onUpdate}`;
351
+ }
352
+ await this.prormQuery(sql);
353
+ }
354
+ /**
355
+ * Create a partitioned table (PostgreSQL 10+)
356
+ * @param tableName - Name of the table to create
357
+ * @param columns - Column definitions
358
+ * @param options - Table options including partition configuration
359
+ */
360
+ async createPartitionedTable(tableName, columns, options) {
361
+ await this.dialect.createPartitionedTable(tableName, columns, options);
362
+ }
363
+ /**
364
+ * Create a partition for an existing partitioned table (PostgreSQL 10+)
365
+ * @param options - Partition creation options
366
+ */
367
+ async createPartition(options) {
368
+ await this.dialect.createPartition(options);
369
+ }
370
+ /**
371
+ * Attach a partition to a partitioned table (PostgreSQL 11+)
372
+ * @param options - Partition attachment options
373
+ */
374
+ async attachPartition(options) {
375
+ await this.dialect.attachPartition(options);
376
+ }
377
+ /**
378
+ * Detach a partition from a partitioned table (PostgreSQL 11+)
379
+ * @param options - Partition detachment options
380
+ */
381
+ async detachPartition(options) {
382
+ await this.dialect.detachPartition(options);
383
+ }
384
+ /**
385
+ * Drop a partition (PostgreSQL 10+)
386
+ * @param partitionName - Name of the partition to drop
387
+ * @param options - Drop options
388
+ */
389
+ async dropPartition(partitionName, options) {
390
+ await this.dialect.dropPartition(partitionName, options);
391
+ }
392
+ /**
393
+ * Execute a raw SQL query
394
+ * @param sql - SQL query
395
+ * @param options - Query options
396
+ */
397
+ async prormQuery(sql, options) {
398
+ return this.dialect.query(sql, options);
399
+ }
400
+ /**
401
+ * Get the database version
402
+ */
403
+ async getDatabaseVersion() {
404
+ return this.dialect.getDatabaseVersion();
405
+ }
406
+ /**
407
+ * Build a WHERE clause from WhereOptions
408
+ */
409
+ buildWhereClause(where) {
410
+ const conditions = [];
411
+ const values = [];
412
+ for (const [key, value] of Object.entries(where)) {
413
+ if (value === null) {
414
+ conditions.push(`${this.dialect.escapeId(key)} IS NULL`);
415
+ }
416
+ else if (Array.isArray(value)) {
417
+ conditions.push(`${this.dialect.escapeId(key)} IN (${value.map(() => '?').join(', ')})`);
418
+ values.push(...value);
419
+ }
420
+ else {
421
+ conditions.push(`${this.dialect.escapeId(key)} = ?`);
422
+ values.push(value);
423
+ }
424
+ }
425
+ const sql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
426
+ return { sql, values };
427
+ }
428
+ }
429
+ exports.QueryInterface = QueryInterface;
430
+ /**
431
+ * Create a QueryInterface from a dialect
432
+ */
433
+ function createQueryInterface(dialect) {
434
+ return new QueryInterface(dialect);
435
+ }