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,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database-level settings decorators for the ORM.
|
|
4
|
+
*
|
|
5
|
+
* Allows controlling database-level settings for models:
|
|
6
|
+
* - Foreign key checks (MySQL/MariaDB)
|
|
7
|
+
* - Unique checks
|
|
8
|
+
* - Autocommit
|
|
9
|
+
* - SQL mode
|
|
10
|
+
* - Other session-level settings
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
*
|
|
14
|
+
* // Disable FK checks for entire model
|
|
15
|
+
* @ForeignKeyChecks({ enabled: false })
|
|
16
|
+
* class ImportData extends Model {}
|
|
17
|
+
*
|
|
18
|
+
* // Disable FK checks at table level
|
|
19
|
+
* @Table({ foreignKeyChecks: false })
|
|
20
|
+
* class TempData extends Model {}
|
|
21
|
+
*
|
|
22
|
+
* // Set database-level settings
|
|
23
|
+
* @DatabaseSetting('unique_checks', false)
|
|
24
|
+
* @DatabaseSetting('autocommit', false)
|
|
25
|
+
* @DatabaseSetting('sql_mode', 'STRICT_TRANS_TABLES')
|
|
26
|
+
* class ImportData extends Model {}
|
|
27
|
+
*
|
|
28
|
+
* // In transaction
|
|
29
|
+
* await prorm.transaction(async () => {
|
|
30
|
+
* await prorm.setForeignKeyChecks(false);
|
|
31
|
+
* // Bulk import without FK validation
|
|
32
|
+
* await prorm.setForeignKeyChecks(true);
|
|
33
|
+
* });
|
|
34
|
+
*/
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ForeignKeyChecks = ForeignKeyChecks;
|
|
37
|
+
exports.DatabaseSetting = DatabaseSetting;
|
|
38
|
+
exports.getForeignKeyChecksSetting = getForeignKeyChecksSetting;
|
|
39
|
+
exports.getDatabaseSettings = getDatabaseSettings;
|
|
40
|
+
exports.isForeignKeyChecksDisabled = isForeignKeyChecksDisabled;
|
|
41
|
+
exports.getAllDatabaseSettings = getAllDatabaseSettings;
|
|
42
|
+
exports.generateSettingsSQL = generateSettingsSQL;
|
|
43
|
+
exports.createSettingsContext = createSettingsContext;
|
|
44
|
+
require("reflect-metadata");
|
|
45
|
+
// ==================== Metadata Keys ====================
|
|
46
|
+
const FOREIGN_KEY_CHECKS_KEY = Symbol('prorm:foreignKeyChecks');
|
|
47
|
+
const DATABASE_SETTINGS_KEY = Symbol('prorm:databaseSettings');
|
|
48
|
+
// ==================== Decorators ====================
|
|
49
|
+
/**
|
|
50
|
+
* Decorator to control foreign key checks for a model.
|
|
51
|
+
*
|
|
52
|
+
* Useful for bulk imports or data migrations where you need to
|
|
53
|
+
* temporarily disable FK validation.
|
|
54
|
+
*
|
|
55
|
+
* Usage:
|
|
56
|
+
*
|
|
57
|
+
* @ForeignKeyChecks({ enabled: false })
|
|
58
|
+
* class ImportData extends Model {
|
|
59
|
+
* // fields...
|
|
60
|
+
* }
|
|
61
|
+
*
|
|
62
|
+
* @param options - Foreign key check options
|
|
63
|
+
*/
|
|
64
|
+
function ForeignKeyChecks(options = { enabled: true }) {
|
|
65
|
+
return function (target) {
|
|
66
|
+
Reflect.defineMetadata(FOREIGN_KEY_CHECKS_KEY, { enabled: options.enabled ?? true, description: options.description }, target);
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Decorator to set database-level settings for a model.
|
|
71
|
+
*
|
|
72
|
+
* These settings are applied when the model is used and can control
|
|
73
|
+
* session-level database behavior.
|
|
74
|
+
*
|
|
75
|
+
* Usage:
|
|
76
|
+
*
|
|
77
|
+
* @DatabaseSetting('unique_checks', false)
|
|
78
|
+
* @DatabaseSetting('autocommit', false)
|
|
79
|
+
* @DatabaseSetting('sql_mode', 'STRICT_TRANS_TABLES')
|
|
80
|
+
* class ImportData extends Model {
|
|
81
|
+
* // fields...
|
|
82
|
+
* }
|
|
83
|
+
*
|
|
84
|
+
* @param name - The setting name
|
|
85
|
+
* @param value - The value to set
|
|
86
|
+
*/
|
|
87
|
+
function DatabaseSetting(name, value) {
|
|
88
|
+
return function (target) {
|
|
89
|
+
// Get existing settings
|
|
90
|
+
const settings = getDatabaseSettings(target.prototype) || {};
|
|
91
|
+
// Store the new setting
|
|
92
|
+
settings[name] = value;
|
|
93
|
+
Reflect.defineMetadata(DATABASE_SETTINGS_KEY, settings, target);
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// ==================== Helper Functions ====================
|
|
97
|
+
/**
|
|
98
|
+
* Get foreign key checks setting for a model.
|
|
99
|
+
*
|
|
100
|
+
* @param target - The target class or prototype
|
|
101
|
+
* @returns The foreign key checks setting or undefined
|
|
102
|
+
*/
|
|
103
|
+
function getForeignKeyChecksSetting(target) {
|
|
104
|
+
const metadata = Reflect.getMetadata(FOREIGN_KEY_CHECKS_KEY, target);
|
|
105
|
+
return metadata?.enabled;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get all database settings for a model.
|
|
109
|
+
*
|
|
110
|
+
* @param target - The target class or prototype
|
|
111
|
+
* @returns The database settings object
|
|
112
|
+
*/
|
|
113
|
+
function getDatabaseSettings(target) {
|
|
114
|
+
return Reflect.getMetadata(DATABASE_SETTINGS_KEY, target);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Check if foreign key checks are disabled for a model.
|
|
118
|
+
*
|
|
119
|
+
* @param target - The target class or prototype
|
|
120
|
+
* @returns True if FK checks are disabled
|
|
121
|
+
*/
|
|
122
|
+
function isForeignKeyChecksDisabled(target) {
|
|
123
|
+
return getForeignKeyChecksSetting(target) === false;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get all model database settings including inherited settings.
|
|
127
|
+
*
|
|
128
|
+
* Walks the prototype chain to collect all settings from parent classes.
|
|
129
|
+
*
|
|
130
|
+
* @param target - The target class or prototype
|
|
131
|
+
* @returns Combined database settings from all levels
|
|
132
|
+
*/
|
|
133
|
+
function getAllDatabaseSettings(target) {
|
|
134
|
+
const result = {
|
|
135
|
+
additionalSettings: {},
|
|
136
|
+
};
|
|
137
|
+
// Collect from prototype chain
|
|
138
|
+
let current = target;
|
|
139
|
+
while (current && current !== Object.prototype) {
|
|
140
|
+
const settings = getDatabaseSettings(current);
|
|
141
|
+
if (settings) {
|
|
142
|
+
if (settings.foreignKeyChecks !== undefined) {
|
|
143
|
+
result.foreignKeyChecks = settings.foreignKeyChecks;
|
|
144
|
+
}
|
|
145
|
+
if (settings.uniqueChecks !== undefined) {
|
|
146
|
+
result.uniqueChecks = settings.uniqueChecks;
|
|
147
|
+
}
|
|
148
|
+
if (settings.autocommit !== undefined) {
|
|
149
|
+
result.autocommit = settings.autocommit;
|
|
150
|
+
}
|
|
151
|
+
if (settings.sqlMode !== undefined) {
|
|
152
|
+
result.sqlMode = settings.sqlMode;
|
|
153
|
+
}
|
|
154
|
+
if (settings.additionalSettings) {
|
|
155
|
+
result.additionalSettings = {
|
|
156
|
+
...result.additionalSettings,
|
|
157
|
+
...settings.additionalSettings,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const fkSetting = getForeignKeyChecksSetting(current);
|
|
162
|
+
if (fkSetting !== undefined) {
|
|
163
|
+
result.foreignKeyChecks = fkSetting;
|
|
164
|
+
}
|
|
165
|
+
current = Object.getPrototypeOf(current);
|
|
166
|
+
}
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Generate SQL to apply database settings.
|
|
171
|
+
*
|
|
172
|
+
* @param settings - The database settings
|
|
173
|
+
* @returns Array of SQL statements to execute
|
|
174
|
+
*/
|
|
175
|
+
function generateSettingsSQL(settings) {
|
|
176
|
+
const statements = [];
|
|
177
|
+
if (settings.foreignKeyChecks !== undefined) {
|
|
178
|
+
statements.push(`SET FOREIGN_KEY_CHECKS = ${settings.foreignKeyChecks ? 1 : 0}`);
|
|
179
|
+
}
|
|
180
|
+
if (settings.uniqueChecks !== undefined) {
|
|
181
|
+
statements.push(`SET UNIQUE_CHECKS = ${settings.uniqueChecks ? 1 : 0}`);
|
|
182
|
+
}
|
|
183
|
+
if (settings.autocommit !== undefined) {
|
|
184
|
+
statements.push(`SET AUTOCOMMIT = ${settings.autocommit ? 1 : 0}`);
|
|
185
|
+
}
|
|
186
|
+
if (settings.sqlMode) {
|
|
187
|
+
statements.push(`SET SQL_MODE = '${settings.sqlMode}'`);
|
|
188
|
+
}
|
|
189
|
+
if (settings.additionalSettings) {
|
|
190
|
+
for (const [name, value] of Object.entries(settings.additionalSettings)) {
|
|
191
|
+
if (value !== null && value !== undefined) {
|
|
192
|
+
const valStr = typeof value === 'string' ? `'${value}'` : String(value);
|
|
193
|
+
statements.push(`SET ${name} = ${valStr}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return statements;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Create a context manager for temporarily changing database settings.
|
|
201
|
+
*
|
|
202
|
+
* Usage:
|
|
203
|
+
*
|
|
204
|
+
* const settingsManager = createSettingsContext({
|
|
205
|
+
* foreignKeyChecks: false,
|
|
206
|
+
* uniqueChecks: false
|
|
207
|
+
* });
|
|
208
|
+
*
|
|
209
|
+
* await settingsManager.execute(async () => {
|
|
210
|
+
* // Bulk insert without FK checks
|
|
211
|
+
* await Model.bulkCreate(data);
|
|
212
|
+
* });
|
|
213
|
+
*
|
|
214
|
+
* @param settings - Settings to apply during execution
|
|
215
|
+
* @returns Context manager with execute method
|
|
216
|
+
*/
|
|
217
|
+
function createSettingsContext(settings) {
|
|
218
|
+
return {
|
|
219
|
+
async execute(fn) {
|
|
220
|
+
// Generate and execute SET statements before
|
|
221
|
+
const beforeSQL = generateSettingsSQL(settings);
|
|
222
|
+
// Note: In practice, these would be executed via prorm.query()
|
|
223
|
+
// For now, we just execute the function
|
|
224
|
+
try {
|
|
225
|
+
return await fn();
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
// Could restore original settings here if needed
|
|
229
|
+
const afterSQL = generateSettingsSQL({});
|
|
230
|
+
// Note: In practice, restore settings here
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
// ==================== Exports ====================
|
|
236
|
+
// Types are exported inline with the interfaces/classes above
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Default Value Decorator for the ORM
|
|
4
|
+
*
|
|
5
|
+
* Provides a type-safe way to set column defaults without raw SQL.
|
|
6
|
+
* Supports static values, functions, sequences, and database functions.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
*
|
|
10
|
+
* // Static values
|
|
11
|
+
* @Default(18)
|
|
12
|
+
* age: number;
|
|
13
|
+
*
|
|
14
|
+
* @Default(true)
|
|
15
|
+
* isActive: boolean;
|
|
16
|
+
*
|
|
17
|
+
* @Default('pending')
|
|
18
|
+
* status: string;
|
|
19
|
+
*
|
|
20
|
+
* // Function for dynamic default
|
|
21
|
+
* @Default(() => new Date())
|
|
22
|
+
* createdAt: Date;
|
|
23
|
+
*
|
|
24
|
+
* // Auto-generate UUID
|
|
25
|
+
* @Default(() => uuidv4())
|
|
26
|
+
* id: string;
|
|
27
|
+
*
|
|
28
|
+
* // For JSON columns
|
|
29
|
+
* @Default({ role: 'user', verified: false })
|
|
30
|
+
* preferences: object;
|
|
31
|
+
*
|
|
32
|
+
* // For array columns
|
|
33
|
+
* @Default(['admin'])
|
|
34
|
+
* roles: string[];
|
|
35
|
+
*
|
|
36
|
+
* // Auto-sequences (PostgreSQL)
|
|
37
|
+
* @Default({ sequence: 'user_id_seq' })
|
|
38
|
+
* id: number;
|
|
39
|
+
*
|
|
40
|
+
* // Database functions
|
|
41
|
+
* @Default({ fn: 'now' })
|
|
42
|
+
* createdAt: Date;
|
|
43
|
+
*
|
|
44
|
+
* @Default({ fn: 'upper', args: ['username'] })
|
|
45
|
+
* username: string;
|
|
46
|
+
*
|
|
47
|
+
* // Raw SQL only when needed
|
|
48
|
+
* @Default({ literal: "CURRENT_TIMESTAMP" })
|
|
49
|
+
* updatedAt: Date;
|
|
50
|
+
*/
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.getDefaultFields = getDefaultFields;
|
|
53
|
+
exports.getDefaultForField = getDefaultForField;
|
|
54
|
+
exports.toPrormDefault = toPrormDefault;
|
|
55
|
+
exports.applyDefaultValues = applyDefaultValues;
|
|
56
|
+
exports.applyDefaultHooks = applyDefaultHooks;
|
|
57
|
+
exports.Default = Default;
|
|
58
|
+
exports.uuidDefault = uuidDefault;
|
|
59
|
+
exports.nowDefault = nowDefault;
|
|
60
|
+
exports.randomIntDefault = randomIntDefault;
|
|
61
|
+
exports.computedDefault = computedDefault;
|
|
62
|
+
// ==================== Metadata Storage ====================
|
|
63
|
+
const DEFAULT_FIELDS_KEY = '__orm_default_fields__';
|
|
64
|
+
/**
|
|
65
|
+
* Get all default field metadata from a model class.
|
|
66
|
+
*/
|
|
67
|
+
function getDefaultFields(target) {
|
|
68
|
+
return target[DEFAULT_FIELDS_KEY] || [];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get default value for a specific field.
|
|
72
|
+
*/
|
|
73
|
+
function getDefaultForField(target, field) {
|
|
74
|
+
const fields = getDefaultFields(target);
|
|
75
|
+
return fields.find((f) => f.field === field)?.options;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Convert @Default options to prorm column definition format.
|
|
79
|
+
* This is used when initializing the model.
|
|
80
|
+
*/
|
|
81
|
+
function toPrormDefault(options) {
|
|
82
|
+
// Handle static values
|
|
83
|
+
if (!isDefaultOptionsObject(options)) {
|
|
84
|
+
return { defaultValue: options };
|
|
85
|
+
}
|
|
86
|
+
// Handle function defaults
|
|
87
|
+
if ('fn' in options && typeof options.fn === 'function') {
|
|
88
|
+
return { defaultValue: options.fn() };
|
|
89
|
+
}
|
|
90
|
+
// Handle sequence (returns raw SQL for PostgreSQL)
|
|
91
|
+
if ('sequence' in options) {
|
|
92
|
+
return {
|
|
93
|
+
defaultValue: prorm_lite_literal(`nextval('${options.sequence}')`),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Handle database function
|
|
97
|
+
if ('fn' in options) {
|
|
98
|
+
const fnName = options.fn;
|
|
99
|
+
const args = options.args || [];
|
|
100
|
+
const argsStr = args.map((a) => (typeof a === 'string' ? `'${a}'` : a)).join(', ');
|
|
101
|
+
return {
|
|
102
|
+
defaultValue: prorm_lite_literal(`${fnName}(${argsStr})`),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Handle literal
|
|
106
|
+
if ('literal' in options) {
|
|
107
|
+
return { defaultValue: prorm_lite_literal(options.literal) };
|
|
108
|
+
}
|
|
109
|
+
return { defaultValue: undefined };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if value is a DefaultValueOptions object (not a primitive).
|
|
113
|
+
*/
|
|
114
|
+
function isDefaultOptionsObject(value) {
|
|
115
|
+
return (value !== null &&
|
|
116
|
+
typeof value === 'object' &&
|
|
117
|
+
(('fn' in value && typeof value.fn === 'function') ||
|
|
118
|
+
'sequence' in value ||
|
|
119
|
+
'fn' in value ||
|
|
120
|
+
'literal' in value));
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create a prorm.literal() wrapper.
|
|
124
|
+
* This is detected by the ORM and handled appropriately.
|
|
125
|
+
*/
|
|
126
|
+
function prorm_lite_literal(sql) {
|
|
127
|
+
// Return a special object that gets handled by the query compiler
|
|
128
|
+
return { __orm_literal: sql };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Apply default values to a model instance.
|
|
132
|
+
* Call this in beforeCreate/beforeUpdate hooks.
|
|
133
|
+
*
|
|
134
|
+
* @param instance - The model instance
|
|
135
|
+
*/
|
|
136
|
+
function applyDefaultValues(instance) {
|
|
137
|
+
const ModelClass = instance.constructor;
|
|
138
|
+
const defaultFields = getDefaultFields(ModelClass);
|
|
139
|
+
for (const { field, options } of defaultFields) {
|
|
140
|
+
// Skip if value is already set
|
|
141
|
+
const currentValue = instance.getDataValue ? instance.getDataValue(field) : instance[field];
|
|
142
|
+
if (currentValue !== undefined && currentValue !== null) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
// Handle function defaults (dynamic values)
|
|
146
|
+
if (options &&
|
|
147
|
+
typeof options === 'object' &&
|
|
148
|
+
'fn' in options &&
|
|
149
|
+
typeof options.fn === 'function') {
|
|
150
|
+
const defaultValue = options.fn();
|
|
151
|
+
if (instance.setDataValue) {
|
|
152
|
+
instance.setDataValue(field, defaultValue);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
instance[field] = defaultValue;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Handle static defaults
|
|
159
|
+
else if (!isDefaultOptionsObject(options)) {
|
|
160
|
+
if (instance.setDataValue) {
|
|
161
|
+
instance.setDataValue(field, options);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
instance[field] = options;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Database functions and sequences are handled by the database,
|
|
168
|
+
// so we don't apply them at runtime
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Register beforeCreate hook to automatically apply default values.
|
|
173
|
+
* Call once per model after Model.init().
|
|
174
|
+
*
|
|
175
|
+
* @param ModelClass - The model class
|
|
176
|
+
*/
|
|
177
|
+
function applyDefaultHooks(ModelClass) {
|
|
178
|
+
const fields = getDefaultFields(ModelClass);
|
|
179
|
+
if (fields.length === 0)
|
|
180
|
+
return;
|
|
181
|
+
if (typeof ModelClass.addHook === 'function') {
|
|
182
|
+
ModelClass.addHook('beforeCreate', 'orm:defaultValues', async (instance) => {
|
|
183
|
+
applyDefaultValues(instance);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// ==================== Decorator ====================
|
|
188
|
+
/**
|
|
189
|
+
* Set a default value for a model field.
|
|
190
|
+
*
|
|
191
|
+
* Can be used as:
|
|
192
|
+
* - @Default(18) - static value
|
|
193
|
+
* - @Default(() => new Date()) - function for dynamic defaults
|
|
194
|
+
* - @Default({ sequence: 'user_id_seq' }) - database sequence
|
|
195
|
+
* - @Default({ fn: 'now' }) - database function
|
|
196
|
+
* - @Default({ literal: "CURRENT_TIMESTAMP" }) - raw SQL
|
|
197
|
+
*
|
|
198
|
+
* @param options - The default value or configuration
|
|
199
|
+
*/
|
|
200
|
+
function Default(options) {
|
|
201
|
+
return function (target, propertyKey) {
|
|
202
|
+
const field = propertyKey;
|
|
203
|
+
// Store on the prototype (class), not the instance
|
|
204
|
+
const Constructor = target.constructor;
|
|
205
|
+
if (!Constructor[DEFAULT_FIELDS_KEY]) {
|
|
206
|
+
Constructor[DEFAULT_FIELDS_KEY] = [];
|
|
207
|
+
}
|
|
208
|
+
Constructor[DEFAULT_FIELDS_KEY].push({ field, options });
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
// ==================== Utility Functions ====================
|
|
212
|
+
/**
|
|
213
|
+
* Helper to create a UUID default.
|
|
214
|
+
* Usage: @Default(() => uuidv4())
|
|
215
|
+
*/
|
|
216
|
+
function uuidDefault() {
|
|
217
|
+
// Simple UUID v4 implementation
|
|
218
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
219
|
+
const r = (Math.random() * 16) | 0;
|
|
220
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
221
|
+
return v.toString(16);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Helper to create a current timestamp default.
|
|
226
|
+
* Usage: @Default(() => new Date())
|
|
227
|
+
*/
|
|
228
|
+
function nowDefault() {
|
|
229
|
+
return new Date();
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Helper to create a random integer default.
|
|
233
|
+
* Usage: @Default(() => Math.floor(Math.random() * 100))
|
|
234
|
+
*/
|
|
235
|
+
function randomIntDefault(min = 0, max = 100) {
|
|
236
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Helper to create a default based on another field.
|
|
240
|
+
* Usage: @Default((instance) => instance.username?.toLowerCase())
|
|
241
|
+
*/
|
|
242
|
+
function computedDefault(computeFn) {
|
|
243
|
+
return { fn: computeFn };
|
|
244
|
+
}
|