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,329 @@
1
+ "use strict";
2
+ /**
3
+ * Database Collate and Locale Decorators / Annotations for ts-prorm-orm
4
+ *
5
+ * Provides decorators and enums for managing database collation, locale settings,
6
+ * and encoding options at the column, table, and database levels.
7
+ *
8
+ * Usage:
9
+ *
10
+ * // Column-level collation
11
+ * class User extends Model {
12
+ * @SetCollate(CollateEnum.UTF8MB4_UNICODE_CI)
13
+ * @Column
14
+ * name: string;
15
+ *
16
+ * @SetCollate(CollateEnum.UTF8MB4_BIN)
17
+ * @Column
18
+ * password: string;
19
+ * }
20
+ *
21
+ * // Table-level collation
22
+ * @TableCollate({ collate: CollateEnum.UTF8MB4_SPANISH_CI })
23
+ * class User extends Model {}
24
+ *
25
+ * // Database-level locale settings
26
+ * @Database({
27
+ * name: 'miapp',
28
+ * encoding: 'UTF8',
29
+ * lcCollate: LocaleEnum.ES_ES,
30
+ * lcCtype: LocaleEnum.ES_ES,
31
+ * })
32
+ * class Config extends Model {}
33
+ *
34
+ * // Create database with locale
35
+ * await prorm.createDatabase({
36
+ * name: 'miapp',
37
+ * encoding: 'UTF8',
38
+ * lcCollate: 'es_ES.UTF-8',
39
+ * lcCtype: 'es_ES.UTF-8',
40
+ * template: 'template0',
41
+ * });
42
+ */
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.Locale = exports.LocaleEnum = exports.Collate = exports.CollateEnum = void 0;
45
+ exports.SetCollate = SetCollate;
46
+ exports.Database = Database;
47
+ exports.TableCollate = TableCollate;
48
+ exports.OrderBy = OrderBy;
49
+ exports.getCollateMetadata = getCollateMetadata;
50
+ exports.getColumnCollate = getColumnCollate;
51
+ exports.getDatabaseOptions = getDatabaseOptions;
52
+ exports.getTableCollateOptions = getTableCollateOptions;
53
+ exports.getOrderByOptions = getOrderByOptions;
54
+ exports.clearCollateMetadata = clearCollateMetadata;
55
+ exports.generateCreateDatabaseSQL = generateCreateDatabaseSQL;
56
+ exports.generateAlterTableCollateSQL = generateAlterTableCollateSQL;
57
+ exports.generateColumnCollateSQL = generateColumnCollateSQL;
58
+ // ==================== Collate Enum ====================
59
+ /**
60
+ * MySQL/MariaDB collation constants
61
+ */
62
+ exports.CollateEnum = {
63
+ // UTF-8 collations
64
+ UTF8_GENERAL_CI: 'utf8_general_ci',
65
+ UTF8_UNICODE_CI: 'utf8_unicode_ci',
66
+ UTF8MB4_GENERAL_CI: 'utf8mb4_general_ci',
67
+ UTF8MB4_UNICODE_CI: 'utf8mb4_unicode_ci',
68
+ UTF8MB4_BIN: 'utf8mb4_bin',
69
+ // Spanish
70
+ UTF8MB4_SPANISH_CI: 'utf8mb4_spanish_ci',
71
+ UTF8MB4_SPANISH2_CI: 'utf8mb4_spanish2_ci',
72
+ // German
73
+ UTF8MB4_GERMAN_CI: 'utf8mb4_german_ci',
74
+ // Swedish
75
+ UTF8MB4_SWEDISH_CI: 'utf8mb4_swedish_ci',
76
+ // Unicode
77
+ UTF8MB4_NOPAD: 'utf8mb4_nopad',
78
+ UTF8_NOPAD: 'utf8_nopad',
79
+ // Binary
80
+ BINARY: 'binary',
81
+ // ASCII
82
+ ASCII_GENERAL_CI: 'ascii_general_ci',
83
+ ASCII_BIN: 'ascii_bin',
84
+ };
85
+ /**
86
+ * @deprecated Use CollateEnum instead
87
+ */
88
+ exports.Collate = exports.CollateEnum;
89
+ // ==================== Locale Enum ====================
90
+ /**
91
+ * Common database locales for POSIX locale strings
92
+ */
93
+ exports.LocaleEnum = {
94
+ // Spanish locales
95
+ ES_ES: 'es_ES.UTF-8',
96
+ ES_MX: 'es_MX.UTF-8',
97
+ ES_AR: 'es_AR.UTF-8',
98
+ ES_CO: 'es_CO.UTF-8',
99
+ ES_CL: 'es_CL.UTF-8',
100
+ // English locales
101
+ EN_US: 'en_US.UTF-8',
102
+ EN_GB: 'en_GB.UTF-8',
103
+ EN_AU: 'en_AU.UTF-8',
104
+ EN_CA: 'en_CA.UTF-8',
105
+ // German locale
106
+ DE_DE: 'de_DE.UTF-8',
107
+ DE_AT: 'de_AT.UTF-8',
108
+ DE_CH: 'de_CH.UTF-8',
109
+ // French locales
110
+ FR_FR: 'fr_FR.UTF-8',
111
+ FR_CA: 'fr_CA.UTF-8',
112
+ // Portuguese locales
113
+ PT_BR: 'pt_BR.UTF-8',
114
+ PT_PT: 'pt_PT.UTF-8',
115
+ // Italian
116
+ IT_IT: 'it_IT.UTF-8',
117
+ // Dutch
118
+ NL_NL: 'nl_NL.UTF-8',
119
+ NL_BE: 'nl_BE.UTF-8',
120
+ // Swedish
121
+ SV_SE: 'sv_SE.UTF-8',
122
+ // Norwegian
123
+ NB_NO: 'nb_NO.UTF-8',
124
+ NN_NO: 'nn_NO.UTF-8',
125
+ // Danish
126
+ DA_DK: 'da_DK.UTF-8',
127
+ // Finnish
128
+ FI_FI: 'fi_FI.UTF-8',
129
+ // Polish
130
+ PL_PL: 'pl_PL.UTF-8',
131
+ // Russian
132
+ RU_RU: 'ru_RU.UTF-8',
133
+ // Japanese
134
+ JA_JP: 'ja_JP.UTF-8',
135
+ // Chinese
136
+ ZH_CN: 'zh_CN.UTF-8',
137
+ ZH_TW: 'zh_TW.UTF-8',
138
+ ZH_HK: 'zh_HK.UTF-8',
139
+ // Korean
140
+ KO_KR: 'ko_KR.UTF-8',
141
+ // Arabic
142
+ AR_SA: 'ar_SA.UTF-8',
143
+ };
144
+ /**
145
+ * @deprecated Use LocaleEnum instead
146
+ */
147
+ exports.Locale = exports.LocaleEnum;
148
+ // ==================== Metadata Storage ====================
149
+ /**
150
+ * Storage for collate metadata on classes and properties
151
+ */
152
+ const collateMetadata = new Map();
153
+ const databaseMetadata = new Map();
154
+ const tableCollateMetadata = new Map();
155
+ const orderByMetadata = new Map();
156
+ // ==================== Decorators ====================
157
+ /**
158
+ * Decorator to set column-level collation
159
+ *
160
+ * Usage:
161
+ * @Collate(Collate.UTF8MB4_UNICODE_CI)
162
+ * @Column
163
+ * name: string;
164
+ *
165
+ * Or with options:
166
+ * @Collate({ collate: Collate.UTF8MB4_BIN, unique: true })
167
+ * @Column
168
+ * email: string;
169
+ */
170
+ /**
171
+ * Decorator to set column-level collation
172
+ *
173
+ * Usage:
174
+ * @SetCollate(CollateEnum.UTF8MB4_UNICODE_CI)
175
+ * @Column
176
+ * name: string;
177
+ *
178
+ * Or with options:
179
+ * @SetCollate({ collate: CollateEnum.UTF8MB4_BIN, unique: true })
180
+ * @Column
181
+ * email: string;
182
+ */
183
+ function SetCollate(collation) {
184
+ return function (target, propertyKey) {
185
+ if (propertyKey && typeof propertyKey === 'string') {
186
+ // Property decorator (column-level)
187
+ if (!collateMetadata.has(target.constructor)) {
188
+ collateMetadata.set(target.constructor, new Map());
189
+ }
190
+ const meta = typeof collation === 'string' ? { collate: collation } : collation;
191
+ collateMetadata.get(target.constructor).set(propertyKey, meta.collate);
192
+ }
193
+ else if (propertyKey === undefined) {
194
+ // Class decorator - store the collate for later use with @Column
195
+ if (!collateMetadata.has(target)) {
196
+ collateMetadata.set(target, new Map());
197
+ }
198
+ }
199
+ };
200
+ }
201
+ /**
202
+ * Decorator to set database-level options
203
+ *
204
+ * Usage:
205
+ * @Database({
206
+ * name: 'miapp',
207
+ * encoding: 'UTF8',
208
+ * lcCollate: 'es_ES.UTF-8',
209
+ * lcCtype: 'es_ES.UTF-8',
210
+ * connectionLimit: 25,
211
+ * })
212
+ * class Config extends Model {}
213
+ */
214
+ function Database(options) {
215
+ return function (target) {
216
+ databaseMetadata.set(target, options);
217
+ };
218
+ }
219
+ /**
220
+ * Decorator to set table-level collation and options
221
+ *
222
+ * Usage:
223
+ * @TableCollate({ collate: 'utf8mb4_spanish_ci', engine: 'InnoDB' })
224
+ * class User extends Model {}
225
+ */
226
+ function TableCollate(options) {
227
+ return function (target) {
228
+ tableCollateMetadata.set(target, options);
229
+ };
230
+ }
231
+ /**
232
+ * Decorator to specify order by with collation
233
+ *
234
+ * Usage:
235
+ * @OrderBy('name', 'ASC', Collate.UTF8MB4_SPANISH_CI)
236
+ * class User extends Model {}
237
+ */
238
+ function OrderBy(column, direction = 'ASC', collate) {
239
+ return function (target) {
240
+ const existing = orderByMetadata.get(target) || [];
241
+ existing.push({ column, direction, collate });
242
+ orderByMetadata.set(target, existing);
243
+ };
244
+ }
245
+ // ==================== Helper Functions ====================
246
+ /**
247
+ * Get collation metadata for a model class
248
+ */
249
+ function getCollateMetadata(target) {
250
+ return collateMetadata.get(target) || new Map();
251
+ }
252
+ /**
253
+ * Get column collation from a model class and property
254
+ */
255
+ function getColumnCollate(target, propertyKey) {
256
+ const classMeta = collateMetadata.get(target);
257
+ if (classMeta) {
258
+ return classMeta.get(propertyKey);
259
+ }
260
+ return undefined;
261
+ }
262
+ /**
263
+ * Get database options for a model class
264
+ */
265
+ function getDatabaseOptions(target) {
266
+ return databaseMetadata.get(target);
267
+ }
268
+ /**
269
+ * Get table collation options for a model class
270
+ */
271
+ function getTableCollateOptions(target) {
272
+ return tableCollateMetadata.get(target);
273
+ }
274
+ /**
275
+ * Get order by options for a model class
276
+ */
277
+ function getOrderByOptions(target) {
278
+ return orderByMetadata.get(target) || [];
279
+ }
280
+ /**
281
+ * Clear all collate metadata (useful for testing)
282
+ */
283
+ function clearCollateMetadata() {
284
+ collateMetadata.clear();
285
+ databaseMetadata.clear();
286
+ tableCollateMetadata.clear();
287
+ orderByMetadata.clear();
288
+ }
289
+ /**
290
+ * Generate SQL for creating a database with locale settings
291
+ */
292
+ function generateCreateDatabaseSQL(options) {
293
+ const parts = [];
294
+ parts.push(`CREATE DATABASE ${options.name}`);
295
+ if (options.encoding) {
296
+ parts.push(`ENCODING = '${options.encoding}'`);
297
+ }
298
+ if (options.lcCollate) {
299
+ parts.push(`LC_COLLATE = '${options.lcCollate}'`);
300
+ }
301
+ if (options.lcCtype) {
302
+ parts.push(`LC_CTYPE = '${options.lcCtype}'`);
303
+ }
304
+ if (options.template) {
305
+ parts.push(`TEMPLATE = ${options.template}`);
306
+ }
307
+ if (options.tablespace) {
308
+ parts.push(`TABLESPACE = ${options.tablespace}`);
309
+ }
310
+ if (options.isTemplate !== undefined) {
311
+ parts.push(options.isTemplate ? 'IS_TEMPLATE = true' : 'IS_TEMPLATE = false');
312
+ }
313
+ if (options.collate) {
314
+ parts.push(`COLLATE = '${options.collate}'`);
315
+ }
316
+ return parts.join(' ');
317
+ }
318
+ /**
319
+ * Generate SQL for altering table collation
320
+ */
321
+ function generateAlterTableCollateSQL(tableName, collate) {
322
+ return `ALTER TABLE ${tableName} CONVERT TO CHARACTER SET utf8mb4 COLLATE ${collate}`;
323
+ }
324
+ /**
325
+ * Generate SQL for column collation
326
+ */
327
+ function generateColumnCollateSQL(columnName, collate) {
328
+ return `MODIFY ${columnName} VARCHAR(255) CHARACTER SET utf8mb4 COLLATE ${collate}`;
329
+ }
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ /**
3
+ * @Comment decorator for database schema annotations
4
+ *
5
+ * Provides the ability to add comments to various database objects:
6
+ * - Table-level comments (on model classes)
7
+ * - Column-level comments (on model fields)
8
+ * - Index comments
9
+ * - Constraint comments
10
+ *
11
+ * Usage:
12
+ *
13
+ * @Comment('This table stores user information')
14
+ * class User extends Model { ... }
15
+ *
16
+ * @Column
17
+ * @Comment('User unique identifier')
18
+ * id: number;
19
+ *
20
+ * @Column
21
+ * @Comment('User email address')
22
+ * email: string;
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.CommentRegistry = void 0;
26
+ exports.Comment = Comment;
27
+ exports.getTableComment = getTableComment;
28
+ exports.getFieldComment = getFieldComment;
29
+ exports.getAllFieldComments = getAllFieldComments;
30
+ exports.setIndexComment = setIndexComment;
31
+ exports.getIndexComment = getIndexComment;
32
+ exports.getAllIndexComments = getAllIndexComments;
33
+ exports.setConstraintComment = setConstraintComment;
34
+ exports.getConstraintComment = getConstraintComment;
35
+ exports.getAllConstraintComments = getAllConstraintComments;
36
+ exports.generateCommentSQL = generateCommentSQL;
37
+ exports.generateIndexCommentSQL = generateIndexCommentSQL;
38
+ exports.generateConstraintCommentSQL = generateConstraintCommentSQL;
39
+ const TABLE_COMMENT_KEY = '__orm_table_comment__';
40
+ const FIELD_COMMENTS_KEY = '__orm_field_comments__';
41
+ const fieldCommentMap = new Map();
42
+ const tableCommentMap = new Map();
43
+ const indexCommentMap = new Map();
44
+ const constraintCommentMap = new Map();
45
+ function Comment(value) {
46
+ return function (target, propertyKey) {
47
+ const comment = value;
48
+ if (!propertyKey && typeof target === 'function') {
49
+ target[TABLE_COMMENT_KEY] = comment;
50
+ tableCommentMap.set(target, comment);
51
+ return;
52
+ }
53
+ if (propertyKey) {
54
+ const fieldName = String(propertyKey);
55
+ const constructor = typeof target === 'function' ? target : target.constructor;
56
+ if (!constructor[FIELD_COMMENTS_KEY]) {
57
+ constructor[FIELD_COMMENTS_KEY] = {};
58
+ }
59
+ constructor[FIELD_COMMENTS_KEY][fieldName] = comment;
60
+ if (!fieldCommentMap.has(constructor)) {
61
+ fieldCommentMap.set(constructor, new Map());
62
+ }
63
+ fieldCommentMap.get(constructor).set(fieldName, comment);
64
+ }
65
+ };
66
+ }
67
+ function getTableComment(target) {
68
+ return target[TABLE_COMMENT_KEY] ?? tableCommentMap.get(target);
69
+ }
70
+ function getFieldComment(target, fieldName) {
71
+ const fieldMap = target[FIELD_COMMENTS_KEY];
72
+ if (fieldMap) {
73
+ return fieldMap[fieldName];
74
+ }
75
+ return fieldCommentMap.get(target)?.get(fieldName);
76
+ }
77
+ function getAllFieldComments(target) {
78
+ const fieldMap = target[FIELD_COMMENTS_KEY];
79
+ if (fieldMap) {
80
+ return { ...fieldMap };
81
+ }
82
+ const map = fieldCommentMap.get(target);
83
+ return map ? Object.fromEntries(map) : {};
84
+ }
85
+ function setIndexComment(target, indexName, comment) {
86
+ if (!indexCommentMap.has(target)) {
87
+ indexCommentMap.set(target, new Map());
88
+ }
89
+ indexCommentMap.get(target).set(indexName, comment);
90
+ }
91
+ function getIndexComment(target, indexName) {
92
+ return indexCommentMap.get(target)?.get(indexName);
93
+ }
94
+ function getAllIndexComments(target) {
95
+ const map = indexCommentMap.get(target);
96
+ return map ? Object.fromEntries(map) : {};
97
+ }
98
+ function setConstraintComment(target, constraintName, comment) {
99
+ if (!constraintCommentMap.has(target)) {
100
+ constraintCommentMap.set(target, new Map());
101
+ }
102
+ constraintCommentMap.get(target).set(constraintName, comment);
103
+ }
104
+ function getConstraintComment(target, constraintName) {
105
+ return constraintCommentMap.get(target)?.get(constraintName);
106
+ }
107
+ function getAllConstraintComments(target) {
108
+ const map = constraintCommentMap.get(target);
109
+ return map ? Object.fromEntries(map) : {};
110
+ }
111
+ exports.CommentRegistry = {
112
+ getTableComment,
113
+ getFieldComment,
114
+ getAllFieldComments,
115
+ setIndexComment,
116
+ getIndexComment,
117
+ getAllIndexComments,
118
+ setConstraintComment,
119
+ getConstraintComment,
120
+ getAllConstraintComments,
121
+ clearComments(target) {
122
+ tableCommentMap.delete(target);
123
+ fieldCommentMap.delete(target);
124
+ indexCommentMap.delete(target);
125
+ constraintCommentMap.delete(target);
126
+ delete target[TABLE_COMMENT_KEY];
127
+ delete target[FIELD_COMMENTS_KEY];
128
+ },
129
+ };
130
+ function generateCommentSQL(target, tableName, dialect = 'mysql') {
131
+ const statements = [];
132
+ const table = tableName ?? target.name;
133
+ // SQLite has no COMMENT DDL of any kind — this is a genuine no-op.
134
+ if (dialect === 'sqlite') {
135
+ return statements;
136
+ }
137
+ const tableComment = getTableComment(target);
138
+ if (tableComment) {
139
+ const escapedComment = tableComment.replace(/'/g, "''");
140
+ switch (dialect) {
141
+ case 'postgres':
142
+ statements.push(`COMMENT ON TABLE "${table}" IS '${escapedComment}'`);
143
+ break;
144
+ case 'oracle':
145
+ statements.push(`COMMENT ON TABLE "${table}" IS '${escapedComment}'`);
146
+ break;
147
+ case 'mssql':
148
+ statements.push(`EXEC sp_addextendedproperty @name = N'MS_Description', @value = N'${escapedComment}', ` +
149
+ `@level0type = N'SCHEMA', @level0name = N'dbo', ` +
150
+ `@level1type = N'TABLE', @level1name = N'${table}'`);
151
+ break;
152
+ case 'mysql':
153
+ case 'mariadb':
154
+ default:
155
+ statements.push(`ALTER TABLE \`${table}\` COMMENT = '${escapedComment}'`);
156
+ break;
157
+ }
158
+ }
159
+ const fieldComments = getAllFieldComments(target);
160
+ for (const [fieldName, fieldComment] of Object.entries(fieldComments)) {
161
+ const escapedComment = fieldComment.replace(/'/g, "''");
162
+ switch (dialect) {
163
+ case 'postgres':
164
+ statements.push(`COMMENT ON COLUMN "${table}"."${fieldName}" IS '${escapedComment}'`);
165
+ break;
166
+ case 'oracle':
167
+ statements.push(`COMMENT ON COLUMN "${table}"."${fieldName}" IS '${escapedComment}'`);
168
+ break;
169
+ case 'mssql':
170
+ statements.push(`EXEC sp_addextendedproperty @name = N'MS_Description', @value = N'${escapedComment}', ` +
171
+ `@level0type = N'SCHEMA', @level0name = N'dbo', ` +
172
+ `@level1type = N'TABLE', @level1name = N'${table}', ` +
173
+ `@level2type = N'COLUMN', @level2name = N'${fieldName}'`);
174
+ break;
175
+ case 'mysql':
176
+ case 'mariadb':
177
+ default:
178
+ statements.push(`ALTER TABLE \`${table}\` MODIFY \`${fieldName}\` COMMENT '${escapedComment}'`);
179
+ break;
180
+ }
181
+ }
182
+ return statements;
183
+ }
184
+ function generateIndexCommentSQL(target, tableName, dialect = 'mysql') {
185
+ const statements = [];
186
+ const indexComments = getAllIndexComments(target);
187
+ for (const [indexName, idxComment] of Object.entries(indexComments)) {
188
+ const escapedComment = idxComment.replace(/'/g, "''");
189
+ if (dialect === 'postgres') {
190
+ statements.push(`COMMENT ON INDEX "${indexName}" IS '${escapedComment}'`);
191
+ }
192
+ }
193
+ return statements;
194
+ }
195
+ function generateConstraintCommentSQL(target, tableName, dialect = 'mysql') {
196
+ const statements = [];
197
+ const constraintComments = getAllConstraintComments(target);
198
+ for (const [constraintName, constrComment] of Object.entries(constraintComments)) {
199
+ const escapedComment = constrComment.replace(/'/g, "''");
200
+ if (dialect === 'postgres') {
201
+ statements.push(`COMMENT ON CONSTRAINT "${constraintName}" ON "${tableName}" IS '${escapedComment}'`);
202
+ }
203
+ }
204
+ return statements;
205
+ }