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,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
+ }