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.
- package/CHANGELOG.md +1111 -0
- package/LICENSE +21 -0
- package/README.md +573 -0
- package/dist/audit/history-query.js +180 -0
- package/dist/audit/index.js +23 -0
- package/dist/audit/logger.js +236 -0
- package/dist/cache/cache-manager.js +84 -0
- package/dist/cache/index.js +16 -0
- package/dist/cache/redis-cluster-cache.js +557 -0
- package/dist/cli.js +2200 -0
- package/dist/compliance/audit-trail.js +68 -0
- package/dist/compliance/backup-verification.js +685 -0
- package/dist/compliance/breach-detector.js +505 -0
- package/dist/compliance/consent-record.js +227 -0
- package/dist/compliance/consent-versioning.js +331 -0
- package/dist/compliance/cross-border-log.js +530 -0
- package/dist/compliance/data-classifier.js +258 -0
- package/dist/compliance/data-lineage.js +565 -0
- package/dist/compliance/data-masker.js +303 -0
- package/dist/compliance/data-portability.js +265 -0
- package/dist/compliance/data-retention.js +195 -0
- package/dist/compliance/dsar-workflow.js +342 -0
- package/dist/compliance/field-encryption.js +223 -0
- package/dist/compliance/immutable-record.js +148 -0
- package/dist/compliance/index.js +260 -0
- package/dist/compliance/privacy-impact-assessment.js +364 -0
- package/dist/compliance/pseudonymization.js +269 -0
- package/dist/compliance/query-firewall.js +1182 -0
- package/dist/compliance/rate-limiter.js +580 -0
- package/dist/compliance/right-to-erasure.js +117 -0
- package/dist/compliance/row-level-security.js +246 -0
- package/dist/compliance/security-decorator.js +574 -0
- package/dist/compliance/security-monitor.js +525 -0
- package/dist/compliance/sensitive-data-discovery.js +476 -0
- package/dist/compliance/session-isolation.js +472 -0
- package/dist/compliance/tls-enforcer.js +108 -0
- package/dist/compliance/worm-storage.js +712 -0
- package/dist/connection-manager.js +198 -0
- package/dist/connection-pool.js +519 -0
- package/dist/decorators/audit.js +136 -0
- package/dist/decorators/belongs-to-many.js +115 -0
- package/dist/decorators/belongs-to.js +115 -0
- package/dist/decorators/check.js +435 -0
- package/dist/decorators/collate.js +329 -0
- package/dist/decorators/comment.js +205 -0
- package/dist/decorators/database-settings.js +236 -0
- package/dist/decorators/default.js +244 -0
- package/dist/decorators/encryption.js +235 -0
- package/dist/decorators/engine.js +97 -0
- package/dist/decorators/fk-constraints.js +594 -0
- package/dist/decorators/foreign-table.js +136 -0
- package/dist/decorators/generated.js +274 -0
- package/dist/decorators/has-many.js +127 -0
- package/dist/decorators/has-one.js +116 -0
- package/dist/decorators/hstore.js +129 -0
- package/dist/decorators/index.js +355 -0
- package/dist/decorators/json-column.js +83 -0
- package/dist/decorators/jsonb.js +101 -0
- package/dist/decorators/orm-decorators.js +425 -0
- package/dist/decorators/permissions.js +294 -0
- package/dist/decorators/procedure.js +210 -0
- package/dist/decorators/query-options.js +556 -0
- package/dist/decorators/range.js +167 -0
- package/dist/decorators/set-column.js +83 -0
- package/dist/decorators/spatial.js +114 -0
- package/dist/decorators/storage.js +580 -0
- package/dist/decorators/timezone.js +512 -0
- package/dist/decorators/trigger.js +90 -0
- package/dist/decorators/uuid.js +135 -0
- package/dist/decorators/view.js +258 -0
- package/dist/diagrams/chen-diagram.js +354 -0
- package/dist/diagrams/class-diagram.js +384 -0
- package/dist/diagrams/dependency-diagram.js +432 -0
- package/dist/diagrams/er-diagram.js +605 -0
- package/dist/diagrams/flow-diagram.js +394 -0
- package/dist/diagrams/gantt-diagram.js +411 -0
- package/dist/diagrams/index-diagram.js +353 -0
- package/dist/diagrams/index.js +184 -0
- package/dist/diagrams/migration-diagram.js +316 -0
- package/dist/diagrams/model-diagram.js +616 -0
- package/dist/diagrams/package-diagram.js +376 -0
- package/dist/diagrams/palette.js +85 -0
- package/dist/diagrams/relational-diagram.js +455 -0
- package/dist/diagrams/schemadoc-diagram.js +309 -0
- package/dist/diagrams/sequence-diagram.js +307 -0
- package/dist/diagrams/state-diagram.js +344 -0
- package/dist/diagrams/svg-dom.js +111 -0
- package/dist/diagrams/tree-diagram.js +250 -0
- package/dist/dialects/clickhouse/index.js +1742 -0
- package/dist/dialects/cockroachdb/index.js +4677 -0
- package/dist/dialects/cratedb/index.js +441 -0
- package/dist/dialects/databricks/index.js +517 -0
- package/dist/dialects/db2/index.js +2225 -0
- package/dist/dialects/dialect.js +720 -0
- package/dist/dialects/duckdb/index.js +2014 -0
- package/dist/dialects/exasol/index.js +357 -0
- package/dist/dialects/firebird/index.js +495 -0
- package/dist/dialects/greenplum/index.js +457 -0
- package/dist/dialects/hana/index.js +1741 -0
- package/dist/dialects/mariadb/index.js +3590 -0
- package/dist/dialects/mssql/index.js +2296 -0
- package/dist/dialects/mysql/index.js +4058 -0
- package/dist/dialects/oracle/index.js +2999 -0
- package/dist/dialects/postgres/index.js +5319 -0
- package/dist/dialects/query-stream-helper.js +152 -0
- package/dist/dialects/questdb/index.js +433 -0
- package/dist/dialects/redshift/index.js +2277 -0
- package/dist/dialects/singlestore/index.js +354 -0
- package/dist/dialects/snowflake/index.js +2082 -0
- package/dist/dialects/spanner/index.js +1768 -0
- package/dist/dialects/sqlite/index.js +3382 -0
- package/dist/dialects/tidb/index.js +377 -0
- package/dist/dialects/timescaledb/index.js +164 -0
- package/dist/dialects/trino/index.js +420 -0
- package/dist/dialects/turso/index.js +227 -0
- package/dist/dialects/vertica/index.js +317 -0
- package/dist/dialects/yugabytedb/index.js +424 -0
- package/dist/errors/index.js +472 -0
- package/dist/errors/utils.js +340 -0
- package/dist/errors.js +21 -0
- package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
- package/dist/extensions/catalog/mssql-features.js +147 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
- package/dist/extensions/catalog/oracle-db2-features.js +196 -0
- package/dist/extensions/catalog/postgres-extensions.js +516 -0
- package/dist/extensions/index.js +71 -0
- package/dist/extensions/types.js +13 -0
- package/dist/foreign-data.js +173 -0
- package/dist/hooks/hooks-manager.js +350 -0
- package/dist/hooks/index.js +37 -0
- package/dist/index.js +463 -0
- package/dist/logging.js +335 -0
- package/dist/migrations/index.js +40 -0
- package/dist/migrations/migration.js +196 -0
- package/dist/migrations/migrator.js +411 -0
- package/dist/migrations/prormmigration.js +275 -0
- package/dist/migrations/query-interface.js +435 -0
- package/dist/migrations/seeder.js +353 -0
- package/dist/models/associations.js +852 -0
- package/dist/models/constraints.js +288 -0
- package/dist/models/data-types.js +2518 -0
- package/dist/models/decorators.js +445 -0
- package/dist/models/index.js +33 -0
- package/dist/models/indexes.js +531 -0
- package/dist/models/methods.js +382 -0
- package/dist/models/model-manager.js +103 -0
- package/dist/models/model.js +5349 -0
- package/dist/models/operators.js +67 -0
- package/dist/models/scopes.js +189 -0
- package/dist/models/typescript-types.js +26 -0
- package/dist/nosql/aerospike/index.js +205 -0
- package/dist/nosql/allegrograph/index.js +169 -0
- package/dist/nosql/arangodb/index.js +364 -0
- package/dist/nosql/azure-blob/index.js +206 -0
- package/dist/nosql/beanstalkd/index.js +231 -0
- package/dist/nosql/beequeue/index.js +210 -0
- package/dist/nosql/bigchaindb/index.js +195 -0
- package/dist/nosql/bigtable/index.js +224 -0
- package/dist/nosql/blazegraph/index.js +173 -0
- package/dist/nosql/bullmq/index.js +191 -0
- package/dist/nosql/cassandra/index.js +174 -0
- package/dist/nosql/chroma/index.js +190 -0
- package/dist/nosql/cloudflare-kv/index.js +220 -0
- package/dist/nosql/coherence/index.js +200 -0
- package/dist/nosql/cosmosdb/index.js +157 -0
- package/dist/nosql/couchbase/index.js +213 -0
- package/dist/nosql/dax/index.js +212 -0
- package/dist/nosql/deno-kv/index.js +206 -0
- package/dist/nosql/dgraph/index.js +171 -0
- package/dist/nosql/doris/index.js +169 -0
- package/dist/nosql/druid/index.js +162 -0
- package/dist/nosql/dynamodb/index.js +937 -0
- package/dist/nosql/elasticsearch/index.js +377 -0
- package/dist/nosql/etcd/index.js +502 -0
- package/dist/nosql/eventhubs/index.js +213 -0
- package/dist/nosql/eventstore/index.js +254 -0
- package/dist/nosql/faunadb/index.js +188 -0
- package/dist/nosql/firestore/index.js +177 -0
- package/dist/nosql/fluree/index.js +148 -0
- package/dist/nosql/fuseki/index.js +170 -0
- package/dist/nosql/gcs/index.js +172 -0
- package/dist/nosql/gearman/index.js +160 -0
- package/dist/nosql/geode/index.js +196 -0
- package/dist/nosql/graphdb/index.js +169 -0
- package/dist/nosql/graylog/index.js +188 -0
- package/dist/nosql/gridgain/index.js +171 -0
- package/dist/nosql/hazelcast/index.js +162 -0
- package/dist/nosql/hbase/index.js +230 -0
- package/dist/nosql/ignite/index.js +173 -0
- package/dist/nosql/immudb/index.js +184 -0
- package/dist/nosql/index.js +232 -0
- package/dist/nosql/infinispan/index.js +200 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.js +234 -0
- package/dist/nosql/keyspaces/index.js +189 -0
- package/dist/nosql/kinesis/index.js +253 -0
- package/dist/nosql/leveldb/index.js +153 -0
- package/dist/nosql/lmdb/index.js +160 -0
- package/dist/nosql/loki/index.js +201 -0
- package/dist/nosql/marklogic/index.js +204 -0
- package/dist/nosql/materialize/index.js +145 -0
- package/dist/nosql/meilisearch/index.js +154 -0
- package/dist/nosql/memcached/index.js +223 -0
- package/dist/nosql/milvus/index.js +410 -0
- package/dist/nosql/minio/index.js +265 -0
- package/dist/nosql/momento/index.js +179 -0
- package/dist/nosql/mongodb/index.js +461 -0
- package/dist/nosql/nats/index.js +247 -0
- package/dist/nosql/nedb/index.js +164 -0
- package/dist/nosql/neo4j/index.js +450 -0
- package/dist/nosql/neptune/index.js +470 -0
- package/dist/nosql/nsq/index.js +200 -0
- package/dist/nosql/opensearch/index.js +186 -0
- package/dist/nosql/orientdb/index.js +175 -0
- package/dist/nosql/papertrail/index.js +200 -0
- package/dist/nosql/pinecone/index.js +0 -0
- package/dist/nosql/pinot/index.js +133 -0
- package/dist/nosql/pouchdb/index.js +172 -0
- package/dist/nosql/prometheus/index.js +174 -0
- package/dist/nosql/provendb/index.js +147 -0
- package/dist/nosql/pubsub/index.js +187 -0
- package/dist/nosql/pulsar/index.js +232 -0
- package/dist/nosql/qdrant/index.js +295 -0
- package/dist/nosql/qldb/index.js +192 -0
- package/dist/nosql/r2/index.js +281 -0
- package/dist/nosql/rabbitmq/index.js +237 -0
- package/dist/nosql/ravendb/index.js +175 -0
- package/dist/nosql/redis/index.js +607 -0
- package/dist/nosql/redpanda/index.js +237 -0
- package/dist/nosql/resque/index.js +203 -0
- package/dist/nosql/rethinkdb/index.js +232 -0
- package/dist/nosql/rocksdb/index.js +152 -0
- package/dist/nosql/rockset/index.js +126 -0
- package/dist/nosql/s3/index.js +298 -0
- package/dist/nosql/scylladb/index.js +178 -0
- package/dist/nosql/signoz/index.js +227 -0
- package/dist/nosql/sns/index.js +201 -0
- package/dist/nosql/solr/index.js +231 -0
- package/dist/nosql/splunk/index.js +227 -0
- package/dist/nosql/sqs/index.js +246 -0
- package/dist/nosql/stardog/index.js +169 -0
- package/dist/nosql/starrocks/index.js +170 -0
- package/dist/nosql/store.js +2 -0
- package/dist/nosql/sumologic/index.js +213 -0
- package/dist/nosql/surrealdb/index.js +179 -0
- package/dist/nosql/terminusdb/index.js +151 -0
- package/dist/nosql/tigergraph/index.js +469 -0
- package/dist/nosql/typesense/index.js +148 -0
- package/dist/nosql/unqlite/index.js +157 -0
- package/dist/nosql/upstash/index.js +167 -0
- package/dist/nosql/vercel-kv/index.js +166 -0
- package/dist/nosql/victoriametrics/index.js +213 -0
- package/dist/nosql/virtuoso/index.js +169 -0
- package/dist/nosql/weaviate/index.js +276 -0
- package/dist/operators/index.js +108 -0
- package/dist/operators.js +2690 -0
- package/dist/prisma-migrate/index.js +38 -0
- package/dist/prisma-migrate/migration-generator.js +125 -0
- package/dist/prisma-migrate/model-generator.js +172 -0
- package/dist/prisma-migrate/relations.js +100 -0
- package/dist/prisma-migrate/schema-parser.js +167 -0
- package/dist/prisma-migrate/type-mapper.js +40 -0
- package/dist/prorm.js +6832 -0
- package/dist/query-builders/cte-builder.js +80 -0
- package/dist/query-builders/functions/aggregate.js +390 -0
- package/dist/query-builders/functions/conditional.js +503 -0
- package/dist/query-builders/functions/datetime.js +695 -0
- package/dist/query-builders/functions/fulltext.js +439 -0
- package/dist/query-builders/functions/index.js +93 -0
- package/dist/query-builders/functions/json.js +427 -0
- package/dist/query-builders/functions/math.js +399 -0
- package/dist/query-builders/functions/string.js +518 -0
- package/dist/query-builders/functions/window.js +328 -0
- package/dist/query-builders/include-builder.js +323 -0
- package/dist/query-builders/index-expression-builder.js +242 -0
- package/dist/query-builders/index.js +161 -0
- package/dist/query-builders/insert-builder.js +164 -0
- package/dist/query-builders/model-helpers.js +38 -0
- package/dist/query-builders/order-limit-builder.js +239 -0
- package/dist/query-builders/sql-compiler.js +2040 -0
- package/dist/query-builders/subquery-builder.js +152 -0
- package/dist/query-builders/update-builder.js +182 -0
- package/dist/query-builders/view-builder.js +218 -0
- package/dist/query-builders/where-builder.js +1532 -0
- package/dist/query-interface.js +622 -0
- package/dist/query-optimizers/batch-optimizer.js +426 -0
- package/dist/query-optimizers/explain-plans.js +415 -0
- package/dist/query-optimizers/index.js +51 -0
- package/dist/query-optimizers/prepared-statement-cache.js +423 -0
- package/dist/query-optimizers/query-hints.js +438 -0
- package/dist/query-optimizers/query-optimizer.js +278 -0
- package/dist/query-optimizers/slow-query-logger.js +271 -0
- package/dist/replica-manager.js +507 -0
- package/dist/schema/index.js +15 -0
- package/dist/schema/migration-generator.js +374 -0
- package/dist/schema/schema-differ.js +549 -0
- package/dist/schema/types.js +6 -0
- package/dist/sql-constants.js +300 -0
- package/dist/sqlite-advanced.js +1047 -0
- package/dist/streams/index.js +12 -0
- package/dist/streams/transforms.js +178 -0
- package/dist/transaction.js +456 -0
- package/dist/types/index.js +180 -0
- package/dist/user-management.js +127 -0
- package/dist/utils/date.js +300 -0
- package/dist/utils/index.js +1079 -0
- package/dist/utils/string.js +161 -0
- package/dist/validators/index.js +19 -0
- package/dist/validators/validator.js +911 -0
- 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
|
+
}
|