ts-prorm-orm 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1111 -0
- package/LICENSE +21 -0
- package/README.md +573 -0
- package/dist/audit/history-query.js +180 -0
- package/dist/audit/index.js +23 -0
- package/dist/audit/logger.js +236 -0
- package/dist/cache/cache-manager.js +84 -0
- package/dist/cache/index.js +16 -0
- package/dist/cache/redis-cluster-cache.js +557 -0
- package/dist/cli.js +2200 -0
- package/dist/compliance/audit-trail.js +68 -0
- package/dist/compliance/backup-verification.js +685 -0
- package/dist/compliance/breach-detector.js +505 -0
- package/dist/compliance/consent-record.js +227 -0
- package/dist/compliance/consent-versioning.js +331 -0
- package/dist/compliance/cross-border-log.js +530 -0
- package/dist/compliance/data-classifier.js +258 -0
- package/dist/compliance/data-lineage.js +565 -0
- package/dist/compliance/data-masker.js +303 -0
- package/dist/compliance/data-portability.js +265 -0
- package/dist/compliance/data-retention.js +195 -0
- package/dist/compliance/dsar-workflow.js +342 -0
- package/dist/compliance/field-encryption.js +223 -0
- package/dist/compliance/immutable-record.js +148 -0
- package/dist/compliance/index.js +260 -0
- package/dist/compliance/privacy-impact-assessment.js +364 -0
- package/dist/compliance/pseudonymization.js +269 -0
- package/dist/compliance/query-firewall.js +1182 -0
- package/dist/compliance/rate-limiter.js +580 -0
- package/dist/compliance/right-to-erasure.js +117 -0
- package/dist/compliance/row-level-security.js +246 -0
- package/dist/compliance/security-decorator.js +574 -0
- package/dist/compliance/security-monitor.js +525 -0
- package/dist/compliance/sensitive-data-discovery.js +476 -0
- package/dist/compliance/session-isolation.js +472 -0
- package/dist/compliance/tls-enforcer.js +108 -0
- package/dist/compliance/worm-storage.js +712 -0
- package/dist/connection-manager.js +198 -0
- package/dist/connection-pool.js +519 -0
- package/dist/decorators/audit.js +136 -0
- package/dist/decorators/belongs-to-many.js +115 -0
- package/dist/decorators/belongs-to.js +115 -0
- package/dist/decorators/check.js +435 -0
- package/dist/decorators/collate.js +329 -0
- package/dist/decorators/comment.js +205 -0
- package/dist/decorators/database-settings.js +236 -0
- package/dist/decorators/default.js +244 -0
- package/dist/decorators/encryption.js +235 -0
- package/dist/decorators/engine.js +97 -0
- package/dist/decorators/fk-constraints.js +594 -0
- package/dist/decorators/foreign-table.js +136 -0
- package/dist/decorators/generated.js +274 -0
- package/dist/decorators/has-many.js +127 -0
- package/dist/decorators/has-one.js +116 -0
- package/dist/decorators/hstore.js +129 -0
- package/dist/decorators/index.js +355 -0
- package/dist/decorators/json-column.js +83 -0
- package/dist/decorators/jsonb.js +101 -0
- package/dist/decorators/orm-decorators.js +425 -0
- package/dist/decorators/permissions.js +294 -0
- package/dist/decorators/procedure.js +210 -0
- package/dist/decorators/query-options.js +556 -0
- package/dist/decorators/range.js +167 -0
- package/dist/decorators/set-column.js +83 -0
- package/dist/decorators/spatial.js +114 -0
- package/dist/decorators/storage.js +580 -0
- package/dist/decorators/timezone.js +512 -0
- package/dist/decorators/trigger.js +90 -0
- package/dist/decorators/uuid.js +135 -0
- package/dist/decorators/view.js +258 -0
- package/dist/diagrams/chen-diagram.js +354 -0
- package/dist/diagrams/class-diagram.js +384 -0
- package/dist/diagrams/dependency-diagram.js +432 -0
- package/dist/diagrams/er-diagram.js +605 -0
- package/dist/diagrams/flow-diagram.js +394 -0
- package/dist/diagrams/gantt-diagram.js +411 -0
- package/dist/diagrams/index-diagram.js +353 -0
- package/dist/diagrams/index.js +184 -0
- package/dist/diagrams/migration-diagram.js +316 -0
- package/dist/diagrams/model-diagram.js +616 -0
- package/dist/diagrams/package-diagram.js +376 -0
- package/dist/diagrams/palette.js +85 -0
- package/dist/diagrams/relational-diagram.js +455 -0
- package/dist/diagrams/schemadoc-diagram.js +309 -0
- package/dist/diagrams/sequence-diagram.js +307 -0
- package/dist/diagrams/state-diagram.js +344 -0
- package/dist/diagrams/svg-dom.js +111 -0
- package/dist/diagrams/tree-diagram.js +250 -0
- package/dist/dialects/clickhouse/index.js +1742 -0
- package/dist/dialects/cockroachdb/index.js +4677 -0
- package/dist/dialects/cratedb/index.js +441 -0
- package/dist/dialects/databricks/index.js +517 -0
- package/dist/dialects/db2/index.js +2225 -0
- package/dist/dialects/dialect.js +720 -0
- package/dist/dialects/duckdb/index.js +2014 -0
- package/dist/dialects/exasol/index.js +357 -0
- package/dist/dialects/firebird/index.js +495 -0
- package/dist/dialects/greenplum/index.js +457 -0
- package/dist/dialects/hana/index.js +1741 -0
- package/dist/dialects/mariadb/index.js +3590 -0
- package/dist/dialects/mssql/index.js +2296 -0
- package/dist/dialects/mysql/index.js +4058 -0
- package/dist/dialects/oracle/index.js +2999 -0
- package/dist/dialects/postgres/index.js +5319 -0
- package/dist/dialects/query-stream-helper.js +152 -0
- package/dist/dialects/questdb/index.js +433 -0
- package/dist/dialects/redshift/index.js +2277 -0
- package/dist/dialects/singlestore/index.js +354 -0
- package/dist/dialects/snowflake/index.js +2082 -0
- package/dist/dialects/spanner/index.js +1768 -0
- package/dist/dialects/sqlite/index.js +3382 -0
- package/dist/dialects/tidb/index.js +377 -0
- package/dist/dialects/timescaledb/index.js +164 -0
- package/dist/dialects/trino/index.js +420 -0
- package/dist/dialects/turso/index.js +227 -0
- package/dist/dialects/vertica/index.js +317 -0
- package/dist/dialects/yugabytedb/index.js +424 -0
- package/dist/errors/index.js +472 -0
- package/dist/errors/utils.js +340 -0
- package/dist/errors.js +21 -0
- package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
- package/dist/extensions/catalog/mssql-features.js +147 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
- package/dist/extensions/catalog/oracle-db2-features.js +196 -0
- package/dist/extensions/catalog/postgres-extensions.js +516 -0
- package/dist/extensions/index.js +71 -0
- package/dist/extensions/types.js +13 -0
- package/dist/foreign-data.js +173 -0
- package/dist/hooks/hooks-manager.js +350 -0
- package/dist/hooks/index.js +37 -0
- package/dist/index.js +463 -0
- package/dist/logging.js +335 -0
- package/dist/migrations/index.js +40 -0
- package/dist/migrations/migration.js +196 -0
- package/dist/migrations/migrator.js +411 -0
- package/dist/migrations/prormmigration.js +275 -0
- package/dist/migrations/query-interface.js +435 -0
- package/dist/migrations/seeder.js +353 -0
- package/dist/models/associations.js +852 -0
- package/dist/models/constraints.js +288 -0
- package/dist/models/data-types.js +2518 -0
- package/dist/models/decorators.js +445 -0
- package/dist/models/index.js +33 -0
- package/dist/models/indexes.js +531 -0
- package/dist/models/methods.js +382 -0
- package/dist/models/model-manager.js +103 -0
- package/dist/models/model.js +5349 -0
- package/dist/models/operators.js +67 -0
- package/dist/models/scopes.js +189 -0
- package/dist/models/typescript-types.js +26 -0
- package/dist/nosql/aerospike/index.js +205 -0
- package/dist/nosql/allegrograph/index.js +169 -0
- package/dist/nosql/arangodb/index.js +364 -0
- package/dist/nosql/azure-blob/index.js +206 -0
- package/dist/nosql/beanstalkd/index.js +231 -0
- package/dist/nosql/beequeue/index.js +210 -0
- package/dist/nosql/bigchaindb/index.js +195 -0
- package/dist/nosql/bigtable/index.js +224 -0
- package/dist/nosql/blazegraph/index.js +173 -0
- package/dist/nosql/bullmq/index.js +191 -0
- package/dist/nosql/cassandra/index.js +174 -0
- package/dist/nosql/chroma/index.js +190 -0
- package/dist/nosql/cloudflare-kv/index.js +220 -0
- package/dist/nosql/coherence/index.js +200 -0
- package/dist/nosql/cosmosdb/index.js +157 -0
- package/dist/nosql/couchbase/index.js +213 -0
- package/dist/nosql/dax/index.js +212 -0
- package/dist/nosql/deno-kv/index.js +206 -0
- package/dist/nosql/dgraph/index.js +171 -0
- package/dist/nosql/doris/index.js +169 -0
- package/dist/nosql/druid/index.js +162 -0
- package/dist/nosql/dynamodb/index.js +937 -0
- package/dist/nosql/elasticsearch/index.js +377 -0
- package/dist/nosql/etcd/index.js +502 -0
- package/dist/nosql/eventhubs/index.js +213 -0
- package/dist/nosql/eventstore/index.js +254 -0
- package/dist/nosql/faunadb/index.js +188 -0
- package/dist/nosql/firestore/index.js +177 -0
- package/dist/nosql/fluree/index.js +148 -0
- package/dist/nosql/fuseki/index.js +170 -0
- package/dist/nosql/gcs/index.js +172 -0
- package/dist/nosql/gearman/index.js +160 -0
- package/dist/nosql/geode/index.js +196 -0
- package/dist/nosql/graphdb/index.js +169 -0
- package/dist/nosql/graylog/index.js +188 -0
- package/dist/nosql/gridgain/index.js +171 -0
- package/dist/nosql/hazelcast/index.js +162 -0
- package/dist/nosql/hbase/index.js +230 -0
- package/dist/nosql/ignite/index.js +173 -0
- package/dist/nosql/immudb/index.js +184 -0
- package/dist/nosql/index.js +232 -0
- package/dist/nosql/infinispan/index.js +200 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.js +234 -0
- package/dist/nosql/keyspaces/index.js +189 -0
- package/dist/nosql/kinesis/index.js +253 -0
- package/dist/nosql/leveldb/index.js +153 -0
- package/dist/nosql/lmdb/index.js +160 -0
- package/dist/nosql/loki/index.js +201 -0
- package/dist/nosql/marklogic/index.js +204 -0
- package/dist/nosql/materialize/index.js +145 -0
- package/dist/nosql/meilisearch/index.js +154 -0
- package/dist/nosql/memcached/index.js +223 -0
- package/dist/nosql/milvus/index.js +410 -0
- package/dist/nosql/minio/index.js +265 -0
- package/dist/nosql/momento/index.js +179 -0
- package/dist/nosql/mongodb/index.js +461 -0
- package/dist/nosql/nats/index.js +247 -0
- package/dist/nosql/nedb/index.js +164 -0
- package/dist/nosql/neo4j/index.js +450 -0
- package/dist/nosql/neptune/index.js +470 -0
- package/dist/nosql/nsq/index.js +200 -0
- package/dist/nosql/opensearch/index.js +186 -0
- package/dist/nosql/orientdb/index.js +175 -0
- package/dist/nosql/papertrail/index.js +200 -0
- package/dist/nosql/pinecone/index.js +0 -0
- package/dist/nosql/pinot/index.js +133 -0
- package/dist/nosql/pouchdb/index.js +172 -0
- package/dist/nosql/prometheus/index.js +174 -0
- package/dist/nosql/provendb/index.js +147 -0
- package/dist/nosql/pubsub/index.js +187 -0
- package/dist/nosql/pulsar/index.js +232 -0
- package/dist/nosql/qdrant/index.js +295 -0
- package/dist/nosql/qldb/index.js +192 -0
- package/dist/nosql/r2/index.js +281 -0
- package/dist/nosql/rabbitmq/index.js +237 -0
- package/dist/nosql/ravendb/index.js +175 -0
- package/dist/nosql/redis/index.js +607 -0
- package/dist/nosql/redpanda/index.js +237 -0
- package/dist/nosql/resque/index.js +203 -0
- package/dist/nosql/rethinkdb/index.js +232 -0
- package/dist/nosql/rocksdb/index.js +152 -0
- package/dist/nosql/rockset/index.js +126 -0
- package/dist/nosql/s3/index.js +298 -0
- package/dist/nosql/scylladb/index.js +178 -0
- package/dist/nosql/signoz/index.js +227 -0
- package/dist/nosql/sns/index.js +201 -0
- package/dist/nosql/solr/index.js +231 -0
- package/dist/nosql/splunk/index.js +227 -0
- package/dist/nosql/sqs/index.js +246 -0
- package/dist/nosql/stardog/index.js +169 -0
- package/dist/nosql/starrocks/index.js +170 -0
- package/dist/nosql/store.js +2 -0
- package/dist/nosql/sumologic/index.js +213 -0
- package/dist/nosql/surrealdb/index.js +179 -0
- package/dist/nosql/terminusdb/index.js +151 -0
- package/dist/nosql/tigergraph/index.js +469 -0
- package/dist/nosql/typesense/index.js +148 -0
- package/dist/nosql/unqlite/index.js +157 -0
- package/dist/nosql/upstash/index.js +167 -0
- package/dist/nosql/vercel-kv/index.js +166 -0
- package/dist/nosql/victoriametrics/index.js +213 -0
- package/dist/nosql/virtuoso/index.js +169 -0
- package/dist/nosql/weaviate/index.js +276 -0
- package/dist/operators/index.js +108 -0
- package/dist/operators.js +2690 -0
- package/dist/prisma-migrate/index.js +38 -0
- package/dist/prisma-migrate/migration-generator.js +125 -0
- package/dist/prisma-migrate/model-generator.js +172 -0
- package/dist/prisma-migrate/relations.js +100 -0
- package/dist/prisma-migrate/schema-parser.js +167 -0
- package/dist/prisma-migrate/type-mapper.js +40 -0
- package/dist/prorm.js +6832 -0
- package/dist/query-builders/cte-builder.js +80 -0
- package/dist/query-builders/functions/aggregate.js +390 -0
- package/dist/query-builders/functions/conditional.js +503 -0
- package/dist/query-builders/functions/datetime.js +695 -0
- package/dist/query-builders/functions/fulltext.js +439 -0
- package/dist/query-builders/functions/index.js +93 -0
- package/dist/query-builders/functions/json.js +427 -0
- package/dist/query-builders/functions/math.js +399 -0
- package/dist/query-builders/functions/string.js +518 -0
- package/dist/query-builders/functions/window.js +328 -0
- package/dist/query-builders/include-builder.js +323 -0
- package/dist/query-builders/index-expression-builder.js +242 -0
- package/dist/query-builders/index.js +161 -0
- package/dist/query-builders/insert-builder.js +164 -0
- package/dist/query-builders/model-helpers.js +38 -0
- package/dist/query-builders/order-limit-builder.js +239 -0
- package/dist/query-builders/sql-compiler.js +2040 -0
- package/dist/query-builders/subquery-builder.js +152 -0
- package/dist/query-builders/update-builder.js +182 -0
- package/dist/query-builders/view-builder.js +218 -0
- package/dist/query-builders/where-builder.js +1532 -0
- package/dist/query-interface.js +622 -0
- package/dist/query-optimizers/batch-optimizer.js +426 -0
- package/dist/query-optimizers/explain-plans.js +415 -0
- package/dist/query-optimizers/index.js +51 -0
- package/dist/query-optimizers/prepared-statement-cache.js +423 -0
- package/dist/query-optimizers/query-hints.js +438 -0
- package/dist/query-optimizers/query-optimizer.js +278 -0
- package/dist/query-optimizers/slow-query-logger.js +271 -0
- package/dist/replica-manager.js +507 -0
- package/dist/schema/index.js +15 -0
- package/dist/schema/migration-generator.js +374 -0
- package/dist/schema/schema-differ.js +549 -0
- package/dist/schema/types.js +6 -0
- package/dist/sql-constants.js +300 -0
- package/dist/sqlite-advanced.js +1047 -0
- package/dist/streams/index.js +12 -0
- package/dist/streams/transforms.js +178 -0
- package/dist/transaction.js +456 -0
- package/dist/types/index.js +180 -0
- package/dist/user-management.js +127 -0
- package/dist/utils/date.js +300 -0
- package/dist/utils/index.js +1079 -0
- package/dist/utils/string.js +161 -0
- package/dist/validators/index.js +19 -0
- package/dist/validators/validator.js +911 -0
- package/package.json +190 -0
|
@@ -0,0 +1,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
|
+
}
|