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,374 @@
1
+ "use strict";
2
+ /**
3
+ * Migration Generator
4
+ * Generates migration scripts from schema diffs
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MigrationGenerator = void 0;
8
+ exports.createMigrationGenerator = createMigrationGenerator;
9
+ /**
10
+ * MigrationGenerator generates SQL migration scripts from schema diffs
11
+ */
12
+ class MigrationGenerator {
13
+ constructor(dialect, options = {}) {
14
+ this.dialect = dialect;
15
+ this.options = {
16
+ generateDown: true,
17
+ includeComments: true,
18
+ namePrefix: 'migration',
19
+ ...options,
20
+ };
21
+ }
22
+ /**
23
+ * Generate a migration script from a schema diff
24
+ */
25
+ generateMigration(diff, options) {
26
+ const opts = { ...this.options, ...options };
27
+ const up = [];
28
+ const down = [];
29
+ if (opts.includeComments) {
30
+ up.push(`-- Migration: ${diff.tableName}`);
31
+ up.push(`-- Generated at: ${new Date().toISOString()}`);
32
+ up.push('');
33
+ }
34
+ const { columns, indexes, constraints, foreignKeys } = diff.changes;
35
+ // Process column changes
36
+ for (const change of columns) {
37
+ const columnMigration = this.generateColumnMigration(change, diff.tableName);
38
+ up.push(...columnMigration.up);
39
+ if (opts.generateDown) {
40
+ down.push(...columnMigration.down);
41
+ }
42
+ }
43
+ // Process index changes
44
+ for (const change of indexes) {
45
+ const indexMigration = this.generateIndexMigration(change, diff.tableName);
46
+ up.push(...indexMigration.up);
47
+ if (opts.generateDown) {
48
+ down.push(...indexMigration.down);
49
+ }
50
+ }
51
+ // Process constraint changes
52
+ for (const change of constraints) {
53
+ const constraintMigration = this.generateConstraintMigration(change, diff.tableName);
54
+ up.push(...constraintMigration.up);
55
+ if (opts.generateDown) {
56
+ down.push(...constraintMigration.down);
57
+ }
58
+ }
59
+ // Process foreign key changes
60
+ for (const change of foreignKeys) {
61
+ const fkMigration = this.generateForeignKeyMigration(change, diff.tableName);
62
+ up.push(...fkMigration.up);
63
+ if (opts.generateDown) {
64
+ down.push(...fkMigration.down);
65
+ }
66
+ }
67
+ // Generate migration name
68
+ const timestamp = Date.now();
69
+ const migrationName = `${opts.namePrefix}_${timestamp}_${diff.tableName}`;
70
+ return {
71
+ name: migrationName,
72
+ up,
73
+ down: opts.generateDown ? down.reverse() : [],
74
+ modelName: diff.modelName,
75
+ tableName: diff.tableName,
76
+ generatedAt: new Date(),
77
+ };
78
+ }
79
+ /**
80
+ * Generate migration scripts for all schema diffs
81
+ */
82
+ generateAllMigrations(diffs, options) {
83
+ return diffs.map((diff) => this.generateMigration(diff, options));
84
+ }
85
+ // ==================== Private Helper Methods ====================
86
+ /**
87
+ * Generate column migration statements
88
+ */
89
+ generateColumnMigration(change, tableName) {
90
+ const up = [];
91
+ const down = [];
92
+ switch (change.changeType) {
93
+ case 'create':
94
+ if (change.modelDefinition) {
95
+ const addColumnSql = this.generateAddColumnSql(tableName, change.modelDefinition);
96
+ up.push(addColumnSql);
97
+ down.push(`ALTER TABLE ${this.quoteTableName(tableName)} DROP COLUMN ${this.quoteIdentifier(change.columnName)};`);
98
+ }
99
+ break;
100
+ case 'modify':
101
+ if (change.modelDefinition && change.changedProperties) {
102
+ for (const prop of change.changedProperties) {
103
+ const modifySql = this.generateModifyColumnSql(tableName, change.columnName, change.modelDefinition, prop);
104
+ if (modifySql) {
105
+ up.push(modifySql);
106
+ }
107
+ }
108
+ // For down, we would need the original definition - simplified here
109
+ down.push(`-- Reverse modification for ${change.columnName}`);
110
+ }
111
+ break;
112
+ case 'delete':
113
+ if (change.databaseDefinition) {
114
+ up.push(`ALTER TABLE ${this.quoteTableName(tableName)} DROP COLUMN ${this.quoteIdentifier(change.columnName)};`);
115
+ const recreateSql = this.generateAddColumnSql(tableName, {
116
+ name: change.columnName,
117
+ typeString: change.databaseDefinition.type,
118
+ allowNull: change.databaseDefinition.allowNull,
119
+ defaultValue: change.databaseDefinition.defaultValue,
120
+ primaryKey: change.databaseDefinition.primaryKey,
121
+ autoIncrement: change.databaseDefinition.autoIncrement,
122
+ unique: false,
123
+ });
124
+ down.push(recreateSql);
125
+ }
126
+ break;
127
+ }
128
+ return { up, down };
129
+ }
130
+ /**
131
+ * Generate index migration statements
132
+ */
133
+ generateIndexMigration(change, tableName) {
134
+ const up = [];
135
+ const down = [];
136
+ switch (change.changeType) {
137
+ case 'create':
138
+ if (change.modelDefinition) {
139
+ const indexSql = this.generateCreateIndexSql(tableName, change.indexName, change.modelDefinition);
140
+ up.push(indexSql);
141
+ down.push(`DROP INDEX ${this.quoteIdentifier(change.indexName)};`);
142
+ }
143
+ break;
144
+ case 'modify':
145
+ // For modify, we drop and recreate
146
+ if (change.modelDefinition && change.databaseDefinition) {
147
+ up.push(`DROP INDEX ${this.quoteIdentifier(change.indexName)};`);
148
+ up.push(this.generateCreateIndexSql(tableName, change.indexName, change.modelDefinition));
149
+ down.push(`DROP INDEX ${this.quoteIdentifier(change.indexName)};`);
150
+ if (change.databaseDefinition) {
151
+ down.push(this.generateCreateIndexSql(tableName, change.indexName, change.databaseDefinition));
152
+ }
153
+ }
154
+ break;
155
+ case 'delete':
156
+ if (change.databaseDefinition && !change.databaseDefinition.primary) {
157
+ up.push(`DROP INDEX ${this.quoteIdentifier(change.indexName)};`);
158
+ const recreateSql = this.generateCreateIndexSql(tableName, change.indexName, {
159
+ name: change.indexName,
160
+ unique: change.databaseDefinition.unique,
161
+ fields: change.databaseDefinition.fields,
162
+ });
163
+ down.push(recreateSql);
164
+ }
165
+ break;
166
+ }
167
+ return { up, down };
168
+ }
169
+ /**
170
+ * Generate constraint migration statements
171
+ */
172
+ generateConstraintMigration(change, tableName) {
173
+ const up = [];
174
+ const down = [];
175
+ switch (change.changeType) {
176
+ case 'create':
177
+ if (change.modelDefinition) {
178
+ const constraintSql = this.generateAddConstraintSql(tableName, change.constraintName, change.modelDefinition);
179
+ up.push(constraintSql);
180
+ down.push(`ALTER TABLE ${this.quoteTableName(tableName)} DROP CONSTRAINT ${this.quoteIdentifier(change.constraintName)};`);
181
+ }
182
+ break;
183
+ case 'delete':
184
+ if (change.databaseDefinition) {
185
+ up.push(`ALTER TABLE ${this.quoteTableName(tableName)} DROP CONSTRAINT ${this.quoteIdentifier(change.constraintName)};`);
186
+ const recreateSql = this.generateAddConstraintSql(tableName, change.constraintName, {
187
+ name: change.constraintName,
188
+ type: change.databaseDefinition.type,
189
+ fields: change.databaseDefinition.fields || [],
190
+ });
191
+ down.push(recreateSql);
192
+ }
193
+ break;
194
+ }
195
+ return { up, down };
196
+ }
197
+ /**
198
+ * Generate foreign key migration statements
199
+ */
200
+ generateForeignKeyMigration(change, tableName) {
201
+ const up = [];
202
+ const down = [];
203
+ switch (change.changeType) {
204
+ case 'create':
205
+ if (change.modelDefinition) {
206
+ const fkSql = this.generateAddForeignKeySql(tableName, change.constraintName, change.modelDefinition);
207
+ up.push(fkSql);
208
+ down.push(`ALTER TABLE ${this.quoteTableName(tableName)} DROP FOREIGN KEY ${this.quoteIdentifier(change.constraintName)};`);
209
+ }
210
+ break;
211
+ case 'delete':
212
+ if (change.databaseDefinition) {
213
+ up.push(`ALTER TABLE ${this.quoteTableName(tableName)} DROP FOREIGN KEY ${this.quoteIdentifier(change.constraintName)};`);
214
+ const recreateSql = this.generateAddForeignKeySql(tableName, change.constraintName, {
215
+ name: change.constraintName,
216
+ fields: change.databaseDefinition.fields,
217
+ references: change.databaseDefinition.references,
218
+ });
219
+ down.push(recreateSql);
220
+ }
221
+ break;
222
+ }
223
+ return { up, down };
224
+ }
225
+ /**
226
+ * Generate ADD COLUMN SQL
227
+ */
228
+ generateAddColumnSql(tableName, column) {
229
+ let sql = `ALTER TABLE ${this.quoteTableName(tableName)} ADD COLUMN ${this.quoteIdentifier(column.name)} ${column.typeString}`;
230
+ if (!column.allowNull) {
231
+ sql += ' NOT NULL';
232
+ }
233
+ if (column.defaultValue !== undefined && column.defaultValue !== null) {
234
+ sql += ` DEFAULT ${this.formatDefaultValue(column.defaultValue)}`;
235
+ }
236
+ if (column.autoIncrement) {
237
+ // Auto increment is handled by the dialect
238
+ }
239
+ if (column.unique && typeof column.unique === 'string') {
240
+ sql += ` UNIQUE`;
241
+ }
242
+ sql += ';';
243
+ return sql;
244
+ }
245
+ /**
246
+ * Generate MODIFY COLUMN SQL
247
+ */
248
+ generateModifyColumnSql(tableName, columnName, column, property) {
249
+ const dialectName = this.dialect.name;
250
+ switch (property) {
251
+ case 'type':
252
+ if (dialectName === 'mysql' || dialectName === 'mariadb') {
253
+ return `ALTER TABLE ${this.quoteTableName(tableName)} MODIFY COLUMN ${this.quoteIdentifier(columnName)} ${column.typeString};`;
254
+ }
255
+ else {
256
+ return `ALTER TABLE ${this.quoteTableName(tableName)} ALTER COLUMN ${this.quoteIdentifier(columnName)} TYPE ${column.typeString};`;
257
+ }
258
+ case 'allowNull':
259
+ if (dialectName === 'mysql' || dialectName === 'mariadb') {
260
+ return column.allowNull
261
+ ? `ALTER TABLE ${this.quoteTableName(tableName)} MODIFY COLUMN ${this.quoteIdentifier(columnName)} ${column.typeString} NULL;`
262
+ : `ALTER TABLE ${this.quoteTableName(tableName)} MODIFY COLUMN ${this.quoteIdentifier(columnName)} ${column.typeString} NOT NULL;`;
263
+ }
264
+ else {
265
+ return column.allowNull
266
+ ? `ALTER TABLE ${this.quoteTableName(tableName)} ALTER COLUMN ${this.quoteIdentifier(columnName)} DROP NOT NULL;`
267
+ : `ALTER TABLE ${this.quoteTableName(tableName)} ALTER COLUMN ${this.quoteIdentifier(columnName)} SET NOT NULL;`;
268
+ }
269
+ case 'defaultValue':
270
+ if (column.defaultValue === null || column.defaultValue === undefined) {
271
+ return `ALTER TABLE ${this.quoteTableName(tableName)} ALTER COLUMN ${this.quoteIdentifier(columnName)} DROP DEFAULT;`;
272
+ }
273
+ else {
274
+ return `ALTER TABLE ${this.quoteTableName(tableName)} ALTER COLUMN ${this.quoteIdentifier(columnName)} SET DEFAULT ${this.formatDefaultValue(column.defaultValue)};`;
275
+ }
276
+ default:
277
+ return null;
278
+ }
279
+ }
280
+ /**
281
+ * Generate CREATE INDEX SQL
282
+ */
283
+ generateCreateIndexSql(tableName, indexName, index) {
284
+ const uniqueStr = index.unique ? 'UNIQUE ' : '';
285
+ const fieldsStr = index.fields.map((f) => this.quoteIdentifier(f)).join(', ');
286
+ return `CREATE ${uniqueStr}INDEX ${this.quoteIdentifier(indexName)} ON ${this.quoteTableName(tableName)} (${fieldsStr});`;
287
+ }
288
+ /**
289
+ * Generate ADD CONSTRAINT SQL
290
+ */
291
+ generateAddConstraintSql(tableName, constraintName, constraint) {
292
+ const fieldsStr = constraint.fields.map((f) => this.quoteIdentifier(f)).join(', ');
293
+ switch (constraint.type) {
294
+ case 'PRIMARY KEY':
295
+ return `ALTER TABLE ${this.quoteTableName(tableName)} ADD CONSTRAINT ${this.quoteIdentifier(constraintName)} PRIMARY KEY (${fieldsStr});`;
296
+ case 'UNIQUE':
297
+ return `ALTER TABLE ${this.quoteTableName(tableName)} ADD CONSTRAINT ${this.quoteIdentifier(constraintName)} UNIQUE (${fieldsStr});`;
298
+ case 'CHECK':
299
+ return `ALTER TABLE ${this.quoteTableName(tableName)} ADD CONSTRAINT ${this.quoteIdentifier(constraintName)} CHECK (${constraint.check || '1=1'});`;
300
+ default:
301
+ return `-- Unknown constraint type: ${constraint.type}`;
302
+ }
303
+ }
304
+ /**
305
+ * Generate ADD FOREIGN KEY SQL
306
+ */
307
+ generateAddForeignKeySql(tableName, constraintName, fk) {
308
+ const fieldsStr = fk.fields.map((f) => this.quoteIdentifier(f)).join(', ');
309
+ const refFieldsStr = fk.references.fields.map((f) => this.quoteIdentifier(f)).join(', ');
310
+ let sql = `ALTER TABLE ${this.quoteTableName(tableName)} ADD CONSTRAINT ${this.quoteIdentifier(constraintName)} `;
311
+ sql += `FOREIGN KEY (${fieldsStr}) REFERENCES ${this.quoteTableName(fk.references.table)} (${refFieldsStr})`;
312
+ if (fk.references.onDelete) {
313
+ sql += ` ON DELETE ${fk.references.onDelete}`;
314
+ }
315
+ if (fk.references.onUpdate) {
316
+ sql += ` ON UPDATE ${fk.references.onUpdate}`;
317
+ }
318
+ sql += ';';
319
+ return sql;
320
+ }
321
+ /**
322
+ * Quote table name based on dialect
323
+ */
324
+ quoteTableName(tableName) {
325
+ const dialectName = this.dialect.name;
326
+ if (dialectName === 'mssql') {
327
+ return `[${tableName}]`;
328
+ }
329
+ return `"${tableName}"`;
330
+ }
331
+ /**
332
+ * Quote identifier based on dialect
333
+ */
334
+ quoteIdentifier(identifier) {
335
+ const dialectName = this.dialect.name;
336
+ if (dialectName === 'mssql') {
337
+ return `[${identifier}]`;
338
+ }
339
+ return `"${identifier}"`;
340
+ }
341
+ /**
342
+ * Format default value for SQL
343
+ */
344
+ formatDefaultValue(value) {
345
+ if (value === null) {
346
+ return 'NULL';
347
+ }
348
+ if (typeof value === 'string') {
349
+ return `'${value.replace(/'/g, "''")}'`;
350
+ }
351
+ if (typeof value === 'boolean') {
352
+ return value ? 'TRUE' : 'FALSE';
353
+ }
354
+ if (typeof value === 'number') {
355
+ return String(value);
356
+ }
357
+ // Handle special values like CURRENT_TIMESTAMP
358
+ if (typeof value === 'object' && value !== null) {
359
+ // Check for prorm special values like Prorm.NOW
360
+ const valStr = String(value);
361
+ if (valStr.includes('NOW') || valStr.includes('CURRENT_TIMESTAMP')) {
362
+ return valStr;
363
+ }
364
+ }
365
+ return String(value);
366
+ }
367
+ }
368
+ exports.MigrationGenerator = MigrationGenerator;
369
+ /**
370
+ * Create a MigrationGenerator instance
371
+ */
372
+ function createMigrationGenerator(dialect, options) {
373
+ return new MigrationGenerator(dialect, options);
374
+ }