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,152 @@
1
+ "use strict";
2
+ /**
3
+ * Subquery Builder
4
+ * Provides an ORM-like way to build subqueries without raw SQL
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SubqueryBuilder = void 0;
8
+ const model_helpers_1 = require("./model-helpers");
9
+ /**
10
+ * Builder for creating subqueries programmatically
11
+ */
12
+ class SubqueryBuilder {
13
+ /**
14
+ * Create an IN subquery
15
+ * @example
16
+ * // Find users with posts using model class
17
+ * User.findAll({
18
+ * where: {
19
+ * id: { [Op.in]: SubqueryBuilder.select('userId', { model: Post }) }
20
+ * }
21
+ * })
22
+ * @example
23
+ * // Using table name string
24
+ * SubqueryBuilder.select('userId', { model: 'posts' })
25
+ */
26
+ static select(column, options) {
27
+ const modelName = (0, model_helpers_1.getTableName)(options.model);
28
+ return `__SUBQUERY_${modelName}_${column}__`;
29
+ }
30
+ /**
31
+ * Create an EXISTS subquery
32
+ * @example
33
+ * // Find users who have posts using model class
34
+ * User.findAll({
35
+ * where: {
36
+ * [Op.exists]: SubqueryBuilder.exists({
37
+ * model: Post,
38
+ * where: { userId: { [Op.col]: 'User.id' } }
39
+ * })
40
+ * }
41
+ * })
42
+ * @example
43
+ * // Using table name string
44
+ * SubqueryBuilder.exists({ model: 'posts', where: {...} })
45
+ */
46
+ static exists(options) {
47
+ const modelName = (0, model_helpers_1.getTableName)(options.model);
48
+ return {
49
+ __type: 'exists',
50
+ model: modelName,
51
+ modelName: (0, model_helpers_1.getModelName)(options.model),
52
+ where: options.where,
53
+ correlation: options.correlation || 'INNER',
54
+ };
55
+ }
56
+ /**
57
+ * Create a NOT EXISTS subquery
58
+ */
59
+ static notExists(options) {
60
+ const modelName = (0, model_helpers_1.getTableName)(options.model);
61
+ return {
62
+ __type: 'notExists',
63
+ model: modelName,
64
+ modelName: (0, model_helpers_1.getModelName)(options.model),
65
+ where: options.where,
66
+ correlation: options.correlation || 'INNER',
67
+ };
68
+ }
69
+ /**
70
+ * Create a scalar subquery (COUNT, SUM, etc.)
71
+ * @example
72
+ * // Get user with post count using model class
73
+ * User.findAll({
74
+ * attributes: {
75
+ * include: [
76
+ * [SubqueryBuilder.count({ model: Post, column: 'userId' }), 'postCount']
77
+ * ]
78
+ * }
79
+ * })
80
+ */
81
+ static count(options) {
82
+ const modelName = (0, model_helpers_1.getTableName)(options.model);
83
+ return {
84
+ __type: 'scalar',
85
+ aggregate: 'COUNT',
86
+ model: modelName,
87
+ modelName: (0, model_helpers_1.getModelName)(options.model),
88
+ column: options.column,
89
+ where: options.where,
90
+ };
91
+ }
92
+ static sum(options) {
93
+ const modelName = (0, model_helpers_1.getTableName)(options.model);
94
+ return {
95
+ __type: 'scalar',
96
+ aggregate: 'SUM',
97
+ model: modelName,
98
+ modelName: (0, model_helpers_1.getModelName)(options.model),
99
+ column: options.column,
100
+ where: options.where,
101
+ };
102
+ }
103
+ static avg(options) {
104
+ const modelName = (0, model_helpers_1.getTableName)(options.model);
105
+ return {
106
+ __type: 'scalar',
107
+ aggregate: 'AVG',
108
+ model: modelName,
109
+ modelName: (0, model_helpers_1.getModelName)(options.model),
110
+ column: options.column,
111
+ where: options.where,
112
+ };
113
+ }
114
+ static max(options) {
115
+ const modelName = (0, model_helpers_1.getTableName)(options.model);
116
+ return {
117
+ __type: 'scalar',
118
+ aggregate: 'MAX',
119
+ model: modelName,
120
+ modelName: (0, model_helpers_1.getModelName)(options.model),
121
+ column: options.column,
122
+ where: options.where,
123
+ };
124
+ }
125
+ static min(options) {
126
+ const modelName = (0, model_helpers_1.getTableName)(options.model);
127
+ return {
128
+ __type: 'scalar',
129
+ aggregate: 'MIN',
130
+ model: modelName,
131
+ modelName: (0, model_helpers_1.getModelName)(options.model),
132
+ column: options.column,
133
+ where: options.where,
134
+ };
135
+ }
136
+ /**
137
+ * Create a correlated subquery using column reference
138
+ * @example
139
+ * SubqueryBuilder.correlated({ outerModel: User, outerColumn: 'id', innerModel: Post, innerColumn: 'userId' })
140
+ */
141
+ static correlated(options) {
142
+ return {
143
+ __type: 'correlated',
144
+ outerModel: (0, model_helpers_1.getModelName)(options.outerModel),
145
+ outerColumn: options.outerColumn,
146
+ innerModel: (0, model_helpers_1.getModelName)(options.innerModel),
147
+ innerColumn: options.innerColumn,
148
+ };
149
+ }
150
+ }
151
+ exports.SubqueryBuilder = SubqueryBuilder;
152
+ exports.default = SubqueryBuilder;
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ /**
3
+ * Update query builder for the ORM
4
+ * Handles UPDATE queries with partial updates
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.UpdateBuilder = void 0;
8
+ exports.createUpdateBuilder = createUpdateBuilder;
9
+ exports.buildUpdateQuery = buildUpdateQuery;
10
+ exports.buildUpdateWithOperations = buildUpdateWithOperations;
11
+ const where_builder_1 = require("./where-builder");
12
+ /**
13
+ * UpdateBuilder class for building UPDATE queries
14
+ */
15
+ class UpdateBuilder {
16
+ constructor(options = {}) {
17
+ this.options = options;
18
+ this.whereBuilder = new where_builder_1.WhereBuilder({
19
+ dialect: options.dialect,
20
+ });
21
+ }
22
+ /**
23
+ * Build an UPDATE query
24
+ */
25
+ build(tableName, values, where) {
26
+ const queryValues = [];
27
+ // Build SET clause
28
+ const setClauses = [];
29
+ for (const [key, value] of Object.entries(values)) {
30
+ if (value === undefined) {
31
+ continue;
32
+ }
33
+ // Handle column reference: Op.col('column_name')
34
+ if (value !== null && typeof value === 'object' && '$col' in value) {
35
+ const colName = value.$col;
36
+ setClauses.push(`${this.escapeId(key)} = ${this.escapeId(colName)}`);
37
+ }
38
+ else {
39
+ setClauses.push(`${this.escapeId(key)} = ?`);
40
+ queryValues.push(value);
41
+ }
42
+ }
43
+ if (setClauses.length === 0) {
44
+ throw new Error('No values to update');
45
+ }
46
+ const sql = `UPDATE ${this.escapeId(tableName)} SET ${setClauses.join(', ')}`;
47
+ // Build WHERE clause
48
+ const whereResult = this.whereBuilder.build(where);
49
+ let fullSql = sql;
50
+ if (whereResult.sql) {
51
+ fullSql += ` WHERE ${whereResult.sql}`;
52
+ queryValues.push(...whereResult.values);
53
+ }
54
+ // Add LIMIT if specified
55
+ if (this.options.limit !== undefined) {
56
+ fullSql += ` LIMIT ${this.options.limit}`;
57
+ }
58
+ // Add RETURNING clause if specified
59
+ if (this.options.returning) {
60
+ fullSql += this.buildReturningClause();
61
+ }
62
+ return { sql: fullSql, values: queryValues };
63
+ }
64
+ /**
65
+ * Build a partial UPDATE query (only specified fields)
66
+ */
67
+ buildPartial(tableName, values, where, fields) {
68
+ let filteredValues = values;
69
+ // Filter to only include specified fields
70
+ if (fields && fields.length > 0) {
71
+ filteredValues = {};
72
+ for (const field of fields) {
73
+ if (values[field] !== undefined) {
74
+ filteredValues[field] = values[field];
75
+ }
76
+ }
77
+ }
78
+ return this.build(tableName, filteredValues, where);
79
+ }
80
+ /**
81
+ * Build an UPDATE query with increment/decrement operations
82
+ */
83
+ buildWithOperations(tableName, operations, where) {
84
+ const queryValues = [];
85
+ // Build SET clause with operations
86
+ const setClauses = [];
87
+ for (const [key, operation] of Object.entries(operations)) {
88
+ switch (operation.op) {
89
+ case '+':
90
+ setClauses.push(`${this.escapeId(key)} = ${this.escapeId(key)} + ?`);
91
+ break;
92
+ case '-':
93
+ setClauses.push(`${this.escapeId(key)} = ${this.escapeId(key)} - ?`);
94
+ break;
95
+ case '*':
96
+ setClauses.push(`${this.escapeId(key)} = ${this.escapeId(key)} * ?`);
97
+ break;
98
+ case '/':
99
+ setClauses.push(`${this.escapeId(key)} = ${this.escapeId(key)} / ?`);
100
+ break;
101
+ case 'SET':
102
+ setClauses.push(`${this.escapeId(key)} = ?`);
103
+ break;
104
+ }
105
+ queryValues.push(operation.value);
106
+ }
107
+ if (setClauses.length === 0) {
108
+ throw new Error('No operations to update');
109
+ }
110
+ const sql = `UPDATE ${this.escapeId(tableName)} SET ${setClauses.join(', ')}`;
111
+ // Build WHERE clause
112
+ const whereResult = this.whereBuilder.build(where);
113
+ let fullSql = sql;
114
+ if (whereResult.sql) {
115
+ fullSql += ` WHERE ${whereResult.sql}`;
116
+ queryValues.push(...whereResult.values);
117
+ }
118
+ // Add LIMIT if specified
119
+ if (this.options.limit !== undefined) {
120
+ fullSql += ` LIMIT ${this.options.limit}`;
121
+ }
122
+ return { sql: fullSql, values: queryValues };
123
+ }
124
+ /**
125
+ * Build a batch UPDATE query (for bulk updates)
126
+ */
127
+ buildBatch(tableName, records) {
128
+ const results = [];
129
+ for (const record of records) {
130
+ results.push(this.build(tableName, record.values, record.where));
131
+ }
132
+ return results;
133
+ }
134
+ /**
135
+ * Build the RETURNING clause
136
+ */
137
+ buildReturningClause() {
138
+ if (!this.options.returning) {
139
+ return '';
140
+ }
141
+ if (this.options.returning === true) {
142
+ return ' RETURNING *';
143
+ }
144
+ if (Array.isArray(this.options.returning)) {
145
+ const cols = this.options.returning.map((c) => this.escapeId(c)).join(', ');
146
+ return ` RETURNING ${cols}`;
147
+ }
148
+ return '';
149
+ }
150
+ /**
151
+ * Escape an identifier
152
+ */
153
+ escapeId(identifier) {
154
+ const id = String(identifier ?? '');
155
+ if (this.options.dialect?.escapeId) {
156
+ return this.options.dialect.escapeId(id);
157
+ }
158
+ return `"${id.replace(/"/g, '""')}"`;
159
+ }
160
+ }
161
+ exports.UpdateBuilder = UpdateBuilder;
162
+ /**
163
+ * Create an UpdateBuilder instance
164
+ */
165
+ function createUpdateBuilder(options) {
166
+ return new UpdateBuilder(options);
167
+ }
168
+ /**
169
+ * Quick helper to build an UPDATE query
170
+ */
171
+ function buildUpdateQuery(tableName, values, where, options) {
172
+ const builder = new UpdateBuilder(options);
173
+ return builder.build(tableName, values, where);
174
+ }
175
+ /**
176
+ * Quick helper to build an UPDATE query with increment/decrement
177
+ */
178
+ function buildUpdateWithOperations(tableName, operations, where, options) {
179
+ const builder = new UpdateBuilder(options);
180
+ return builder.buildWithOperations(tableName, operations, where);
181
+ }
182
+ exports.default = UpdateBuilder;
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ /**
3
+ * View Builder
4
+ * Provides an ORM-like way to create database views
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ViewBuilder = void 0;
8
+ exports.createViewBuilder = createViewBuilder;
9
+ const model_helpers_1 = require("./model-helpers");
10
+ /**
11
+ * Builder for creating database views
12
+ */
13
+ class ViewBuilder {
14
+ constructor() {
15
+ this.columns = [];
16
+ this.joins = [];
17
+ }
18
+ /**
19
+ * Set the primary model to select from
20
+ * Accepts model class or table name string
21
+ * @example
22
+ * .from(User)
23
+ * .from('users')
24
+ */
25
+ from(model) {
26
+ this.fromModel = model;
27
+ return this;
28
+ }
29
+ /**
30
+ * Add a column to select
31
+ */
32
+ selectColumn(column, opts) {
33
+ this.columns.push({
34
+ name: opts?.alias || column,
35
+ expression: opts?.expression || column,
36
+ alias: opts?.alias,
37
+ });
38
+ return this;
39
+ }
40
+ /**
41
+ * Add multiple columns at once
42
+ */
43
+ selectColumns(columns) {
44
+ columns.forEach(col => this.selectColumn(col));
45
+ return this;
46
+ }
47
+ /**
48
+ * Add all columns from a model
49
+ */
50
+ selectAll(model, opts) {
51
+ // If it's a model class with attributes, we could use those
52
+ // For now, just use * in the SQL
53
+ return this;
54
+ }
55
+ /**
56
+ * Add a join to the view
57
+ * @example
58
+ * .join({ model: Post, type: 'LEFT', on: { userId: 'users.id' } })
59
+ * .join({ model: 'posts', type: 'LEFT', on: { userId: 'users.id' } })
60
+ */
61
+ join(opts) {
62
+ this.joins.push({
63
+ model: opts.model,
64
+ type: opts.type || 'INNER',
65
+ on: opts.on,
66
+ as: opts.as,
67
+ });
68
+ return this;
69
+ }
70
+ /**
71
+ * Add WHERE conditions
72
+ */
73
+ where(conditions) {
74
+ this.whereConditions = conditions;
75
+ return this;
76
+ }
77
+ /**
78
+ * Add GROUP BY
79
+ */
80
+ groupBy(columns) {
81
+ this.groupByClause = columns;
82
+ return this;
83
+ }
84
+ /**
85
+ * Add HAVING conditions
86
+ */
87
+ having(conditions) {
88
+ this.havingConditions = conditions;
89
+ return this;
90
+ }
91
+ /**
92
+ * Add ORDER BY
93
+ */
94
+ orderBy(order) {
95
+ this.orderByClause = order;
96
+ return this;
97
+ }
98
+ /**
99
+ * Add LIMIT
100
+ */
101
+ limit(limit) {
102
+ this.limitVal = limit;
103
+ return this;
104
+ }
105
+ /**
106
+ * Add OFFSET
107
+ */
108
+ offset(offset) {
109
+ this.offsetVal = offset;
110
+ return this;
111
+ }
112
+ /**
113
+ * Add DISTINCT
114
+ */
115
+ distinct() {
116
+ this.distinctVal = true;
117
+ return this;
118
+ }
119
+ /**
120
+ * Set view options
121
+ */
122
+ options(opts) {
123
+ this.viewOptions = opts;
124
+ return this;
125
+ }
126
+ /**
127
+ * Get the view options
128
+ */
129
+ getOptions() {
130
+ return this.viewOptions || {};
131
+ }
132
+ /**
133
+ * Build the SELECT query for the view
134
+ */
135
+ toSelectQuery() {
136
+ return {
137
+ model: this.fromModel,
138
+ columns: this.columns.map(c => c.alias || c.name),
139
+ joins: this.joins,
140
+ where: this.whereConditions,
141
+ group: this.groupByClause,
142
+ having: this.havingConditions,
143
+ order: this.orderByClause,
144
+ limit: this.limitVal,
145
+ offset: this.offsetVal,
146
+ distinct: this.distinctVal,
147
+ };
148
+ }
149
+ /**
150
+ * Build and return the SQL string
151
+ */
152
+ toSQL(dialect) {
153
+ const selectParts = [];
154
+ if (this.distinctVal) {
155
+ selectParts.push('DISTINCT');
156
+ }
157
+ if (this.columns.length > 0) {
158
+ const colExprs = this.columns.map(c => {
159
+ if (typeof c.expression === 'string') {
160
+ return c.alias ? `${c.expression} AS ${dialect.escapeId(c.alias)}` : c.expression;
161
+ }
162
+ return c.expression.column;
163
+ });
164
+ selectParts.push(colExprs.join(', '));
165
+ }
166
+ else {
167
+ selectParts.push('*');
168
+ }
169
+ let sql = `SELECT ${selectParts.join(' ')}`;
170
+ if (this.fromModel) {
171
+ const tableName = (0, model_helpers_1.getTableName)(this.fromModel);
172
+ sql += ` FROM ${dialect.quoteTable(tableName)}`;
173
+ }
174
+ for (const join of this.joins) {
175
+ const joinType = join.type || 'INNER';
176
+ const tableName = (0, model_helpers_1.getTableName)(join.model);
177
+ sql += ` ${joinType} JOIN ${dialect.quoteTable(tableName)}`;
178
+ if (join.as) {
179
+ sql += ` AS ${dialect.escapeId(join.as)}`;
180
+ }
181
+ }
182
+ if (this.groupByClause) {
183
+ const cols = Array.isArray(this.groupByClause) ? this.groupByClause.join(', ') : this.groupByClause;
184
+ sql += ` GROUP BY ${cols}`;
185
+ }
186
+ if (this.limitVal) {
187
+ sql += ` LIMIT ${this.limitVal}`;
188
+ }
189
+ if (this.offsetVal) {
190
+ sql += ` OFFSET ${this.offsetVal}`;
191
+ }
192
+ return sql;
193
+ }
194
+ /**
195
+ * Reset the builder
196
+ */
197
+ reset() {
198
+ this.columns = [];
199
+ this.fromModel = undefined;
200
+ this.joins = [];
201
+ this.whereConditions = undefined;
202
+ this.groupByClause = undefined;
203
+ this.havingConditions = undefined;
204
+ this.orderByClause = undefined;
205
+ this.limitVal = undefined;
206
+ this.offsetVal = undefined;
207
+ this.distinctVal = undefined;
208
+ this.viewOptions = undefined;
209
+ }
210
+ }
211
+ exports.ViewBuilder = ViewBuilder;
212
+ /**
213
+ * Create a new view builder
214
+ */
215
+ function createViewBuilder() {
216
+ return new ViewBuilder();
217
+ }
218
+ exports.default = { ViewBuilder, createViewBuilder };