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