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,472 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Error classes for the ORM
|
|
4
|
+
* Provides structured error handling with error codes for programmatic handling
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.EmptyResultError = exports.AssociationError = exports.BulkRecordError = exports.ResourceLockedError = exports.TimeoutError = exports.ExclusionConstraintError = exports.ForeignKeyConstraintError = exports.UniqueConstraintError = exports.ValidationError = exports.DatabaseError = exports.ConnectionError = exports.PrormError = exports.ErrorCodes = void 0;
|
|
8
|
+
exports.isPrormError = isPrormError;
|
|
9
|
+
exports.isValidationError = isValidationError;
|
|
10
|
+
exports.isConnectionError = isConnectionError;
|
|
11
|
+
exports.isConstraintError = isConstraintError;
|
|
12
|
+
exports.isEmptyResultError = isEmptyResultError;
|
|
13
|
+
// Error code constants for programmatic error handling
|
|
14
|
+
exports.ErrorCodes = {
|
|
15
|
+
// Connection errors
|
|
16
|
+
CONNECTION_ERROR: 'CONNECTION_ERROR',
|
|
17
|
+
CONNECTION_REFUSED: 'CONNECTION_REFUSED',
|
|
18
|
+
CONNECTION_TIMED_OUT: 'CONNECTION_TIMED_OUT',
|
|
19
|
+
HOST_NOT_REACHABLE: 'HOST_NOT_REACHABLE',
|
|
20
|
+
INVALID_CONNECTION: 'INVALID_CONNECTION',
|
|
21
|
+
// Database errors
|
|
22
|
+
DATABASE_ERROR: 'DATABASE_ERROR',
|
|
23
|
+
QUERY_ERROR: 'QUERY_ERROR',
|
|
24
|
+
UNKNOWN: 'UNKNOWN',
|
|
25
|
+
// Validation errors
|
|
26
|
+
VALIDATION_ERROR: 'VALIDATION_ERROR',
|
|
27
|
+
VALIDATION_FAILED: 'VALIDATION_FAILED',
|
|
28
|
+
// Constraint errors
|
|
29
|
+
UNIQUE_CONSTRAINT_ERROR: 'UNIQUE_CONSTRAINT_ERROR',
|
|
30
|
+
FOREIGN_KEY_CONSTRAINT_ERROR: 'FOREIGN_KEY_CONSTRAINT_ERROR',
|
|
31
|
+
EXCLUSION_CONSTRAINT_ERROR: 'EXCLUSION_CONSTRAINT_ERROR',
|
|
32
|
+
CHECK_CONSTRAINT_ERROR: 'CHECK_CONSTRAINT_ERROR',
|
|
33
|
+
NOT_NULL_CONSTRAINT_ERROR: 'NOT_NULL_CONSTRAINT_ERROR',
|
|
34
|
+
// Resource errors
|
|
35
|
+
TIMEOUT_ERROR: 'TIMEOUT_ERROR',
|
|
36
|
+
RESOURCE_LOCKED_ERROR: 'RESOURCE_LOCKED_ERROR',
|
|
37
|
+
DEADLOCK_ERROR: 'DEADLOCK_ERROR',
|
|
38
|
+
// Bulk operation errors
|
|
39
|
+
BULK_RECORD_ERROR: 'BULK_RECORD_ERROR',
|
|
40
|
+
// Association errors
|
|
41
|
+
ASSOCIATION_ERROR: 'ASSOCIATION_ERROR',
|
|
42
|
+
EAGER_LOAD_ERROR: 'EAGER_LOAD_ERROR',
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Base error class for all Prorm errors
|
|
46
|
+
*/
|
|
47
|
+
class PrormError extends Error {
|
|
48
|
+
constructor(message, options = {}) {
|
|
49
|
+
super(message);
|
|
50
|
+
this.name = this.constructor.name;
|
|
51
|
+
this.code = options.code || exports.ErrorCodes.UNKNOWN;
|
|
52
|
+
this.parent = options.parent;
|
|
53
|
+
this.sql = options.sql;
|
|
54
|
+
this.metadata = options.metadata;
|
|
55
|
+
// Maintains proper stack trace for where our error was thrown (V8 engines)
|
|
56
|
+
if (Error.captureStackTrace) {
|
|
57
|
+
Error.captureStackTrace(this, PrormError);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Convert to JSON for serialization
|
|
62
|
+
*/
|
|
63
|
+
toJSON() {
|
|
64
|
+
return {
|
|
65
|
+
name: this.name,
|
|
66
|
+
message: this.message,
|
|
67
|
+
code: this.code,
|
|
68
|
+
parent: this.parent?.message,
|
|
69
|
+
sql: this.sql,
|
|
70
|
+
metadata: this.metadata,
|
|
71
|
+
stack: this.stack,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.PrormError = PrormError;
|
|
76
|
+
/**
|
|
77
|
+
* Error for database connection issues
|
|
78
|
+
*/
|
|
79
|
+
class ConnectionError extends PrormError {
|
|
80
|
+
constructor(message = 'Unable to connect to database', options = {}) {
|
|
81
|
+
super(message, {
|
|
82
|
+
code: options.code || exports.ErrorCodes.CONNECTION_ERROR,
|
|
83
|
+
parent: options.parent,
|
|
84
|
+
sql: options.sql,
|
|
85
|
+
metadata: {
|
|
86
|
+
database: options.database,
|
|
87
|
+
host: options.host,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
this.database = options.database;
|
|
91
|
+
this.host = options.host;
|
|
92
|
+
this.name = 'ConnectionError';
|
|
93
|
+
if (Error.captureStackTrace) {
|
|
94
|
+
Error.captureStackTrace(this, ConnectionError);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create a connection refused error
|
|
99
|
+
*/
|
|
100
|
+
static refused(options = {}) {
|
|
101
|
+
return new ConnectionError('Connection refused', {
|
|
102
|
+
code: exports.ErrorCodes.CONNECTION_REFUSED,
|
|
103
|
+
...options,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Create a connection timeout error
|
|
108
|
+
*/
|
|
109
|
+
static timedOut(options = {}) {
|
|
110
|
+
return new ConnectionError('Connection timed out', {
|
|
111
|
+
code: exports.ErrorCodes.CONNECTION_TIMED_OUT,
|
|
112
|
+
...options,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Create a host unreachable error
|
|
117
|
+
*/
|
|
118
|
+
static unreachable(options = {}) {
|
|
119
|
+
return new ConnectionError('Database host not reachable', {
|
|
120
|
+
code: exports.ErrorCodes.HOST_NOT_REACHABLE,
|
|
121
|
+
...options,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Create an invalid connection error
|
|
126
|
+
*/
|
|
127
|
+
static invalid(options = {}) {
|
|
128
|
+
return new ConnectionError('Invalid connection configuration', {
|
|
129
|
+
code: exports.ErrorCodes.INVALID_CONNECTION,
|
|
130
|
+
...options,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.ConnectionError = ConnectionError;
|
|
135
|
+
/**
|
|
136
|
+
* Error for general database errors
|
|
137
|
+
*/
|
|
138
|
+
class DatabaseError extends PrormError {
|
|
139
|
+
constructor(message = 'Database error occurred', options = {}) {
|
|
140
|
+
super(message, {
|
|
141
|
+
code: options.code || exports.ErrorCodes.DATABASE_ERROR,
|
|
142
|
+
parent: options.parent,
|
|
143
|
+
sql: options.sql,
|
|
144
|
+
metadata: {
|
|
145
|
+
original: options.original,
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
this.original = options.original;
|
|
149
|
+
this.name = 'DatabaseError';
|
|
150
|
+
if (Error.captureStackTrace) {
|
|
151
|
+
Error.captureStackTrace(this, DatabaseError);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Create from a parent error
|
|
156
|
+
*/
|
|
157
|
+
static from(parent, options = {}) {
|
|
158
|
+
return new DatabaseError(options.message || parent.message, {
|
|
159
|
+
code: exports.ErrorCodes.QUERY_ERROR,
|
|
160
|
+
parent,
|
|
161
|
+
sql: options.sql,
|
|
162
|
+
original: parent.message,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.DatabaseError = DatabaseError;
|
|
167
|
+
/**
|
|
168
|
+
* Error for validation failures
|
|
169
|
+
*/
|
|
170
|
+
class ValidationError extends PrormError {
|
|
171
|
+
constructor(message = 'Validation error', errors = []) {
|
|
172
|
+
super(message, {
|
|
173
|
+
code: exports.ErrorCodes.VALIDATION_ERROR,
|
|
174
|
+
metadata: { errors },
|
|
175
|
+
});
|
|
176
|
+
this.errors = errors;
|
|
177
|
+
this.name = 'ValidationError';
|
|
178
|
+
if (Error.captureStackTrace) {
|
|
179
|
+
Error.captureStackTrace(this, ValidationError);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get all validation error messages
|
|
184
|
+
*/
|
|
185
|
+
getMessages() {
|
|
186
|
+
return this.errors.map((err) => err.message);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get errors for a specific field
|
|
190
|
+
*/
|
|
191
|
+
getFieldErrors(path) {
|
|
192
|
+
return this.errors.filter((err) => err.path === path);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
exports.ValidationError = ValidationError;
|
|
196
|
+
/**
|
|
197
|
+
* Error for unique constraint violations
|
|
198
|
+
*/
|
|
199
|
+
class UniqueConstraintError extends ValidationError {
|
|
200
|
+
constructor(message = 'Unique constraint violation', options = {}) {
|
|
201
|
+
super(message, options.errors || []);
|
|
202
|
+
this.fields = options.fields;
|
|
203
|
+
this.name = 'UniqueConstraintError';
|
|
204
|
+
if (Error.captureStackTrace) {
|
|
205
|
+
Error.captureStackTrace(this, UniqueConstraintError);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Create from database error
|
|
210
|
+
*/
|
|
211
|
+
static from(parent, options = {}) {
|
|
212
|
+
const errorItem = {
|
|
213
|
+
message: parent.message || 'Unique constraint violation',
|
|
214
|
+
type: 'UNIQUE_CONSTRAINT_ERROR',
|
|
215
|
+
value: undefined,
|
|
216
|
+
};
|
|
217
|
+
return new UniqueConstraintError(options.message || 'Unique constraint violation', {
|
|
218
|
+
errors: [errorItem],
|
|
219
|
+
fields: options.fields,
|
|
220
|
+
parent,
|
|
221
|
+
sql: options.sql,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
exports.UniqueConstraintError = UniqueConstraintError;
|
|
226
|
+
/**
|
|
227
|
+
* Error for foreign key constraint violations
|
|
228
|
+
*/
|
|
229
|
+
class ForeignKeyConstraintError extends PrormError {
|
|
230
|
+
constructor(message = 'Foreign key constraint violation', options = {}) {
|
|
231
|
+
super(message, {
|
|
232
|
+
code: options.code || exports.ErrorCodes.FOREIGN_KEY_CONSTRAINT_ERROR,
|
|
233
|
+
parent: options.parent,
|
|
234
|
+
sql: options.sql,
|
|
235
|
+
metadata: {
|
|
236
|
+
field: options.field,
|
|
237
|
+
table: options.table,
|
|
238
|
+
value: options.value,
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
this.field = options.field;
|
|
242
|
+
this.table = options.table;
|
|
243
|
+
this.value = options.value;
|
|
244
|
+
this.name = 'ForeignKeyConstraintError';
|
|
245
|
+
if (Error.captureStackTrace) {
|
|
246
|
+
Error.captureStackTrace(this, ForeignKeyConstraintError);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Create from database error
|
|
251
|
+
*/
|
|
252
|
+
static from(parent, options = {}) {
|
|
253
|
+
return new ForeignKeyConstraintError('Foreign key constraint violation', {
|
|
254
|
+
field: options.field,
|
|
255
|
+
table: options.table,
|
|
256
|
+
value: options.value,
|
|
257
|
+
parent,
|
|
258
|
+
sql: options.sql,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
exports.ForeignKeyConstraintError = ForeignKeyConstraintError;
|
|
263
|
+
/**
|
|
264
|
+
* Error for exclusion constraint violations
|
|
265
|
+
*/
|
|
266
|
+
class ExclusionConstraintError extends PrormError {
|
|
267
|
+
constructor(message = 'Exclusion constraint violation', options = {}) {
|
|
268
|
+
super(message, {
|
|
269
|
+
code: exports.ErrorCodes.EXCLUSION_CONSTRAINT_ERROR,
|
|
270
|
+
parent: options.parent,
|
|
271
|
+
sql: options.sql,
|
|
272
|
+
metadata: {
|
|
273
|
+
constraint: options.constraint,
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
this.constraint = options.constraint;
|
|
277
|
+
this.name = 'ExclusionConstraintError';
|
|
278
|
+
if (Error.captureStackTrace) {
|
|
279
|
+
Error.captureStackTrace(this, ExclusionConstraintError);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
exports.ExclusionConstraintError = ExclusionConstraintError;
|
|
284
|
+
/**
|
|
285
|
+
* Error for query timeout
|
|
286
|
+
*/
|
|
287
|
+
class TimeoutError extends PrormError {
|
|
288
|
+
constructor(message = 'Query timeout', options = {}) {
|
|
289
|
+
super(message, {
|
|
290
|
+
code: exports.ErrorCodes.TIMEOUT_ERROR,
|
|
291
|
+
parent: options.parent,
|
|
292
|
+
sql: options.sql,
|
|
293
|
+
metadata: {
|
|
294
|
+
timeout: options.timeout,
|
|
295
|
+
},
|
|
296
|
+
});
|
|
297
|
+
this.timeout = options.timeout || 0;
|
|
298
|
+
this.name = 'TimeoutError';
|
|
299
|
+
if (Error.captureStackTrace) {
|
|
300
|
+
Error.captureStackTrace(this, TimeoutError);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
exports.TimeoutError = TimeoutError;
|
|
305
|
+
/**
|
|
306
|
+
* Error for resource locked
|
|
307
|
+
*/
|
|
308
|
+
class ResourceLockedError extends PrormError {
|
|
309
|
+
constructor(message = 'Resource is locked', options = {}) {
|
|
310
|
+
super(message, {
|
|
311
|
+
code: exports.ErrorCodes.RESOURCE_LOCKED_ERROR,
|
|
312
|
+
parent: options.parent,
|
|
313
|
+
sql: options.sql,
|
|
314
|
+
metadata: {
|
|
315
|
+
resource: options.resource,
|
|
316
|
+
},
|
|
317
|
+
});
|
|
318
|
+
this.resource = options.resource;
|
|
319
|
+
this.name = 'ResourceLockedError';
|
|
320
|
+
if (Error.captureStackTrace) {
|
|
321
|
+
Error.captureStackTrace(this, ResourceLockedError);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
exports.ResourceLockedError = ResourceLockedError;
|
|
326
|
+
/**
|
|
327
|
+
* Error for bulk operation failures
|
|
328
|
+
*/
|
|
329
|
+
class BulkRecordError extends PrormError {
|
|
330
|
+
constructor(message = 'Bulk operation error', options = {}) {
|
|
331
|
+
super(message, {
|
|
332
|
+
code: exports.ErrorCodes.BULK_RECORD_ERROR,
|
|
333
|
+
parent: options.parent,
|
|
334
|
+
sql: options.sql,
|
|
335
|
+
metadata: {
|
|
336
|
+
errorCount: options.errors?.length || 0,
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
this.errors = options.errors || [];
|
|
340
|
+
this.name = 'BulkRecordError';
|
|
341
|
+
if (Error.captureStackTrace) {
|
|
342
|
+
Error.captureStackTrace(this, BulkRecordError);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Get total number of errors
|
|
347
|
+
*/
|
|
348
|
+
get errorCount() {
|
|
349
|
+
return this.errors.length;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Get all error messages
|
|
353
|
+
*/
|
|
354
|
+
getMessages() {
|
|
355
|
+
return this.errors.map((err) => {
|
|
356
|
+
const errorMsg = typeof err.error === 'string' ? err.error : err.error.message;
|
|
357
|
+
return `Record ${err.index}: ${errorMsg}`;
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
exports.BulkRecordError = BulkRecordError;
|
|
362
|
+
/**
|
|
363
|
+
* Error for association errors
|
|
364
|
+
*/
|
|
365
|
+
class AssociationError extends PrormError {
|
|
366
|
+
constructor(message = 'Association error', options = {}) {
|
|
367
|
+
super(message, {
|
|
368
|
+
code: exports.ErrorCodes.ASSOCIATION_ERROR,
|
|
369
|
+
parent: options.parent,
|
|
370
|
+
metadata: {
|
|
371
|
+
association: options.association,
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
this.association = options.association;
|
|
375
|
+
this.name = 'AssociationError';
|
|
376
|
+
if (Error.captureStackTrace) {
|
|
377
|
+
Error.captureStackTrace(this, AssociationError);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
exports.AssociationError = AssociationError;
|
|
382
|
+
/**
|
|
383
|
+
* Error when no results are found but results were expected
|
|
384
|
+
*/
|
|
385
|
+
class EmptyResultError extends PrormError {
|
|
386
|
+
constructor(message = 'No results found', options = {}) {
|
|
387
|
+
super(message, {
|
|
388
|
+
code: exports.ErrorCodes.UNKNOWN,
|
|
389
|
+
parent: options.parent,
|
|
390
|
+
metadata: {
|
|
391
|
+
model: options.model,
|
|
392
|
+
primaryKey: options.primaryKey,
|
|
393
|
+
where: options.where,
|
|
394
|
+
},
|
|
395
|
+
});
|
|
396
|
+
this.model = options.model;
|
|
397
|
+
this.primaryKey = options.primaryKey;
|
|
398
|
+
this.where = options.where;
|
|
399
|
+
this.name = 'EmptyResultError';
|
|
400
|
+
if (Error.captureStackTrace) {
|
|
401
|
+
Error.captureStackTrace(this, EmptyResultError);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Get a descriptive message for the error
|
|
406
|
+
*/
|
|
407
|
+
getMessage() {
|
|
408
|
+
if (this.model && this.primaryKey !== undefined) {
|
|
409
|
+
return `Instance with ${this.model} and primary key ${JSON.stringify(this.primaryKey)} not found`;
|
|
410
|
+
}
|
|
411
|
+
if (this.model) {
|
|
412
|
+
return `No instance with the provided criteria found in ${this.model}`;
|
|
413
|
+
}
|
|
414
|
+
return this.message;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
exports.EmptyResultError = EmptyResultError;
|
|
418
|
+
/**
|
|
419
|
+
* Type guard to check if error is a Prorm error
|
|
420
|
+
*/
|
|
421
|
+
function isPrormError(error) {
|
|
422
|
+
return error instanceof PrormError;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Type guard to check if error is a ValidationError
|
|
426
|
+
*/
|
|
427
|
+
function isValidationError(error) {
|
|
428
|
+
return error instanceof ValidationError;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Type guard to check if error is a ConnectionError
|
|
432
|
+
*/
|
|
433
|
+
function isConnectionError(error) {
|
|
434
|
+
return error instanceof ConnectionError;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Type guard to check if error is a constraint error
|
|
438
|
+
*/
|
|
439
|
+
function isConstraintError(error) {
|
|
440
|
+
return (error instanceof UniqueConstraintError ||
|
|
441
|
+
error instanceof ForeignKeyConstraintError ||
|
|
442
|
+
error instanceof ExclusionConstraintError);
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Type guard to check if error is an EmptyResultError
|
|
446
|
+
*/
|
|
447
|
+
function isEmptyResultError(error) {
|
|
448
|
+
return error instanceof EmptyResultError;
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Export all error classes
|
|
452
|
+
*/
|
|
453
|
+
exports.default = {
|
|
454
|
+
PrormError,
|
|
455
|
+
ConnectionError,
|
|
456
|
+
DatabaseError,
|
|
457
|
+
ValidationError,
|
|
458
|
+
UniqueConstraintError,
|
|
459
|
+
ForeignKeyConstraintError,
|
|
460
|
+
ExclusionConstraintError,
|
|
461
|
+
TimeoutError,
|
|
462
|
+
ResourceLockedError,
|
|
463
|
+
BulkRecordError,
|
|
464
|
+
AssociationError,
|
|
465
|
+
EmptyResultError,
|
|
466
|
+
ErrorCodes: exports.ErrorCodes,
|
|
467
|
+
isPrormError,
|
|
468
|
+
isValidationError,
|
|
469
|
+
isConnectionError,
|
|
470
|
+
isConstraintError,
|
|
471
|
+
isEmptyResultError,
|
|
472
|
+
};
|