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,180 @@
1
+ "use strict";
2
+ /**
3
+ * Audit History Query methods
4
+ * Provides model-level and instance-level methods for querying audit history
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.setAuditLogger = setAuditLogger;
8
+ exports.getAuditLogger = getAuditLogger;
9
+ exports.addAuditHistoryToModel = addAuditHistoryToModel;
10
+ exports.addAuditHistoryToInstance = addAuditHistoryToInstance;
11
+ // Store reference to the AuditLogger instance
12
+ let auditLoggerInstance = null;
13
+ /**
14
+ * Set the global AuditLogger instance
15
+ * This should be called once when setting up audit logging
16
+ *
17
+ * @param logger - The AuditLogger instance
18
+ */
19
+ function setAuditLogger(logger) {
20
+ auditLoggerInstance = logger;
21
+ }
22
+ /**
23
+ * Get the current AuditLogger instance
24
+ */
25
+ function getAuditLogger() {
26
+ return auditLoggerInstance;
27
+ }
28
+ // ==================== Model-Level Methods ====================
29
+ /**
30
+ * Add model-level audit history methods to a Model class
31
+ *
32
+ * @param model - The Model static (class) to add methods to
33
+ */
34
+ function addAuditHistoryToModel(model) {
35
+ const tableName = model.tableName || model.name;
36
+ /**
37
+ * Get audit history for this model
38
+ *
39
+ * @param options - Query options
40
+ * @returns Promise resolving to array of AuditLog entries
41
+ *
42
+ * @example
43
+ * const history = await User.getAuditHistory({ limit: 10 });
44
+ */
45
+ model.getAuditHistory = async function (options) {
46
+ const logger = getAuditLogger();
47
+ if (!logger) {
48
+ throw new Error('AuditLogger not initialized. Call setAuditLogger() first.');
49
+ }
50
+ return logger.getHistory(tableName, undefined, options);
51
+ };
52
+ /**
53
+ * Get audit history for a specific record
54
+ *
55
+ * @param recordId - The record ID
56
+ * @param options - Query options
57
+ * @returns Promise resolving to array of AuditLog entries
58
+ *
59
+ * @example
60
+ * const history = await User.getAuditHistoryForRecord(123);
61
+ */
62
+ model.getAuditHistoryForRecord = async function (recordId, options) {
63
+ const logger = getAuditLogger();
64
+ if (!logger) {
65
+ throw new Error('AuditLogger not initialized. Call setAuditLogger() first.');
66
+ }
67
+ return logger.getHistory(tableName, recordId, options);
68
+ };
69
+ // Store table name for instance methods
70
+ model.__auditTableName__ = tableName;
71
+ }
72
+ /**
73
+ * Add instance-level audit history methods to a ModelInstance
74
+ *
75
+ * @param instance - The Model instance prototype
76
+ */
77
+ function addAuditHistoryToInstance(instance) {
78
+ /**
79
+ * Get audit history for this specific record
80
+ *
81
+ * @param options - Query options
82
+ * @returns Promise resolving to array of AuditLog entries
83
+ *
84
+ * @example
85
+ * const user = await User.findById(123);
86
+ * const history = await user.getAuditHistory();
87
+ */
88
+ instance.getAuditHistory = async function (options) {
89
+ const logger = getAuditLogger();
90
+ if (!logger) {
91
+ throw new Error('AuditLogger not initialized. Call setAuditLogger() first.');
92
+ }
93
+ const model = this.constructor;
94
+ const tableName = model.tableName || model.name;
95
+ const recordId = this.id;
96
+ return logger.getHistory(tableName, recordId, options);
97
+ };
98
+ /**
99
+ * Get the previous value of a specific field
100
+ *
101
+ * @param fieldName - The name of the field
102
+ * @returns The previous value of the field, or undefined
103
+ *
104
+ * @example
105
+ * const user = await User.findById(123);
106
+ * await user.update({ name: 'John' });
107
+ * const previousName = user.getPreviousValue('name');
108
+ * console.log(previousName); // 'Jane'
109
+ */
110
+ instance.getPreviousValue = function (fieldName) {
111
+ const previousDataValues = this._previousDataValues;
112
+ if (!previousDataValues) {
113
+ return undefined;
114
+ }
115
+ return previousDataValues[fieldName];
116
+ };
117
+ /**
118
+ * Get all previous values
119
+ *
120
+ * @returns Object containing previous field values
121
+ *
122
+ * @example
123
+ * const user = await User.findById(123);
124
+ * await user.update({ name: 'John', email: 'john@example.com' });
125
+ * const previousValues = user.getPreviousValues();
126
+ */
127
+ instance.getPreviousValues = function () {
128
+ return this._previousDataValues ? { ...this._previousDataValues } : {};
129
+ };
130
+ /**
131
+ * Check if a field was changed
132
+ *
133
+ * @param fieldName - The name of the field
134
+ * @returns True if the field was changed
135
+ *
136
+ * @example
137
+ * const user = await User.findById(123);
138
+ * await user.update({ name: 'John' });
139
+ * console.log(user.wasChanged('name')); // true
140
+ */
141
+ instance.wasChanged = function (fieldName) {
142
+ const previousDataValues = this._previousDataValues;
143
+ if (!previousDataValues) {
144
+ return false;
145
+ }
146
+ return previousDataValues[fieldName] !== undefined;
147
+ };
148
+ /**
149
+ * Get changes between previous and current values
150
+ *
151
+ * @returns Object with changed fields and their old/new values
152
+ *
153
+ * @example
154
+ * const user = await User.findById(123);
155
+ * await user.update({ name: 'John', email: 'john@example.com' });
156
+ * const changes = user.getChanges();
157
+ * // { name: { old: 'Jane', new: 'John' }, ... }
158
+ */
159
+ instance.getChanges = function () {
160
+ const changes = {};
161
+ const previousDataValues = this._previousDataValues || {};
162
+ const currentValues = this.dataValues || {};
163
+ const allKeys = new Set([...Object.keys(previousDataValues), ...Object.keys(currentValues)]);
164
+ for (const key of allKeys) {
165
+ const oldVal = previousDataValues[key];
166
+ const newVal = currentValues[key];
167
+ if (oldVal !== newVal) {
168
+ changes[key] = { old: oldVal, new: newVal };
169
+ }
170
+ }
171
+ return changes;
172
+ };
173
+ }
174
+ // ==================== Default Export ====================
175
+ exports.default = {
176
+ setAuditLogger,
177
+ getAuditLogger,
178
+ addAuditHistoryToModel,
179
+ addAuditHistoryToInstance,
180
+ };
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /**
3
+ * Audit Module
4
+ * Provides audit logging capabilities for tracking model changes
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.addAuditHistoryToInstance = exports.addAuditHistoryToModel = exports.getAuditLogger = exports.setAuditLogger = exports.AuditLogger = void 0;
8
+ var logger_1 = require("./logger");
9
+ Object.defineProperty(exports, "AuditLogger", { enumerable: true, get: function () { return logger_1.AuditLogger; } });
10
+ var history_query_1 = require("./history-query");
11
+ Object.defineProperty(exports, "setAuditLogger", { enumerable: true, get: function () { return history_query_1.setAuditLogger; } });
12
+ Object.defineProperty(exports, "getAuditLogger", { enumerable: true, get: function () { return history_query_1.getAuditLogger; } });
13
+ Object.defineProperty(exports, "addAuditHistoryToModel", { enumerable: true, get: function () { return history_query_1.addAuditHistoryToModel; } });
14
+ Object.defineProperty(exports, "addAuditHistoryToInstance", { enumerable: true, get: function () { return history_query_1.addAuditHistoryToInstance; } });
15
+ const logger_2 = require("./logger");
16
+ const history_query_2 = require("./history-query");
17
+ exports.default = {
18
+ AuditLogger: logger_2.AuditLogger,
19
+ setAuditLogger: history_query_2.setAuditLogger,
20
+ getAuditLogger: history_query_2.getAuditLogger,
21
+ addAuditHistoryToModel: history_query_2.addAuditHistoryToModel,
22
+ addAuditHistoryToInstance: history_query_2.addAuditHistoryToInstance,
23
+ };
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ /**
3
+ * Audit Logger for the TypeScript ORM
4
+ * Provides persistent audit logging for model changes with database storage
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AuditLogger = void 0;
8
+ const data_types_1 = require("../models/data-types");
9
+ // ==================== AuditLogger Class ====================
10
+ /**
11
+ * AuditLogger - Provides persistent audit logging for model changes
12
+ *
13
+ * @example
14
+ * const auditLogger = new AuditLogger(prorm);
15
+ * await auditLogger.setupHooks();
16
+ *
17
+ * // Manually log an action
18
+ * await auditLogger.logAction('CREATE', 'User', 1, {}, { name: 'John' });
19
+ *
20
+ * // Get audit history
21
+ * const history = await auditLogger.getHistory('User', 1);
22
+ */
23
+ class AuditLogger {
24
+ /**
25
+ * Create a new AuditLogger instance
26
+ *
27
+ * @param prorm - The Prorm instance
28
+ * @param options - Optional configuration options
29
+ */
30
+ constructor(prorm, options) {
31
+ this.auditModel = null;
32
+ this.hookedModels = new Set();
33
+ this.prorm = prorm;
34
+ this.options = {
35
+ tableName: options?.tableName ?? 'AuditLogs',
36
+ userIdGetter: options?.userIdGetter ?? (() => undefined),
37
+ ipAddressGetter: options?.ipAddressGetter ?? (() => undefined),
38
+ modelName: options?.modelName ?? 'AuditLog',
39
+ };
40
+ }
41
+ /**
42
+ * Get the audit model
43
+ */
44
+ getModel() {
45
+ return this.auditModel;
46
+ }
47
+ /**
48
+ * Get the current user ID
49
+ */
50
+ getUserId() {
51
+ return this.options.userIdGetter();
52
+ }
53
+ /**
54
+ * Get the current IP address
55
+ */
56
+ getIpAddress() {
57
+ return this.options.ipAddressGetter();
58
+ }
59
+ /**
60
+ * Define and create the audit log model
61
+ */
62
+ async ensureAuditModel() {
63
+ if (this.auditModel) {
64
+ return this.auditModel;
65
+ }
66
+ const { tableName, modelName } = this.options;
67
+ // Check if model already exists using prorm.model()
68
+ const existingModel = this.prorm.model(modelName);
69
+ if (existingModel) {
70
+ this.auditModel = existingModel;
71
+ return existingModel;
72
+ }
73
+ // Define the audit log model
74
+ const AuditLogModel = this.prorm.define(modelName, {
75
+ id: {
76
+ type: data_types_1.DataTypes.INTEGER(),
77
+ primaryKey: true,
78
+ autoIncrement: true,
79
+ },
80
+ tableName: {
81
+ type: data_types_1.DataTypes.STRING(255),
82
+ allowNull: false,
83
+ },
84
+ action: {
85
+ type: data_types_1.DataTypes.ENUM('CREATE', 'UPDATE', 'DELETE'),
86
+ allowNull: false,
87
+ },
88
+ recordId: {
89
+ type: data_types_1.DataTypes.STRING(255),
90
+ allowNull: false,
91
+ },
92
+ oldValues: {
93
+ type: data_types_1.DataTypes.JSON(),
94
+ allowNull: true,
95
+ },
96
+ newValues: {
97
+ type: data_types_1.DataTypes.JSON(),
98
+ allowNull: true,
99
+ },
100
+ userId: {
101
+ type: data_types_1.DataTypes.STRING(255),
102
+ allowNull: true,
103
+ },
104
+ timestamp: {
105
+ type: data_types_1.DataTypes.DATE(),
106
+ allowNull: false,
107
+ defaultValue: data_types_1.DataTypes.NOW(),
108
+ },
109
+ ipAddress: {
110
+ type: data_types_1.DataTypes.STRING(45),
111
+ allowNull: true,
112
+ },
113
+ }, {
114
+ tableName,
115
+ timestamps: false,
116
+ underscored: true,
117
+ });
118
+ this.auditModel = AuditLogModel;
119
+ return AuditLogModel;
120
+ }
121
+ /**
122
+ * Log an audit action
123
+ *
124
+ * @param action - The type of action (CREATE, UPDATE, DELETE)
125
+ * @param tableName - The name of the table
126
+ * @param recordId - The primary key of the record
127
+ * @param oldValues - The previous values (for UPDATE/DELETE)
128
+ * @param newValues - The new values (for CREATE/UPDATE)
129
+ */
130
+ async logAction(action, tableName, recordId, oldValues, newValues) {
131
+ const auditModel = await this.ensureAuditModel();
132
+ await auditModel.create({
133
+ tableName,
134
+ action,
135
+ recordId: String(recordId),
136
+ oldValues: oldValues ?? null,
137
+ newValues: newValues ?? null,
138
+ userId: this.getUserId() ?? null,
139
+ timestamp: new Date(),
140
+ ipAddress: this.getIpAddress() ?? null,
141
+ });
142
+ }
143
+ /**
144
+ * Get audit history for a table and optional record
145
+ *
146
+ * @param tableName - The name of the table
147
+ * @param recordId - Optional record ID to filter by
148
+ * @param options - Query options
149
+ */
150
+ async getHistory(tableName, recordId, options) {
151
+ const auditModel = await this.ensureAuditModel();
152
+ const where = {
153
+ tableName,
154
+ };
155
+ if (recordId !== undefined) {
156
+ where.recordId = String(recordId);
157
+ }
158
+ if (options?.startDate || options?.endDate) {
159
+ where.timestamp = {};
160
+ if (options.startDate) {
161
+ where.timestamp[Symbol.for('gte')] = options.startDate;
162
+ }
163
+ if (options.endDate) {
164
+ where.timestamp[Symbol.for('lte')] = options.endDate;
165
+ }
166
+ }
167
+ const results = await auditModel.findAll({
168
+ where,
169
+ order: [['timestamp', 'DESC']],
170
+ limit: options?.limit ?? 100,
171
+ offset: options?.offset ?? 0,
172
+ });
173
+ return results.map((r) => ({
174
+ id: r.id,
175
+ tableName: r.tableName,
176
+ action: r.action,
177
+ recordId: r.recordId,
178
+ oldValues: r.oldValues,
179
+ newValues: r.newValues,
180
+ userId: r.userId,
181
+ timestamp: r.timestamp,
182
+ ipAddress: r.ipAddress,
183
+ }));
184
+ }
185
+ /**
186
+ * Setup hooks for all models to automatically log changes
187
+ *
188
+ * This method iterates through all registered models and adds
189
+ * beforeCreate, beforeUpdate, and beforeDestroy hooks
190
+ */
191
+ setupHooks() {
192
+ const models = this.prorm.getModels();
193
+ for (const [, model] of models) {
194
+ this.addHooksToModel(model);
195
+ }
196
+ }
197
+ /**
198
+ * Add audit hooks to a specific model
199
+ *
200
+ * @param model - The model to add hooks to
201
+ */
202
+ addHooksToModel(model) {
203
+ if (this.hookedModels.has(model)) {
204
+ return;
205
+ }
206
+ const tableName = model.tableName || model.name;
207
+ // beforeCreate hook
208
+ model.hook('beforeCreate', async (instance) => {
209
+ const newValues = instance.toJSON ? instance.toJSON() : { ...instance.dataValues };
210
+ await this.logAction('CREATE', tableName, instance.id, undefined, newValues);
211
+ });
212
+ // beforeUpdate hook
213
+ model.hook('beforeUpdate', async (instance) => {
214
+ const oldValues = instance._previousDataValues ? { ...instance._previousDataValues } : {};
215
+ const newValues = instance.toJSON ? instance.toJSON() : { ...instance.dataValues };
216
+ await this.logAction('UPDATE', tableName, instance.id, oldValues, newValues);
217
+ });
218
+ // beforeDestroy hook
219
+ model.hook('beforeDestroy', async (instance) => {
220
+ const oldValues = instance.toJSON ? instance.toJSON() : { ...instance.dataValues };
221
+ await this.logAction('DELETE', tableName, instance.id, oldValues, undefined);
222
+ });
223
+ this.hookedModels.add(model);
224
+ }
225
+ /**
226
+ * Check if a model has audit hooks
227
+ *
228
+ * @param model - The model to check
229
+ */
230
+ hasHooks(model) {
231
+ return this.hookedModels.has(model);
232
+ }
233
+ }
234
+ exports.AuditLogger = AuditLogger;
235
+ // ==================== Default Export ====================
236
+ exports.default = AuditLogger;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ /**
3
+ * Cache Manager - Abstract CacheBackend interface
4
+ *
5
+ * Defines the contract for cache backends used in query result caching.
6
+ * Supports L1 (in-memory) and L2 (distributed) caching layers.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AbstractCacheManager = void 0;
10
+ /**
11
+ * Abstract cache manager with L1/L2 support
12
+ */
13
+ class AbstractCacheManager {
14
+ constructor(options = {}) {
15
+ this.stats = {
16
+ hits: 0,
17
+ misses: 0,
18
+ l1Hits: 0,
19
+ l2Hits: 0,
20
+ keys: 0,
21
+ hitRate: 0,
22
+ };
23
+ this.options = this.normalizeOptions(options);
24
+ }
25
+ /**
26
+ * Normalize and set default options
27
+ */
28
+ normalizeOptions(options) {
29
+ return {
30
+ l1: {
31
+ enabled: options.l1?.enabled ?? true,
32
+ maxEntries: options.l1?.maxEntries ?? 1000,
33
+ ttl: options.l1?.ttl ?? 60,
34
+ },
35
+ l2: {
36
+ enabled: options.l2?.enabled ?? true,
37
+ defaultTtl: options.l2?.defaultTtl ?? 3600,
38
+ },
39
+ key: {
40
+ prefix: options.key?.prefix ?? 'orm:cache:',
41
+ separator: options.key?.separator ?? ':',
42
+ },
43
+ readFromReplicas: options.readFromReplicas ?? false,
44
+ clusterNodes: options.clusterNodes ?? [],
45
+ clusterOptions: options.clusterOptions ?? {},
46
+ maxConnections: options.maxConnections ?? 10,
47
+ connectTimeout: options.connectTimeout ?? 10000,
48
+ commandTimeout: options.commandTimeout ?? 5000,
49
+ retryStrategy: options.retryStrategy ?? null,
50
+ db: options.db ?? 0,
51
+ enableKeyspaceNotifications: options.enableKeyspaceNotifications ?? false,
52
+ };
53
+ }
54
+ /**
55
+ * Build a full cache key with prefix
56
+ */
57
+ buildKey(key) {
58
+ return `${this.options.key.prefix}${key}`;
59
+ }
60
+ /**
61
+ * Get cache statistics
62
+ */
63
+ getStats() {
64
+ const total = this.stats.hits + this.stats.misses;
65
+ return {
66
+ ...this.stats,
67
+ hitRate: total > 0 ? this.stats.hits / total : 0,
68
+ };
69
+ }
70
+ /**
71
+ * Reset cache statistics
72
+ */
73
+ resetStats() {
74
+ this.stats = {
75
+ hits: 0,
76
+ misses: 0,
77
+ l1Hits: 0,
78
+ l2Hits: 0,
79
+ keys: 0,
80
+ hitRate: 0,
81
+ };
82
+ }
83
+ }
84
+ exports.AbstractCacheManager = AbstractCacheManager;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /**
3
+ * Cache Module
4
+ *
5
+ * Provides caching functionality for query results using Redis Cluster
6
+ * with L1 (in-memory) and L2 (distributed Redis) cache layers.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createRedisClusterCache = exports.RedisClusterCache = exports.AbstractCacheManager = void 0;
10
+ // Re-export cache manager types
11
+ var cache_manager_1 = require("./cache-manager");
12
+ Object.defineProperty(exports, "AbstractCacheManager", { enumerable: true, get: function () { return cache_manager_1.AbstractCacheManager; } });
13
+ // Re-export Redis cluster cache
14
+ var redis_cluster_cache_1 = require("./redis-cluster-cache");
15
+ Object.defineProperty(exports, "RedisClusterCache", { enumerable: true, get: function () { return redis_cluster_cache_1.RedisClusterCache; } });
16
+ Object.defineProperty(exports, "createRedisClusterCache", { enumerable: true, get: function () { return redis_cluster_cache_1.createRedisClusterCache; } });