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,382 @@
1
+ "use strict";
2
+ /**
3
+ * Custom Methods Helpers for Models
4
+ *
5
+ * This module provides utilities for adding custom class and instance methods
6
+ * to Prorm-like models.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.commonClassMethods = exports.commonInstanceMethods = void 0;
43
+ exports.addClassMethods = addClassMethods;
44
+ exports.addInstanceMethods = addInstanceMethods;
45
+ exports.extendModel = extendModel;
46
+ /**
47
+ * Add custom class methods to a model
48
+ * Use this to add static methods to a model (e.g., User.findByEmail)
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * addClassMethods(User, {
53
+ * findByEmail: async function(email) {
54
+ * return this.findOne({ where: { email } });
55
+ * },
56
+ * findByRole: function(role) {
57
+ * return this.findAll({ where: { role } });
58
+ * }
59
+ * });
60
+ * ```
61
+ *
62
+ * @param model - The model static to add methods to
63
+ * @param methods - Object containing method names and their implementations
64
+ */
65
+ function addClassMethods(model, methods) {
66
+ for (const [methodName, methodFn] of Object.entries(methods)) {
67
+ model[methodName] = methodFn;
68
+ }
69
+ }
70
+ /**
71
+ * Add custom instance methods to a model
72
+ * Use this to add methods that will be available on model instances (e.g., user.getFullName())
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * addInstanceMethods(User, {
77
+ * getFullName: function() {
78
+ * return `${this.firstName} ${this.lastName}`;
79
+ * },
80
+ * isActive: function() {
81
+ * return this.status === 'active';
82
+ * }
83
+ * });
84
+ * ```
85
+ *
86
+ * @param model - The model static to add methods to
87
+ * @param methods - Object containing method names and their implementations
88
+ */
89
+ function addInstanceMethods(model, methods) {
90
+ // Store instance methods on the model for use by ModelInstance constructor
91
+ const existingMethods = model.instanceMethods || {};
92
+ model.instanceMethods = { ...existingMethods, ...methods };
93
+ }
94
+ /**
95
+ * Helper to extend a model with additional methods after definition
96
+ * Useful for adding methods to models defined elsewhere
97
+ *
98
+ * @example
99
+ * ```typescript
100
+ * // Extend User model with custom methods
101
+ * extendModel(User, {
102
+ * classMethods: {
103
+ * findActive: function() {
104
+ * return this.findAll({ where: { status: 'active' } });
105
+ * }
106
+ * },
107
+ * instanceMethods: {
108
+ * getDisplayName: function() {
109
+ * return this.name || this.email;
110
+ * }
111
+ * }
112
+ * });
113
+ * ```
114
+ *
115
+ * @param model - The model to extend
116
+ * @param options - Object containing classMethods and/or instanceMethods
117
+ */
118
+ function extendModel(model, options) {
119
+ if (options.classMethods) {
120
+ addClassMethods(model, options.classMethods);
121
+ }
122
+ if (options.instanceMethods) {
123
+ addInstanceMethods(model, options.instanceMethods);
124
+ }
125
+ }
126
+ /**
127
+ * Common instance methods that can be added to any model
128
+ */
129
+ exports.commonInstanceMethods = {
130
+ /**
131
+ * Get a single attribute value
132
+ * @example
133
+ * ```typescript
134
+ * const name = user.get('firstName');
135
+ * ```
136
+ */
137
+ get(key) {
138
+ return this.getDataValue(key);
139
+ },
140
+ /**
141
+ * Set a single attribute value
142
+ * @example
143
+ * ```typescript
144
+ * user.set('firstName', 'John');
145
+ * ```
146
+ */
147
+ set(key, value) {
148
+ this.setDataValue(key, value);
149
+ },
150
+ /**
151
+ * Get raw data value (bypasses getters)
152
+ * @example
153
+ * ```typescript
154
+ * const value = user.getDataValue('firstName');
155
+ * ```
156
+ */
157
+ getDataValue(key) {
158
+ return this.dataValues[key];
159
+ },
160
+ /**
161
+ * Set raw data value (bypasses setters)
162
+ * @example
163
+ * ```typescript
164
+ * user.setDataValue('firstName', 'John');
165
+ * ```
166
+ */
167
+ setDataValue(key, value) {
168
+ this.dataValues[key] = value;
169
+ this.isDirty = true;
170
+ this._changed.add(key);
171
+ },
172
+ /**
173
+ * Check if record is new (not saved to database)
174
+ * @example
175
+ * ```typescript
176
+ * if (user.isNewRecord) {
177
+ * console.log('New user!');
178
+ * }
179
+ * ```
180
+ */
181
+ isNewRecord() {
182
+ return this.isNewRecord;
183
+ },
184
+ /**
185
+ * Convert instance to JSON
186
+ * @example
187
+ * ```typescript
188
+ * const json = user.toJSON();
189
+ * ```
190
+ */
191
+ toJSON() {
192
+ return { ...this.dataValues };
193
+ },
194
+ /**
195
+ * Check if a specific field has changed
196
+ * @example
197
+ * ```typescript
198
+ * if (user.changed('email')) {
199
+ * console.log('Email was changed');
200
+ * }
201
+ * ```
202
+ */
203
+ changed(key) {
204
+ if (key) {
205
+ return this._changed.has(key);
206
+ }
207
+ return Array.from(this._changed);
208
+ },
209
+ /**
210
+ * Get previous value of a field
211
+ * @example
212
+ * ```typescript
213
+ * const oldEmail = user.previous('email');
214
+ * ```
215
+ */
216
+ previous(key) {
217
+ if (key) {
218
+ return this._previousDataValues[key];
219
+ }
220
+ return { ...this._previousDataValues };
221
+ },
222
+ };
223
+ /**
224
+ * Common class methods that can be added to any model
225
+ */
226
+ exports.commonClassMethods = {
227
+ /**
228
+ * Find a record or create it if not found
229
+ * @example
230
+ * ```typescript
231
+ * const [user, created] = await User.findOrCreate({
232
+ * where: { email: 'john@example.com' },
233
+ * defaults: { name: 'John' }
234
+ * });
235
+ * ```
236
+ */
237
+ async findOrCreate(options) {
238
+ const existing = await this.findOne({ where: options.where });
239
+ if (existing) {
240
+ return [existing, false];
241
+ }
242
+ const createValues = { ...options.defaults, ...options.where };
243
+ const created = await this.create(createValues);
244
+ return [created, true];
245
+ },
246
+ /**
247
+ * Find a record or build (but not save) it if not found
248
+ * @example
249
+ * ```typescript
250
+ * const [user, built] = await User.findOrBuild({
251
+ * where: { email: 'john@example.com' },
252
+ * defaults: { name: 'John' }
253
+ * });
254
+ * if (built) {
255
+ * await user.save();
256
+ * }
257
+ * ```
258
+ */
259
+ async findOrBuild(options) {
260
+ const existing = await this.findOne({ where: options.where });
261
+ if (existing) {
262
+ return [existing, false];
263
+ }
264
+ const buildValues = { ...options.defaults, ...options.where };
265
+ // Create instance without saving - we'll need to import ModelInstance
266
+ const instance = new (await Promise.resolve().then(() => __importStar(require('./model')))).ModelInstance(this, this.prorm, buildValues, { isNewRecord: true });
267
+ return [instance, true];
268
+ },
269
+ /**
270
+ * Insert or update a record
271
+ * @example
272
+ * ```typescript
273
+ * const [user, isNew] = await User.upsert({
274
+ * id: 1,
275
+ * name: 'John',
276
+ * email: 'john@example.com'
277
+ * });
278
+ * ```
279
+ */
280
+ async upsert(values, _options) {
281
+ // Find primary key
282
+ const attributes = this.rawAttributes;
283
+ let pkAttr = 'id';
284
+ for (const [attrName, attr] of Object.entries(attributes)) {
285
+ if (attr.primaryKey) {
286
+ pkAttr = attrName;
287
+ break;
288
+ }
289
+ }
290
+ const pkValue = values[pkAttr];
291
+ if (pkValue !== undefined && pkValue !== null) {
292
+ const existing = await this.findOne({
293
+ where: { [pkAttr]: pkValue },
294
+ });
295
+ if (existing) {
296
+ await existing.set(values);
297
+ await existing.save();
298
+ return [existing, false];
299
+ }
300
+ }
301
+ const created = await this.create(values);
302
+ return [created, true];
303
+ },
304
+ /**
305
+ * Find a record by where conditions, or create it with upsert semantics
306
+ * Similar to findOrCreate but uses upsert for the create path
307
+ * @example
308
+ * ```typescript
309
+ * const [user, created] = await User.upsertOrCreate({
310
+ * where: { email: 'john@example.com' },
311
+ * defaults: { name: 'John' },
312
+ * updateValues: { name: 'John Updated' }
313
+ * });
314
+ * ```
315
+ */
316
+ async upsertOrCreate(options) {
317
+ const existing = await this.findOne({ where: options.where });
318
+ if (existing) {
319
+ // Update with provided updateValues or defaults
320
+ const updateData = options.updateValues || options.defaults || {};
321
+ await existing.set(updateData);
322
+ await existing.save();
323
+ return [existing, false];
324
+ }
325
+ // Create with defaults merged with where conditions
326
+ const createValues = { ...options.defaults, ...options.where };
327
+ const created = await this.create(createValues);
328
+ return [created, true];
329
+ },
330
+ /**
331
+ * Bulk upsert - upsert multiple records at once
332
+ * @example
333
+ * ```typescript
334
+ * const results = await User.bulkUpsert([
335
+ * { id: 1, name: 'John' },
336
+ * { id: 2, name: 'Jane' },
337
+ * { name: 'New User' }
338
+ * ], { conflictKeys: ['email'], updateKeys: ['name'] });
339
+ * ```
340
+ */
341
+ async bulkUpsert(records, options = {}) {
342
+ if (records.length === 0)
343
+ return 0;
344
+ const { conflictKeys = ['id'], updateKeys = [] } = options;
345
+ // Get the primary key or first conflict key
346
+ const pkAttr = conflictKeys[0];
347
+ let updatedCount = 0;
348
+ // Process each record individually (for proper upsert semantics)
349
+ // In a production implementation, this would use dialect-specific
350
+ // INSERT ... ON CONFLICT (PostgreSQL) or INSERT ... ON DUPLICATE KEY UPDATE (MySQL)
351
+ for (const record of records) {
352
+ const where = {};
353
+ where[pkAttr] = record[pkAttr];
354
+ const existing = await this.findOne({ where });
355
+ if (existing) {
356
+ // Update with provided values
357
+ const updateData = {};
358
+ for (const key of updateKeys) {
359
+ if (record[key] !== undefined) {
360
+ updateData[key] = record[key];
361
+ }
362
+ }
363
+ if (Object.keys(updateData).length > 0) {
364
+ await existing.set(updateData);
365
+ await existing.save();
366
+ updatedCount++;
367
+ }
368
+ }
369
+ else {
370
+ await this.create(record);
371
+ }
372
+ }
373
+ return updatedCount;
374
+ },
375
+ };
376
+ exports.default = {
377
+ addClassMethods,
378
+ addInstanceMethods,
379
+ extendModel,
380
+ commonInstanceMethods: exports.commonInstanceMethods,
381
+ commonClassMethods: exports.commonClassMethods,
382
+ };
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * Model Manager Module
4
+ * Manages model registry and tracking all defined models
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ModelManager = void 0;
8
+ /**
9
+ * ModelManager class to track all models
10
+ */
11
+ class ModelManager {
12
+ constructor() {
13
+ this.models = new Map();
14
+ this.modelDefinitions = new Map();
15
+ }
16
+ /**
17
+ * Get a model by name
18
+ * @param name - Model name
19
+ */
20
+ getModel(name) {
21
+ return this.models.get(name);
22
+ }
23
+ /**
24
+ * Set a model
25
+ * @param name - Model name
26
+ * @param model - Model static
27
+ */
28
+ setModel(name, model) {
29
+ // Check if model with same name already exists
30
+ if (this.models.has(name)) {
31
+ throw new Error(`Model '${name}' already exists. Use removeModel() first to replace.`);
32
+ }
33
+ this.models.set(name, model);
34
+ }
35
+ /**
36
+ * Check if a model exists
37
+ * @param name - Model name
38
+ */
39
+ hasModel(name) {
40
+ return this.models.has(name);
41
+ }
42
+ /**
43
+ * Remove a model by name
44
+ * @param name - Model name
45
+ */
46
+ removeModel(name) {
47
+ const existed = this.models.has(name);
48
+ this.models.delete(name);
49
+ this.modelDefinitions.delete(name);
50
+ return existed;
51
+ }
52
+ /**
53
+ * Get all registered models
54
+ * @returns Map of model name to ModelStatic
55
+ */
56
+ getModels() {
57
+ return new Map(this.models);
58
+ }
59
+ /**
60
+ * Get all model names
61
+ * @returns Array of model names
62
+ */
63
+ getModelNames() {
64
+ return Array.from(this.models.keys());
65
+ }
66
+ /**
67
+ * Store a model definition
68
+ * @param name - Model name
69
+ * @param attributes - Model attributes
70
+ * @param options - Model options
71
+ */
72
+ addModelDefinition(name, attributes, options) {
73
+ this.modelDefinitions.set(name, { name, attributes, options });
74
+ }
75
+ /**
76
+ * Get a model definition
77
+ * @param name - Model name
78
+ */
79
+ getModelDefinition(name) {
80
+ return this.modelDefinitions.get(name);
81
+ }
82
+ /**
83
+ * Get all model definitions
84
+ */
85
+ getAllModelDefinitions() {
86
+ return new Map(this.modelDefinitions);
87
+ }
88
+ /**
89
+ * Clear all models
90
+ */
91
+ clear() {
92
+ this.models.clear();
93
+ this.modelDefinitions.clear();
94
+ }
95
+ /**
96
+ * Get the count of registered models
97
+ */
98
+ getModelCount() {
99
+ return this.models.size;
100
+ }
101
+ }
102
+ exports.ModelManager = ModelManager;
103
+ exports.default = ModelManager;