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,288 @@
1
+ "use strict";
2
+ /**
3
+ * Constraint management for the TypeScript ORM
4
+ * Handles constraint creation for PRIMARY KEY, UNIQUE, FOREIGN KEY, and CHECK constraints
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ConstraintCollection = exports.Constraint = void 0;
8
+ exports.generateConstraintName = generateConstraintName;
9
+ exports.buildPrimaryKeyConstraint = buildPrimaryKeyConstraint;
10
+ exports.buildUniqueConstraint = buildUniqueConstraint;
11
+ exports.buildForeignKeyConstraint = buildForeignKeyConstraint;
12
+ exports.buildCheckConstraint = buildCheckConstraint;
13
+ exports.buildConstraintSQL = buildConstraintSQL;
14
+ exports.normalizeConstraintFields = normalizeConstraintFields;
15
+ exports.primaryKey = primaryKey;
16
+ exports.unique = unique;
17
+ exports.foreignKey = foreignKey;
18
+ exports.check = check;
19
+ /**
20
+ * Generate a unique constraint name
21
+ */
22
+ function generateConstraintName(type, tableName, fields) {
23
+ const typePrefix = type.toLowerCase().replace(' ', '_');
24
+ const fieldStr = fields.join('_');
25
+ const timestamp = Date.now().toString(36).slice(-4);
26
+ return `${typePrefix}_${tableName}_${fieldStr}_${timestamp}`;
27
+ }
28
+ /**
29
+ * Constraint class representing a database constraint
30
+ */
31
+ class Constraint {
32
+ constructor(options) {
33
+ // Support both name and constraintName
34
+ this.name = options.name || options.constraintName || '';
35
+ this.type = options.type;
36
+ this.fields = options.fields || [];
37
+ this.references = options.references;
38
+ this.where = options.where;
39
+ this.check = options.check;
40
+ this.deferrable = options.deferrable;
41
+ this.match = options.match;
42
+ this.tableName = options.tableName;
43
+ }
44
+ /**
45
+ * Get field names as string array
46
+ */
47
+ getFieldNames() {
48
+ if (this.fields.length === 0)
49
+ return [];
50
+ if (typeof this.fields[0] === 'string') {
51
+ return this.fields;
52
+ }
53
+ return this.fields.map((f) => f.name);
54
+ }
55
+ /**
56
+ * Check if this is a composite constraint
57
+ */
58
+ isComposite() {
59
+ return this.fields.length > 1;
60
+ }
61
+ /**
62
+ * Convert to plain object
63
+ */
64
+ toJSON() {
65
+ return {
66
+ name: this.name,
67
+ type: this.type,
68
+ fields: this.fields,
69
+ references: this.references,
70
+ where: this.where,
71
+ check: this.check,
72
+ deferrable: this.deferrable,
73
+ tableName: this.tableName,
74
+ };
75
+ }
76
+ }
77
+ exports.Constraint = Constraint;
78
+ /**
79
+ * Constraint collection for managing multiple constraints
80
+ */
81
+ class ConstraintCollection {
82
+ constructor() {
83
+ this.constraints = new Map();
84
+ }
85
+ /**
86
+ * Add a constraint to the collection
87
+ */
88
+ addConstraint(constraint) {
89
+ if (!constraint.name) {
90
+ throw new Error('Constraint must have a name');
91
+ }
92
+ this.constraints.set(constraint.name, constraint);
93
+ }
94
+ /**
95
+ * Get a constraint by name
96
+ */
97
+ getConstraint(name) {
98
+ return this.constraints.get(name);
99
+ }
100
+ /**
101
+ * Get all constraints
102
+ */
103
+ getAllConstraints() {
104
+ return Array.from(this.constraints.values());
105
+ }
106
+ /**
107
+ * Get constraints by type
108
+ */
109
+ getConstraintsByType(type) {
110
+ return this.getAllConstraints().filter((c) => c.type === type);
111
+ }
112
+ /**
113
+ * Remove a constraint by name
114
+ */
115
+ removeConstraint(name) {
116
+ return this.constraints.delete(name);
117
+ }
118
+ /**
119
+ * Check if a constraint exists
120
+ */
121
+ hasConstraint(name) {
122
+ return this.constraints.has(name);
123
+ }
124
+ /**
125
+ * Get the number of constraints
126
+ */
127
+ get size() {
128
+ return this.constraints.size;
129
+ }
130
+ /**
131
+ * Clear all constraints
132
+ */
133
+ clear() {
134
+ this.constraints.clear();
135
+ }
136
+ }
137
+ exports.ConstraintCollection = ConstraintCollection;
138
+ // ==================== Constraint Builders ====================
139
+ /**
140
+ * Escape an identifier for a specific dialect.
141
+ * MySQL/MariaDB use backticks by default; Postgres and SQLite use double quotes.
142
+ */
143
+ function escapeConstraintIdent(name, dialect = 'postgres') {
144
+ return dialect === 'mysql' || dialect === 'mariadb' ? `\`${name}\`` : `"${name}"`;
145
+ }
146
+ /**
147
+ * Build a primary key constraint
148
+ */
149
+ function buildPrimaryKeyConstraint(tableName, fields, constraintName, dialect = 'postgres') {
150
+ const name = constraintName || `pk_${tableName}`;
151
+ const fieldList = fields.map((f) => escapeConstraintIdent(f, dialect)).join(', ');
152
+ return `CONSTRAINT ${escapeConstraintIdent(name, dialect)} PRIMARY KEY (${fieldList})`;
153
+ }
154
+ /**
155
+ * Build a unique constraint
156
+ */
157
+ function buildUniqueConstraint(tableName, fields, constraintName, dialect = 'postgres') {
158
+ const name = constraintName || `uq_${tableName}_${fields.join('_')}`;
159
+ const fieldList = fields.map((f) => escapeConstraintIdent(f, dialect)).join(', ');
160
+ return `CONSTRAINT ${escapeConstraintIdent(name, dialect)} UNIQUE (${fieldList})`;
161
+ }
162
+ /**
163
+ * Build a foreign key constraint
164
+ */
165
+ function buildForeignKeyConstraint(tableName, fields, references, constraintName, dialect = 'postgres') {
166
+ const name = constraintName || `fk_${tableName}_${fields.join('_')}_${references.table}`;
167
+ const fieldList = fields.map((f) => escapeConstraintIdent(f, dialect)).join(', ');
168
+ // Handle composite key fields on referenced table
169
+ const refFields = references.fields && references.fields.length > 0 ? references.fields : [references.field];
170
+ const refFieldList = refFields.map((f) => escapeConstraintIdent(f, dialect)).join(', ');
171
+ let sql = `CONSTRAINT ${escapeConstraintIdent(name, dialect)} FOREIGN KEY (${fieldList}) REFERENCES ${escapeConstraintIdent(references.table, dialect)}(${refFieldList})`;
172
+ // Add MATCH clause (PostgreSQL)
173
+ if (references.match && references.match !== 'SIMPLE') {
174
+ sql += ` MATCH ${references.match}`;
175
+ }
176
+ if (references.onDelete) {
177
+ sql += ` ON DELETE ${references.onDelete}`;
178
+ }
179
+ if (references.onUpdate) {
180
+ sql += ` ON UPDATE ${references.onUpdate}`;
181
+ }
182
+ if (references.deferrable) {
183
+ sql += ` DEFERRABLE ${references.deferrable}`;
184
+ }
185
+ return sql;
186
+ }
187
+ /**
188
+ * Build a check constraint
189
+ */
190
+ function buildCheckConstraint(tableName, check, constraintName, dialect = 'postgres') {
191
+ const name = constraintName || `chk_${tableName}_${Date.now()}`;
192
+ return `CONSTRAINT ${escapeConstraintIdent(name, dialect)} CHECK (${check})`;
193
+ }
194
+ /**
195
+ * Build constraint SQL for a specific dialect
196
+ */
197
+ function buildConstraintSQL(dialect, constraint, tableName) {
198
+ const fields = constraint.getFieldNames();
199
+ switch (constraint.type) {
200
+ case 'PRIMARY KEY':
201
+ return buildPrimaryKeyConstraint(tableName, fields, constraint.name, dialect);
202
+ case 'UNIQUE':
203
+ return buildUniqueConstraint(tableName, fields, constraint.name, dialect);
204
+ case 'FOREIGN KEY':
205
+ if (!constraint.references) {
206
+ throw new Error('Foreign key constraint requires references');
207
+ }
208
+ return buildForeignKeyConstraint(tableName, fields, constraint.references, constraint.name, dialect);
209
+ case 'CHECK':
210
+ if (!constraint.check) {
211
+ throw new Error('Check constraint requires a check expression');
212
+ }
213
+ return buildCheckConstraint(tableName, constraint.check, constraint.name, dialect);
214
+ default:
215
+ throw new Error(`Unsupported constraint type: ${constraint.type}`);
216
+ }
217
+ }
218
+ /**
219
+ * Normalize fields to string array
220
+ */
221
+ function normalizeConstraintFields(fields) {
222
+ return fields.map((f) => {
223
+ if (typeof f === 'string') {
224
+ return f;
225
+ }
226
+ return f.name;
227
+ });
228
+ }
229
+ // ==================== Convenience Factory Methods ====================
230
+ /**
231
+ * Create a primary key constraint
232
+ */
233
+ function primaryKey(fields, options) {
234
+ const constraintName = options?.name || `pk_${options?.tableName || 'table'}`;
235
+ return new Constraint({
236
+ name: constraintName,
237
+ type: 'PRIMARY KEY',
238
+ fields,
239
+ tableName: options?.tableName,
240
+ });
241
+ }
242
+ /**
243
+ * Create a unique constraint
244
+ */
245
+ function unique(fields, options) {
246
+ const tableName = options?.tableName || 'table';
247
+ const fieldStr = Array.isArray(fields)
248
+ ? fields.map((f) => (typeof f === 'string' ? f : f.name)).join('_')
249
+ : '';
250
+ const constraintName = options?.name || `uq_${tableName}_${fieldStr}`;
251
+ return new Constraint({
252
+ name: constraintName,
253
+ type: 'UNIQUE',
254
+ fields,
255
+ tableName: options?.tableName,
256
+ });
257
+ }
258
+ /**
259
+ * Create a foreign key constraint
260
+ */
261
+ function foreignKey(fields, references, options) {
262
+ const tableName = options?.tableName || 'table';
263
+ const fieldStr = Array.isArray(fields)
264
+ ? fields.map((f) => (typeof f === 'string' ? f : f.name)).join('_')
265
+ : '';
266
+ const constraintName = options?.name || `fk_${tableName}_${fieldStr}_${references.table}`;
267
+ return new Constraint({
268
+ name: constraintName,
269
+ type: 'FOREIGN KEY',
270
+ fields,
271
+ references,
272
+ tableName: options?.tableName,
273
+ });
274
+ }
275
+ /**
276
+ * Create a check constraint
277
+ */
278
+ function check(check, options) {
279
+ const tableName = options?.tableName || 'table';
280
+ const constraintName = options?.name || `chk_${tableName}`;
281
+ return new Constraint({
282
+ name: constraintName,
283
+ type: 'CHECK',
284
+ fields: [],
285
+ check,
286
+ tableName: options?.tableName,
287
+ });
288
+ }