ts-prorm-orm 1.1.0 → 1.2.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 +83 -0
- package/README.md +194 -72
- package/dist/audit/history-query.d.ts +35 -0
- package/dist/audit/index.d.ts +16 -0
- package/dist/audit/logger.d.ts +126 -0
- package/dist/cache/cache-manager.d.ts +341 -0
- package/dist/cache/index.d.ts +8 -0
- package/dist/cache/redis-cluster-cache.d.ts +164 -0
- package/dist/cache/redis-cluster-cache.js +19 -36
- package/dist/cli/cloud.d.ts +55 -0
- package/dist/cli/cloud.js +318 -0
- package/dist/cli/commands/auth.d.ts +2 -0
- package/dist/cli/commands/auth.js +345 -0
- package/dist/cli/commands/billing.d.ts +2 -0
- package/dist/cli/commands/billing.js +135 -0
- package/dist/cli/commands/code.d.ts +2 -0
- package/dist/cli/commands/code.js +168 -0
- package/dist/cli/commands/config.d.ts +2 -0
- package/dist/cli/commands/config.js +154 -0
- package/dist/cli/commands/db.d.ts +2 -0
- package/dist/cli/commands/db.js +189 -0
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.js +22 -0
- package/dist/cli/commands/keys.d.ts +2 -0
- package/dist/cli/commands/keys.js +100 -0
- package/dist/cli/commands/misc.d.ts +2 -0
- package/dist/cli/commands/misc.js +282 -0
- package/dist/cli/commands/pull.d.ts +2 -0
- package/dist/cli/commands/pull.js +306 -0
- package/dist/cli/commands/runners.d.ts +2 -0
- package/dist/cli/commands/runners.js +218 -0
- package/dist/cli/commands/scaffold.d.ts +2 -0
- package/dist/cli/commands/scaffold.js +383 -0
- package/dist/cli/commands/secrets.d.ts +2 -0
- package/dist/cli/commands/secrets.js +162 -0
- package/dist/cli/commands/store.d.ts +2 -0
- package/dist/cli/commands/store.js +274 -0
- package/dist/cli/commands/system.d.ts +10 -0
- package/dist/cli/commands/system.js +169 -0
- package/dist/cli/commands/teams.d.ts +2 -0
- package/dist/cli/commands/teams.js +189 -0
- package/dist/cli/commands/user.d.ts +2 -0
- package/dist/cli/commands/user.js +171 -0
- package/dist/cli/framework.d.ts +103 -0
- package/dist/cli/framework.js +436 -0
- package/dist/cli/io.d.ts +26 -0
- package/dist/cli/io.js +181 -0
- package/dist/cli/keychain.d.ts +10 -0
- package/dist/cli/keychain.js +101 -0
- package/dist/cli/prompt.d.ts +20 -0
- package/dist/cli/prompt.js +111 -0
- package/dist/cli.d.ts +214 -0
- package/dist/cli.js +72 -5
- package/dist/compliance/audit-trail.d.ts +66 -0
- package/dist/compliance/backup-verification.d.ts +279 -0
- package/dist/compliance/breach-detector.d.ts +197 -0
- package/dist/compliance/consent-record.d.ts +107 -0
- package/dist/compliance/consent-versioning.d.ts +169 -0
- package/dist/compliance/cross-border-log.d.ts +254 -0
- package/dist/compliance/data-classifier.d.ts +127 -0
- package/dist/compliance/data-lineage.d.ts +268 -0
- package/dist/compliance/data-masker.d.ts +110 -0
- package/dist/compliance/data-portability.d.ts +98 -0
- package/dist/compliance/data-retention.d.ts +108 -0
- package/dist/compliance/dsar-workflow.d.ts +175 -0
- package/dist/compliance/field-encryption.d.ts +84 -0
- package/dist/compliance/immutable-record.d.ts +84 -0
- package/dist/compliance/index.d.ts +93 -0
- package/dist/compliance/privacy-impact-assessment.d.ts +196 -0
- package/dist/compliance/pseudonymization.d.ts +96 -0
- package/dist/compliance/query-firewall.d.ts +661 -0
- package/dist/compliance/rate-limiter.d.ts +203 -0
- package/dist/compliance/right-to-erasure.d.ts +96 -0
- package/dist/compliance/row-level-security.d.ts +152 -0
- package/dist/compliance/security-decorator.d.ts +388 -0
- package/dist/compliance/security-monitor.d.ts +170 -0
- package/dist/compliance/sensitive-data-discovery.d.ts +151 -0
- package/dist/compliance/session-isolation.d.ts +286 -0
- package/dist/compliance/tls-enforcer.d.ts +51 -0
- package/dist/compliance/worm-storage.d.ts +225 -0
- package/dist/connection-manager.d.ts +130 -0
- package/dist/connection-pool.d.ts +311 -0
- package/dist/decorators/audit.d.ts +49 -0
- package/dist/decorators/check.d.ts +218 -0
- package/dist/decorators/collate.d.ts +346 -0
- package/dist/decorators/comment.d.ts +51 -0
- package/dist/decorators/database-settings.d.ts +193 -0
- package/dist/decorators/default.d.ts +148 -0
- package/dist/decorators/encryption.d.ts +175 -0
- package/dist/decorators/engine.d.ts +97 -0
- package/dist/decorators/fk-constraints.d.ts +387 -0
- package/dist/decorators/foreign-table.d.ts +57 -0
- package/dist/decorators/generated.d.ts +232 -0
- package/dist/decorators/hstore.d.ts +96 -0
- package/dist/decorators/index.d.ts +57 -0
- package/dist/decorators/index.js +14 -30
- package/dist/decorators/json-column.d.ts +47 -0
- package/dist/decorators/jsonb.d.ts +83 -0
- package/dist/decorators/orm-decorators.d.ts +274 -0
- package/dist/decorators/permissions.d.ts +192 -0
- package/dist/decorators/procedure.d.ts +168 -0
- package/dist/decorators/procedure.js +31 -7
- package/dist/decorators/query-options.d.ts +527 -0
- package/dist/decorators/range.d.ts +122 -0
- package/dist/decorators/set-column.d.ts +43 -0
- package/dist/decorators/spatial.d.ts +60 -0
- package/dist/decorators/storage.d.ts +561 -0
- package/dist/decorators/timezone.d.ts +319 -0
- package/dist/decorators/trigger.d.ts +50 -0
- package/dist/decorators/uuid.d.ts +102 -0
- package/dist/decorators/view.d.ts +213 -0
- package/dist/diagrams/chen-diagram.d.ts +70 -0
- package/dist/diagrams/chen-diagram.js +33 -31
- package/dist/diagrams/class-diagram.d.ts +78 -0
- package/dist/diagrams/class-diagram.js +23 -27
- package/dist/diagrams/dependency-diagram.d.ts +82 -0
- package/dist/diagrams/dependency-diagram.js +18 -9
- package/dist/diagrams/er-diagram.d.ts +82 -0
- package/dist/diagrams/er-diagram.js +174 -231
- package/dist/diagrams/flow-diagram.d.ts +70 -0
- package/dist/diagrams/flow-diagram.js +23 -18
- package/dist/diagrams/gantt-diagram.d.ts +67 -0
- package/dist/diagrams/gantt-diagram.js +20 -18
- package/dist/diagrams/index-diagram.d.ts +61 -0
- package/dist/diagrams/index-diagram.js +36 -31
- package/dist/diagrams/index.d.ts +155 -0
- package/dist/diagrams/index.js +7 -1
- package/dist/diagrams/migration-diagram.d.ts +67 -0
- package/dist/diagrams/migration-diagram.js +45 -57
- package/dist/diagrams/model-diagram.d.ts +85 -0
- package/dist/diagrams/model-diagram.js +225 -287
- package/dist/diagrams/package-diagram.d.ts +69 -0
- package/dist/diagrams/package-diagram.js +30 -32
- package/dist/diagrams/palette.d.ts +138 -0
- package/dist/diagrams/palette.js +134 -25
- package/dist/diagrams/relational-diagram.d.ts +82 -0
- package/dist/diagrams/relational-diagram.js +51 -59
- package/dist/diagrams/schemadoc-diagram.d.ts +57 -0
- package/dist/diagrams/schemadoc-diagram.js +36 -28
- package/dist/diagrams/sequence-diagram.d.ts +61 -0
- package/dist/diagrams/sequence-diagram.js +20 -11
- package/dist/diagrams/state-diagram.d.ts +85 -0
- package/dist/diagrams/state-diagram.js +21 -17
- package/dist/diagrams/svg-dom.d.ts +62 -0
- package/dist/diagrams/svg-dom.js +11 -0
- package/dist/diagrams/tree-diagram.d.ts +47 -0
- package/dist/diagrams/tree-diagram.js +19 -10
- package/dist/dialects/clickhouse/index.d.ts +660 -0
- package/dist/dialects/clickhouse/index.js +107 -2
- package/dist/dialects/cockroachdb/index.d.ts +1708 -0
- package/dist/dialects/cockroachdb/index.js +139 -10
- package/dist/dialects/cratedb/index.d.ts +262 -0
- package/dist/dialects/cratedb/index.js +148 -0
- package/dist/dialects/databricks/index.d.ts +397 -0
- package/dist/dialects/databricks/index.js +233 -11
- package/dist/dialects/db2/index.d.ts +729 -0
- package/dist/dialects/db2/index.js +152 -2
- package/dist/dialects/dialect.d.ts +1653 -0
- package/dist/dialects/duckdb/index.d.ts +440 -0
- package/dist/dialects/duckdb/index.js +21 -37
- package/dist/dialects/exasol/index.d.ts +197 -0
- package/dist/dialects/exasol/index.js +14 -0
- package/dist/dialects/firebird/index.d.ts +286 -0
- package/dist/dialects/firebird/index.js +135 -0
- package/dist/dialects/greenplum/index.d.ts +336 -0
- package/dist/dialects/greenplum/index.js +168 -0
- package/dist/dialects/hana/index.d.ts +512 -0
- package/dist/dialects/hana/index.js +17 -35
- package/dist/dialects/mariadb/index.d.ts +1241 -0
- package/dist/dialects/mariadb/index.js +181 -43
- package/dist/dialects/mssql/index.d.ts +729 -0
- package/dist/dialects/mssql/index.js +76 -7
- package/dist/dialects/mysql/index.d.ts +1233 -0
- package/dist/dialects/mysql/index.js +87 -19
- package/dist/dialects/oracle/index.d.ts +1222 -0
- package/dist/dialects/oracle/index.js +210 -9
- package/dist/dialects/postgres/index.d.ts +1598 -0
- package/dist/dialects/postgres/index.js +34 -13
- package/dist/dialects/query-stream-helper.d.ts +58 -0
- package/dist/dialects/questdb/index.d.ts +430 -0
- package/dist/dialects/questdb/index.js +292 -0
- package/dist/dialects/redshift/index.d.ts +933 -0
- package/dist/dialects/redshift/index.js +17 -5
- package/dist/dialects/singlestore/index.d.ts +233 -0
- package/dist/dialects/singlestore/index.js +53 -0
- package/dist/dialects/snowflake/index.d.ts +727 -0
- package/dist/dialects/snowflake/index.js +154 -5
- package/dist/dialects/spanner/index.d.ts +660 -0
- package/dist/dialects/spanner/index.js +43 -21
- package/dist/dialects/sqlite/index.d.ts +1133 -0
- package/dist/dialects/sqlite/index.js +168 -30
- package/dist/dialects/tidb/index.d.ts +226 -0
- package/dist/dialects/tidb/index.js +10 -0
- package/dist/dialects/timescaledb/index.d.ts +286 -0
- package/dist/dialects/timescaledb/index.js +179 -0
- package/dist/dialects/trino/index.d.ts +230 -0
- package/dist/dialects/trino/index.js +85 -10
- package/dist/dialects/turso/index.d.ts +98 -0
- package/dist/dialects/turso/index.js +10 -0
- package/dist/dialects/vertica/index.d.ts +321 -0
- package/dist/dialects/vertica/index.js +161 -0
- package/dist/dialects/yugabytedb/index.d.ts +276 -0
- package/dist/dialects/yugabytedb/index.js +121 -0
- package/dist/errors/index.d.ts +378 -0
- package/dist/errors/index.js +29 -1
- package/dist/errors/utils.d.ts +53 -0
- package/dist/errors.d.ts +5 -0
- package/dist/extensions/catalog/cloud-warehouse-features.d.ts +27 -0
- package/dist/extensions/catalog/mssql-features.d.ts +20 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.d.ts +18 -0
- package/dist/extensions/catalog/oracle-db2-features.d.ts +17 -0
- package/dist/extensions/catalog/postgres-extensions.d.ts +15 -0
- package/dist/extensions/index.d.ts +34 -0
- package/dist/extensions/types.d.ts +43 -0
- package/dist/external-fields/adapters.d.ts +50 -0
- package/dist/external-fields/adapters.js +227 -0
- package/dist/external-fields/decorator.d.ts +77 -0
- package/dist/external-fields/decorator.js +80 -0
- package/dist/external-fields/index.d.ts +10 -0
- package/dist/external-fields/index.js +19 -0
- package/dist/external-fields/runtime.d.ts +39 -0
- package/dist/external-fields/runtime.js +221 -0
- package/dist/foreign-data.d.ts +168 -0
- package/dist/graph/base-graph-dialect.d.ts +250 -0
- package/dist/graph/base-graph-dialect.js +539 -0
- package/dist/graph/dgraph/index.d.ts +65 -0
- package/dist/graph/dgraph/index.js +559 -0
- package/dist/graph/gremlin/index.d.ts +59 -0
- package/dist/graph/gremlin/index.js +378 -0
- package/dist/graph/index.d.ts +60 -0
- package/dist/graph/index.js +67 -0
- package/dist/graph/neo4j/index.d.ts +50 -0
- package/dist/graph/neo4j/index.js +462 -0
- package/dist/graph/types.d.ts +213 -0
- package/dist/graph/types.js +234 -0
- package/dist/hooks/hooks-manager.d.ts +189 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/index.d.ts +711 -0
- package/dist/index.js +19 -4
- package/dist/logging.d.ts +183 -0
- package/dist/migrations/index.d.ts +9 -0
- package/dist/migrations/migration.d.ts +143 -0
- package/dist/migrations/migrator.d.ts +199 -0
- package/dist/migrations/prormmigration.d.ts +131 -0
- package/dist/migrations/query-interface.d.ts +335 -0
- package/dist/migrations/seeder.d.ts +167 -0
- package/dist/models/associations.d.ts +131 -0
- package/dist/models/associations.js +7 -2
- package/dist/models/constraints.d.ts +175 -0
- package/dist/models/data-types.d.ts +1656 -0
- package/dist/models/decorators.d.ts +328 -0
- package/dist/models/decorators.js +61 -82
- package/dist/models/eager-load.d.ts +86 -0
- package/dist/models/eager-load.js +369 -0
- package/dist/models/index.d.ts +13 -0
- package/dist/models/indexes.d.ts +325 -0
- package/dist/models/methods.d.ts +419 -0
- package/dist/models/model-manager.d.ts +76 -0
- package/dist/models/model.d.ts +820 -0
- package/dist/models/model.js +15 -101
- package/dist/models/operators.d.ts +29 -0
- package/dist/models/scopes.d.ts +71 -0
- package/dist/models/typescript-types.d.ts +177 -0
- package/dist/nosql/aerospike/index.d.ts +126 -0
- package/dist/nosql/allegrograph/index.d.ts +86 -0
- package/dist/nosql/arangodb/index.d.ts +285 -0
- package/dist/nosql/arangodb/index.js +274 -2
- package/dist/nosql/arangodb/where.d.ts +38 -0
- package/dist/nosql/arangodb/where.js +94 -0
- package/dist/nosql/azure-blob/index.d.ts +104 -0
- package/dist/nosql/beanstalkd/index.d.ts +88 -0
- package/dist/nosql/beequeue/index.d.ts +99 -0
- package/dist/nosql/bigchaindb/index.d.ts +113 -0
- package/dist/nosql/bigtable/index.d.ts +144 -0
- package/dist/nosql/blazegraph/index.d.ts +88 -0
- package/dist/nosql/bullmq/index.d.ts +83 -0
- package/dist/nosql/cassandra/index.d.ts +119 -0
- package/dist/nosql/chroma/index.d.ts +151 -0
- package/dist/nosql/cloudflare-kv/index.d.ts +120 -0
- package/dist/nosql/coherence/index.d.ts +91 -0
- package/dist/nosql/cosmosdb/index.d.ts +78 -0
- package/dist/nosql/couchbase/index.d.ts +103 -0
- package/dist/nosql/dax/index.d.ts +118 -0
- package/dist/nosql/deno-kv/index.d.ts +109 -0
- package/dist/nosql/dgraph/index.d.ts +80 -0
- package/dist/nosql/doris/index.d.ts +88 -0
- package/dist/nosql/druid/index.d.ts +95 -0
- package/dist/nosql/dynamodb/index.d.ts +643 -0
- package/dist/nosql/dynamodb/index.js +423 -0
- package/dist/nosql/elasticsearch/index.d.ts +239 -0
- package/dist/nosql/etcd/index.d.ts +243 -0
- package/dist/nosql/eventhubs/index.d.ts +89 -0
- package/dist/nosql/eventstore/index.d.ts +102 -0
- package/dist/nosql/faunadb/index.d.ts +141 -0
- package/dist/nosql/faunadb/index.js +329 -0
- package/dist/nosql/firestore/index.d.ts +67 -0
- package/dist/nosql/fluree/index.d.ts +88 -0
- package/dist/nosql/fuseki/index.d.ts +94 -0
- package/dist/nosql/gcs/index.d.ts +62 -0
- package/dist/nosql/gearman/index.d.ts +77 -0
- package/dist/nosql/geode/index.d.ts +93 -0
- package/dist/nosql/graphdb/index.d.ts +86 -0
- package/dist/nosql/graylog/index.d.ts +118 -0
- package/dist/nosql/gridgain/index.d.ts +78 -0
- package/dist/nosql/hazelcast/index.d.ts +73 -0
- package/dist/nosql/hbase/index.d.ts +123 -0
- package/dist/nosql/ignite/index.d.ts +80 -0
- package/dist/nosql/immudb/index.d.ts +131 -0
- package/dist/nosql/index.d.ts +215 -0
- package/dist/nosql/infinispan/index.d.ts +95 -0
- package/dist/nosql/influxdb/flux-compiler.d.ts +23 -0
- package/dist/nosql/influxdb/flux-compiler.js +170 -0
- package/dist/nosql/influxdb/index.d.ts +300 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.d.ts +113 -0
- package/dist/nosql/keyspaces/index.d.ts +122 -0
- package/dist/nosql/kinesis/index.d.ts +121 -0
- package/dist/nosql/leveldb/index.d.ts +112 -0
- package/dist/nosql/leveldb/index.js +103 -1
- package/dist/nosql/lmdb/index.d.ts +76 -0
- package/dist/nosql/loki/index.d.ts +126 -0
- package/dist/nosql/marklogic/index.d.ts +76 -0
- package/dist/nosql/materialize/index.d.ts +91 -0
- package/dist/nosql/meilisearch/index.d.ts +76 -0
- package/dist/nosql/memcached/index.d.ts +138 -0
- package/dist/nosql/milvus/index.d.ts +167 -0
- package/dist/nosql/minio/index.d.ts +122 -0
- package/dist/nosql/momento/index.d.ts +99 -0
- package/dist/nosql/mongodb/index.d.ts +265 -0
- package/dist/nosql/mongodb/index.js +139 -0
- package/dist/nosql/mongodb/where.d.ts +8 -0
- package/dist/nosql/mongodb/where.js +181 -0
- package/dist/nosql/nats/index.d.ts +139 -0
- package/dist/nosql/nedb/index.d.ts +79 -0
- package/dist/nosql/neo4j/index.d.ts +217 -0
- package/dist/nosql/neo4j/index.js +26 -14
- package/dist/nosql/neptune/index.d.ts +234 -0
- package/dist/nosql/neptune/index.js +23 -9
- package/dist/nosql/nsq/index.d.ts +93 -0
- package/dist/nosql/opensearch/index.d.ts +97 -0
- package/dist/nosql/orientdb/index.d.ts +72 -0
- package/dist/nosql/papertrail/index.d.ts +120 -0
- package/dist/nosql/pinecone/index.d.ts +148 -0
- package/dist/nosql/pinot/index.d.ts +90 -0
- package/dist/nosql/pouchdb/index.d.ts +95 -0
- package/dist/nosql/prometheus/index.d.ts +112 -0
- package/dist/nosql/provendb/index.d.ts +143 -0
- package/dist/nosql/provendb/index.js +262 -0
- package/dist/nosql/pubsub/index.d.ts +83 -0
- package/dist/nosql/pulsar/index.d.ts +105 -0
- package/dist/nosql/qdrant/index.d.ts +231 -0
- package/dist/nosql/qldb/index.d.ts +182 -0
- package/dist/nosql/qldb/index.js +302 -1
- package/dist/nosql/r2/index.d.ts +160 -0
- package/dist/nosql/rabbitmq/index.d.ts +131 -0
- package/dist/nosql/ravendb/index.d.ts +138 -0
- package/dist/nosql/ravendb/index.js +323 -9
- package/dist/nosql/ravendb/where.d.ts +38 -0
- package/dist/nosql/ravendb/where.js +94 -0
- package/dist/nosql/redis/index.d.ts +267 -0
- package/dist/nosql/redis/index.js +19 -5
- package/dist/nosql/redpanda/index.d.ts +117 -0
- package/dist/nosql/resque/index.d.ts +91 -0
- package/dist/nosql/rethinkdb/index.d.ts +194 -0
- package/dist/nosql/rethinkdb/index.js +290 -0
- package/dist/nosql/rethinkdb/where.d.ts +38 -0
- package/dist/nosql/rethinkdb/where.js +94 -0
- package/dist/nosql/rocksdb/document-layer.d.ts +162 -0
- package/dist/nosql/rocksdb/document-layer.js +338 -0
- package/dist/nosql/rocksdb/index.d.ts +112 -0
- package/dist/nosql/rocksdb/index.js +103 -1
- package/dist/nosql/rocksdb/where-match.d.ts +21 -0
- package/dist/nosql/rocksdb/where-match.js +238 -0
- package/dist/nosql/rockset/index.d.ts +84 -0
- package/dist/nosql/s3/index.d.ts +170 -0
- package/dist/nosql/scylladb/index.d.ts +117 -0
- package/dist/nosql/signoz/index.d.ts +116 -0
- package/dist/nosql/sns/index.d.ts +99 -0
- package/dist/nosql/solr/index.d.ts +129 -0
- package/dist/nosql/splunk/index.d.ts +125 -0
- package/dist/nosql/sqs/index.d.ts +116 -0
- package/dist/nosql/stardog/index.d.ts +86 -0
- package/dist/nosql/starrocks/index.d.ts +89 -0
- package/dist/nosql/store.d.ts +23 -0
- package/dist/nosql/sumologic/index.d.ts +119 -0
- package/dist/nosql/surrealdb/index.d.ts +156 -0
- package/dist/nosql/surrealdb/index.js +174 -1
- package/dist/nosql/surrealdb/query-compiler.d.ts +26 -0
- package/dist/nosql/surrealdb/query-compiler.js +193 -0
- package/dist/nosql/terminusdb/index.d.ts +95 -0
- package/dist/nosql/tigergraph/index.d.ts +314 -0
- package/dist/nosql/typesense/index.d.ts +82 -0
- package/dist/nosql/unqlite/index.d.ts +68 -0
- package/dist/nosql/upstash/index.d.ts +80 -0
- package/dist/nosql/vercel-kv/index.d.ts +82 -0
- package/dist/nosql/victoriametrics/index.d.ts +129 -0
- package/dist/nosql/virtuoso/index.d.ts +87 -0
- package/dist/nosql/weaviate/index.d.ts +196 -0
- package/dist/operators/index.d.ts +7 -0
- package/dist/operators.d.ts +2947 -0
- package/dist/operators.js +46 -1
- package/dist/prisma-migrate/index.d.ts +28 -0
- package/dist/prisma-migrate/migration-generator.d.ts +21 -0
- package/dist/prisma-migrate/model-generator.d.ts +12 -0
- package/dist/prisma-migrate/relations.d.ts +28 -0
- package/dist/prisma-migrate/schema-parser.d.ts +42 -0
- package/dist/prisma-migrate/type-mapper.d.ts +20 -0
- package/dist/prorm.d.ts +2093 -0
- package/dist/prorm.js +721 -302
- package/dist/query-builders/cte-builder.d.ts +104 -0
- package/dist/query-builders/functions/aggregate.d.ts +199 -0
- package/dist/query-builders/functions/conditional.d.ts +195 -0
- package/dist/query-builders/functions/datetime.d.ts +202 -0
- package/dist/query-builders/functions/fulltext.d.ts +220 -0
- package/dist/query-builders/functions/index.d.ts +17 -0
- package/dist/query-builders/functions/json.d.ts +157 -0
- package/dist/query-builders/functions/math.d.ts +215 -0
- package/dist/query-builders/functions/string.d.ts +233 -0
- package/dist/query-builders/functions/window.d.ts +209 -0
- package/dist/query-builders/include-builder.d.ts +85 -0
- package/dist/query-builders/index-expression-builder.d.ts +153 -0
- package/dist/query-builders/index.d.ts +121 -0
- package/dist/query-builders/index.js +10 -0
- package/dist/query-builders/insert-builder.d.ts +62 -0
- package/dist/query-builders/model-helpers.d.ts +28 -0
- package/dist/query-builders/order-limit-builder.d.ts +84 -0
- package/dist/query-builders/sql-compiler.d.ts +562 -0
- package/dist/query-builders/subquery-builder.d.ts +133 -0
- package/dist/query-builders/update-builder.d.ts +71 -0
- package/dist/query-builders/view-builder.d.ts +189 -0
- package/dist/query-builders/where-builder.d.ts +124 -0
- package/dist/query-interface.d.ts +407 -0
- package/dist/query-interface.js +84 -0
- package/dist/query-optimizers/batch-optimizer.d.ts +175 -0
- package/dist/query-optimizers/explain-plans.d.ts +187 -0
- package/dist/query-optimizers/index.d.ts +27 -0
- package/dist/query-optimizers/prepared-statement-cache.d.ts +252 -0
- package/dist/query-optimizers/query-hints.d.ts +201 -0
- package/dist/query-optimizers/query-optimizer.d.ts +162 -0
- package/dist/query-optimizers/slow-query-logger.d.ts +186 -0
- package/dist/replica-manager.d.ts +235 -0
- package/dist/schema/index.d.ts +7 -0
- package/dist/schema/migration-generator.d.ts +74 -0
- package/dist/schema/schema-differ.d.ts +114 -0
- package/dist/schema/types.d.ts +246 -0
- package/dist/schema-objects.d.ts +78 -0
- package/dist/schema-objects.js +203 -0
- package/dist/sql-constants.d.ts +240 -0
- package/dist/sqlite-advanced.d.ts +572 -0
- package/dist/streams/index.d.ts +5 -0
- package/dist/streams/transforms.d.ts +120 -0
- package/dist/transaction.d.ts +221 -0
- package/dist/types/index.d.ts +3123 -0
- package/dist/user-management.d.ts +141 -0
- package/dist/utils/date.d.ts +149 -0
- package/dist/utils/index.d.ts +359 -0
- package/dist/utils/string.d.ts +88 -0
- package/dist/validators/index.d.ts +7 -0
- package/dist/validators/validator.d.ts +306 -0
- package/package.json +20 -5
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,89 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.2.0]
|
|
9
|
+
|
|
10
|
+
### Fixed — relations
|
|
11
|
+
|
|
12
|
+
- **Eager-load failures are no longer swallowed.** `include` caught every error
|
|
13
|
+
and reported an empty result, so a typo'd alias, a missing foreign key column,
|
|
14
|
+
an unresolvable through model and a genuinely childless parent were
|
|
15
|
+
indistinguishable. Failures now raise `EagerLoadError`; unknown or ambiguous
|
|
16
|
+
associations raise `AssociationError` before any query runs.
|
|
17
|
+
- **`hasOne` inferred its foreign key from the wrong model.** `User.hasOne(Profile)`
|
|
18
|
+
means `profiles.userId`; it produced `profileId`, a column that is never
|
|
19
|
+
populated, so the association always resolved to null.
|
|
20
|
+
- **One eager-loader instead of two.** `prorm.define()` and the class-based
|
|
21
|
+
`Model` API each had their own copy and they had drifted — the `model.ts` copy
|
|
22
|
+
treated `belongsTo` like `hasMany` and skipped `belongsToMany` entirely.
|
|
23
|
+
- **Ambiguous includes are reported.** Two associations to the same model (e.g.
|
|
24
|
+
`author` and `editor`) previously bound to whichever was registered first.
|
|
25
|
+
- **Composite foreign keys work.** Array `foreignKey` values were silently
|
|
26
|
+
dropped; they now emit a table-level `FOREIGN KEY` constraint.
|
|
27
|
+
- **Synthesized foreign key columns match the referenced key's type** instead of
|
|
28
|
+
being hardcoded `INTEGER`, which broke UUID and STRING primary keys.
|
|
29
|
+
- **Decorator associations bind regardless of registration order**, and a target
|
|
30
|
+
that is never registered fails `sync()` by name rather than silently omitting
|
|
31
|
+
the constraint.
|
|
32
|
+
- Association `scope` is now applied, by both `include` and the generated getters.
|
|
33
|
+
|
|
34
|
+
### Fixed — core
|
|
35
|
+
|
|
36
|
+
- **`instance.save()` was broken for every model.** It swept internal
|
|
37
|
+
bookkeeping (`_previousDataValues`, `_changed`) into the UPDATE, so
|
|
38
|
+
`row.field = x; await row.save()` failed with `no such column`.
|
|
39
|
+
- **Attribute decorators are order-independent.** `@Column` replaced the whole
|
|
40
|
+
attribute entry, and stacked decorators apply bottom-up, so the documented
|
|
41
|
+
ordering discarded `@PrimaryKey` and `@AutoIncrement` — decorator-defined
|
|
42
|
+
models were getting tables with no primary key.
|
|
43
|
+
- **Auto-increment keys no longer fail their own INSERT**; create-time
|
|
44
|
+
validation exempts them and columns with a default.
|
|
45
|
+
- **`count()` issues a real aggregate.** It previously fetched every matching
|
|
46
|
+
row (eager-loading its associations) and took `.length`, and discarded
|
|
47
|
+
`distinct`, `col` and `group`.
|
|
48
|
+
- **Default `sync()` no longer creates a duplicate table.** Two of six table-name
|
|
49
|
+
derivations omitted pluralization, so `define('User')` + `sync()` created an
|
|
50
|
+
empty `User` beside `users` on every call.
|
|
51
|
+
- `sync()` creates tables in foreign-key dependency order.
|
|
52
|
+
- `findOrCreate` no longer inserts operator objects from `where`, and treats a
|
|
53
|
+
unique violation as a lost race.
|
|
54
|
+
- SQLite emitted `REFERENCES "users""id"` without parentheses in table-level
|
|
55
|
+
constraints.
|
|
56
|
+
- A table-level composite `PRIMARY KEY` no longer also gets an injected `id`.
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
|
|
60
|
+
- **`@ExternalField`** — model fields whose contents live in an object or
|
|
61
|
+
key-value store while the row lives in the database. Register a store with
|
|
62
|
+
`prorm.registerStore()`; S3, MinIO, R2, GCS, Azure Blob and Redis are
|
|
63
|
+
supported directly, with their differing APIs normalized internally.
|
|
64
|
+
- **`required` / `include.where` filter parent rows**, applied before
|
|
65
|
+
`LIMIT`/`OFFSET` so pagination is correct, and composing through nesting.
|
|
66
|
+
- **Schema objects through the ORM**: `createSequence`, `createTrigger`,
|
|
67
|
+
`enableRowLevelSecurity`, `createPolicy` and `createFullTextIndex` on
|
|
68
|
+
`QueryInterface`, raising `UnsupportedSchemaObjectError` naming the
|
|
69
|
+
alternative where a database has no equivalent.
|
|
70
|
+
- **`sync()` applies annotation DDL** — `@View`, `@MaterializedView`, `@Trigger`,
|
|
71
|
+
and `@Procedure`/`@SqlFunction` via `prorm.registerProcedures()`.
|
|
72
|
+
- **`literalExpr(sql, bindings)`** substitutes values through each dialect's
|
|
73
|
+
escaping, so the escape hatch is no longer string concatenation.
|
|
74
|
+
|
|
75
|
+
### Removed
|
|
76
|
+
|
|
77
|
+
- The orphaned parallel `@HasOne`/`@HasMany`/`@BelongsTo`/`@BelongsToMany` under
|
|
78
|
+
`src/decorators/`. They stored metadata that `addModel()` never read, so which
|
|
79
|
+
implementation an import resolved to decided whether the association existed.
|
|
80
|
+
The wired versions in `src/models/decorators.ts` are unchanged.
|
|
81
|
+
|
|
82
|
+
### Packaging
|
|
83
|
+
|
|
84
|
+
- `prepublishOnly` now runs `check:package`, which fails the publish if `dist/`
|
|
85
|
+
contains no declarations or a declared entry point is missing. **1.1.0 shipped
|
|
86
|
+
zero `.d.ts` files** despite declaring `types`, leaving every TypeScript
|
|
87
|
+
consumer without types.
|
|
88
|
+
- Jest no longer scans stale worktrees under `.claude/`, which made `npm test`
|
|
89
|
+
(and therefore `npm publish`) fail.
|
|
90
|
+
|
|
8
91
|
## [Unreleased]
|
|
9
92
|
|
|
10
93
|
### Comprehensive Feature Reference
|
package/README.md
CHANGED
|
@@ -1,18 +1,27 @@
|
|
|
1
|
-
# prorm
|
|
1
|
+
# ts-prorm-orm
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/ts-prorm-orm)
|
|
4
|
+
[](https://www.npmjs.com/package/ts-prorm-orm)
|
|
5
|
+
[](./LICENSE)
|
|
6
6
|
[](https://www.typescriptlang.org/)
|
|
7
7
|
[](https://gitlab.com/Malcolmston/prod-orm/-/pipelines)
|
|
8
8
|
|
|
9
9
|
A TypeScript ORM supporting multiple database dialects with full TypeScript support.
|
|
10
10
|
|
|
11
|
-
> Published on npm as **[
|
|
11
|
+
> Published on npm as **[`ts-prorm-orm`](https://www.npmjs.com/package/ts-prorm-orm)** — `npm install ts-prorm-orm`
|
|
12
12
|
|
|
13
13
|
## Features
|
|
14
14
|
|
|
15
|
-
- **Multi-database support**:
|
|
15
|
+
- **Multi-database support**: 27 SQL dialects. Core implementations for SQLite,
|
|
16
|
+
PostgreSQL, MySQL, MariaDB, Oracle, MSSQL, CockroachDB, Amazon Redshift, IBM Db2,
|
|
17
|
+
Snowflake, ClickHouse, DuckDB, SAP HANA and Google Cloud Spanner; Postgres-derived
|
|
18
|
+
support for TimescaleDB, Greenplum, YugabyteDB, Vertica, Trino, Exasol, CrateDB,
|
|
19
|
+
QuestDB and Firebird; MySQL-derived for TiDB, SingleStore and Databricks; and
|
|
20
|
+
Turso/libSQL on SQLite. See [Supported Dialects](#supported-dialects) for what is
|
|
21
|
+
verified against a real engine.
|
|
22
|
+
- **Relations without SQL**: `hasOne`/`hasMany`/`belongsTo`/`belongsToMany` via
|
|
23
|
+
methods or decorators, eager loading with `include`, and `required` / `include.where`
|
|
24
|
+
to filter parents by their children — applied before `LIMIT`, so pagination is correct
|
|
16
25
|
- **TypeScript-first**: Full TypeScript support with decorators
|
|
17
26
|
- **CRUD operations**: Full query builder with associations, scopes, transactions
|
|
18
27
|
- **Migrations**: Database versioning and seeding
|
|
@@ -20,13 +29,16 @@ A TypeScript ORM supporting multiple database dialects with full TypeScript supp
|
|
|
20
29
|
- **Validation**: Built-in and custom validators
|
|
21
30
|
- **Stored Procedures**: Create and call stored procedures (across supported dialects)
|
|
22
31
|
- **Triggers**: Database triggers with FOR EACH ROW and WHEN clauses (across supported dialects)
|
|
23
|
-
- **Sequences**:
|
|
32
|
+
- **Sequences**: `createSequence()` on PostgreSQL, MariaDB, Oracle, MSSQL, Db2 and
|
|
33
|
+
friends. SQLite and MySQL have no sequences and report that explicitly rather
|
|
34
|
+
than emitting SQL the driver rejects
|
|
24
35
|
- **Table Partitions**: RANGE, LIST, HASH partitioning (across supported dialects)
|
|
25
36
|
- **Partial Indexes**: Conditional indexes for MySQL, MariaDB, PostgreSQL, Oracle, MSSQL
|
|
26
37
|
- **Row-Level Security (RLS)**: PostgreSQL, Oracle VPD, MSSQL Security Policies
|
|
27
38
|
- **Materialized Views**: With FAST/COMPLETE refresh (PostgreSQL, Oracle)
|
|
28
39
|
- **Views**: Database views support
|
|
29
|
-
- **Full-Text Search**:
|
|
40
|
+
- **Full-Text Search**: one `createFullTextIndex()` call resolves per dialect —
|
|
41
|
+
GIN over `to_tsvector` on PostgreSQL, `FULLTEXT` on MySQL/MariaDB, FTS5 on SQLite
|
|
30
42
|
- **JSON/JSONB**: Native JSON data type support
|
|
31
43
|
- **Spatial Data**: PostGIS support for PostgreSQL
|
|
32
44
|
- **Foreign Data Wrappers**: PostgreSQL FDW support
|
|
@@ -36,6 +48,10 @@ A TypeScript ORM supporting multiple database dialects with full TypeScript supp
|
|
|
36
48
|
- **Audit Logging**: Built-in audit trail functionality
|
|
37
49
|
- **Polymorphic Associations**: Built-in helpers for polymorphic relationships
|
|
38
50
|
- **Self-referential Associations**: Tree structure support
|
|
51
|
+
- **Object, key-value and document stores**: S3, MinIO, R2, GCS, Azure Blob, Redis,
|
|
52
|
+
MongoDB, DynamoDB, Cassandra, Elasticsearch and ~90 more ship as standalone
|
|
53
|
+
`*Store` classes with APIs matching each engine. These are **not** part of the
|
|
54
|
+
model/relation layer — see [NoSQL Stores](#nosql-stores)
|
|
39
55
|
|
|
40
56
|
## Installation
|
|
41
57
|
|
|
@@ -100,6 +116,19 @@ SQL dialects and 102 NoSQL/data stores (129 engines). Full taxonomy:
|
|
|
100
116
|
|
|
101
117
|
## Supported Dialects
|
|
102
118
|
|
|
119
|
+
**How these are verified.** SQLite and DuckDB are embedded, so the test suite runs
|
|
120
|
+
against the real engine on every commit. PostgreSQL, MySQL, MariaDB, MSSQL, Oracle,
|
|
121
|
+
CockroachDB and ClickHouse have real servers available via `docker-compose.test.yml`
|
|
122
|
+
and are exercised by `npm run test:integration`. The remaining dialects are covered
|
|
123
|
+
by unit tests against an in-memory SQL simulator, which checks generated SQL but not
|
|
124
|
+
engine behaviour. "Stable" below means the implementation is complete, not that it
|
|
125
|
+
has been run against that vendor's server in CI.
|
|
126
|
+
|
|
127
|
+
Dialects not listed in the table are implemented as subclasses of a core dialect and
|
|
128
|
+
inherit its behaviour: TimescaleDB, Greenplum, YugabyteDB, Vertica, Trino, Exasol,
|
|
129
|
+
CrateDB, QuestDB and Firebird extend PostgreSQL; TiDB, SingleStore and Databricks
|
|
130
|
+
extend MySQL; Turso/libSQL extends SQLite.
|
|
131
|
+
|
|
103
132
|
| Dialect | Status | Features |
|
|
104
133
|
|---------|--------|-----------|
|
|
105
134
|
| SQLite | Stable | FTS5, CTEs, Window Functions, UPSERT |
|
|
@@ -152,7 +181,7 @@ index map, flowchart, tree, Chen-ER, package, gantt) built on a shared
|
|
|
152
181
|
DOM-backed SVG builder with light/dark themes and configurable accent colours.
|
|
153
182
|
|
|
154
183
|
```ts
|
|
155
|
-
import { ModelDiagram } from '
|
|
184
|
+
import { ModelDiagram } from 'ts-prorm-orm';
|
|
156
185
|
|
|
157
186
|
new ModelDiagram({
|
|
158
187
|
name: 'User',
|
|
@@ -164,6 +193,74 @@ new ModelDiagram({
|
|
|
164
193
|
|
|
165
194
|
See the [diagram module guide](./docs/diagrams/README.md) for every generator.
|
|
166
195
|
|
|
196
|
+
## External Fields
|
|
197
|
+
|
|
198
|
+
A model field whose *contents* live in an object or key-value store, while the
|
|
199
|
+
row lives in the database. The table column holds only the object key; the ORM
|
|
200
|
+
keeps the two in step, so the link between a row and its object isn't something
|
|
201
|
+
you maintain by hand.
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
import { Prorm, DataTypes, ExternalField, Table, Column, PrimaryKey, AutoIncrement } from 'ts-prorm-orm';
|
|
205
|
+
import { S3Store } from 'ts-prorm-orm';
|
|
206
|
+
|
|
207
|
+
const s3 = new S3Store({ region: 'us-east-1' });
|
|
208
|
+
await s3.connect();
|
|
209
|
+
|
|
210
|
+
prorm.registerStore('assets', s3, { defaultBucket: 'avatars' });
|
|
211
|
+
|
|
212
|
+
@Table()
|
|
213
|
+
class User {
|
|
214
|
+
@Column(DataTypes.INTEGER())
|
|
215
|
+
@PrimaryKey()
|
|
216
|
+
@AutoIncrement()
|
|
217
|
+
declare id: number;
|
|
218
|
+
|
|
219
|
+
@Column(DataTypes.STRING(100))
|
|
220
|
+
declare name: string;
|
|
221
|
+
|
|
222
|
+
// `avatarKey` is registered for you; only the key is stored in the table
|
|
223
|
+
@ExternalField({ store: 'assets', contentType: 'image/png' })
|
|
224
|
+
declare avatar: Buffer;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
prorm.addModel(User);
|
|
228
|
+
await prorm.sync();
|
|
229
|
+
|
|
230
|
+
const user = await User.create({ name: 'Ada' });
|
|
231
|
+
|
|
232
|
+
user.avatar = pngBytes;
|
|
233
|
+
await user.save(); // PUT to S3, then persists avatarKey
|
|
234
|
+
|
|
235
|
+
const fetched = await User.findByPk(user.id);
|
|
236
|
+
await fetched.loadAvatar(); // GET from S3
|
|
237
|
+
fetched.avatar; // Buffer
|
|
238
|
+
|
|
239
|
+
await fetched.deleteAvatar(); // removes the object and clears the key
|
|
240
|
+
await fetched.destroy(); // deleting the row cleans up its objects
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Each external field `x` gets `loadX()`, `saveX(value)`, `deleteX()` and `hasX()`.
|
|
244
|
+
|
|
245
|
+
**Any shipped store works without an adapter.** S3, MinIO, R2, GCS, Azure Blob
|
|
246
|
+
and Redis all have different method names (`putObject` vs `uploadObject` vs
|
|
247
|
+
`uploadBlob`; `deleteObject` vs `removeObject` vs `deleteBlob`) — these are
|
|
248
|
+
normalized internally, so `registerStore()` takes the store directly. Key-value
|
|
249
|
+
stores have no bucket concept, so a configured bucket becomes a key prefix, and
|
|
250
|
+
binary payloads round-trip through base64.
|
|
251
|
+
|
|
252
|
+
| Option | Default | Purpose |
|
|
253
|
+
|--------|---------|---------|
|
|
254
|
+
| `store` | — | Name the store was registered under |
|
|
255
|
+
| `bucket` | store's `defaultBucket` | Bucket/container; a key prefix on key-value stores |
|
|
256
|
+
| `keyColumn` | `<field>Key` | Column holding the object key |
|
|
257
|
+
| `keyPrefix` | `<field>/` | Prefix for generated keys |
|
|
258
|
+
| `contentType` | — | Recorded on write where the store supports it |
|
|
259
|
+
| `encoding` | `buffer` | `buffer`, `utf8`, or `json` (parsed on read, stringified on write) |
|
|
260
|
+
|
|
261
|
+
Pass your own object implementing `ExternalStoreAdapter` to `registerStore()` for
|
|
262
|
+
a store that isn't recognized.
|
|
263
|
+
|
|
167
264
|
## NoSQL Stores
|
|
168
265
|
|
|
169
266
|
NoSQL engines don't share the SQL-shaped `Dialect` interface used above (no `query(sql)`, no identifier escaping, no DDL). Instead, each is its own store class under `src/nosql/<name>/`, exposing the operations that engine actually supports — see each store's README for full details.
|
|
@@ -175,7 +272,7 @@ NoSQL engines don't share the SQL-shaped `Dialect` interface used above (no `que
|
|
|
175
272
|
| Amazon DynamoDB | Stable | `@aws-sdk/client-dynamodb` + `@aws-sdk/lib-dynamodb`, partition/sort-key CRUD, Query/Scan, batch and transactional writes, no arbitrary queries |
|
|
176
273
|
|
|
177
274
|
```ts
|
|
178
|
-
import { MongoStore, RedisStore, DynamoDbStore } from '
|
|
275
|
+
import { MongoStore, RedisStore, DynamoDbStore } from 'ts-prorm-orm';
|
|
179
276
|
|
|
180
277
|
const mongo = new MongoStore({ uri: 'mongodb://localhost:27017', database: 'app' });
|
|
181
278
|
await mongo.connect();
|
|
@@ -214,7 +311,7 @@ unit-tested without the driver installed. Full pages under
|
|
|
214
311
|
| [RethinkDBStore](./docs/stores/rethinkdb.md) | `rethinkdb-ts` | RethinkDB |
|
|
215
312
|
|
|
216
313
|
```ts
|
|
217
|
-
import { S3Store, KafkaStore } from '
|
|
314
|
+
import { S3Store, KafkaStore } from 'ts-prorm-orm';
|
|
218
315
|
|
|
219
316
|
const s3 = new S3Store({ region: 'us-east-1' });
|
|
220
317
|
await s3.connect();
|
|
@@ -255,12 +352,13 @@ const User = prorm.define('User', {
|
|
|
255
352
|
}
|
|
256
353
|
});
|
|
257
354
|
|
|
258
|
-
//
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
355
|
+
// Full-text search (FTS5 on SQLite, GIN/to_tsvector on Postgres,
|
|
356
|
+
// FULLTEXT on MySQL/MariaDB - the dialect decides)
|
|
357
|
+
await prorm.getQueryInterface().createFullTextIndex({
|
|
358
|
+
name: 'users_fts',
|
|
359
|
+
table: 'users',
|
|
360
|
+
columns: ['name', 'email'],
|
|
361
|
+
});
|
|
264
362
|
|
|
265
363
|
// Upsert (INSERT OR REPLACE)
|
|
266
364
|
await User.upsert({
|
|
@@ -304,18 +402,25 @@ const User = prorm.define('User', {
|
|
|
304
402
|
}
|
|
305
403
|
});
|
|
306
404
|
|
|
307
|
-
//
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
405
|
+
// Declare a stored procedure with @Procedure, then let sync() create it
|
|
406
|
+
import { Procedure, ProcedureRegistry } from 'ts-prorm-orm';
|
|
407
|
+
|
|
408
|
+
class UserProcedures {
|
|
409
|
+
@Procedure({
|
|
410
|
+
name: 'get_user_by_email',
|
|
411
|
+
params: [{ name: 'user_email', type: 'VARCHAR(255)', mode: 'IN' }],
|
|
412
|
+
body: 'SELECT * FROM users WHERE email = user_email;',
|
|
413
|
+
})
|
|
414
|
+
getUserByEmail(email: string) {}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
prorm.registerProcedures(UserProcedures);
|
|
418
|
+
await prorm.sync(); // issues the CREATE PROCEDURE
|
|
419
|
+
|
|
420
|
+
// Call it
|
|
421
|
+
const rows = await ProcedureRegistry.call(
|
|
422
|
+
prorm, UserProcedures, 'getUserByEmail', ['john@example.com']
|
|
423
|
+
);
|
|
319
424
|
```
|
|
320
425
|
|
|
321
426
|
### PostgreSQL
|
|
@@ -356,26 +461,26 @@ const User = prorm.define('User', {
|
|
|
356
461
|
properties: DataTypes.HSTORE,
|
|
357
462
|
});
|
|
358
463
|
|
|
359
|
-
|
|
360
|
-
await prorm.query(`
|
|
361
|
-
ALTER TABLE users ENABLE ROW LEVEL SECURITY
|
|
362
|
-
`);
|
|
464
|
+
const qi = prorm.getQueryInterface();
|
|
363
465
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
466
|
+
// Row-Level Security (RLS)
|
|
467
|
+
await qi.enableRowLevelSecurity('users');
|
|
468
|
+
await qi.createPolicy({
|
|
469
|
+
name: 'users_policy',
|
|
470
|
+
table: 'users',
|
|
471
|
+
using: 'user_id = current_user_id()',
|
|
472
|
+
});
|
|
368
473
|
|
|
369
474
|
// Full-text search
|
|
370
|
-
await
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
475
|
+
await qi.createFullTextIndex({
|
|
476
|
+
name: 'users_fts_idx',
|
|
477
|
+
table: 'users',
|
|
478
|
+
columns: ['name', 'email'],
|
|
479
|
+
language: 'english',
|
|
480
|
+
});
|
|
374
481
|
|
|
375
|
-
// Sequence
|
|
376
|
-
await
|
|
377
|
-
CREATE SEQUENCE user_id_seq START WITH 1000
|
|
378
|
-
`);
|
|
482
|
+
// Sequence
|
|
483
|
+
await qi.createSequence('user_id_seq', { start: 1000 });
|
|
379
484
|
```
|
|
380
485
|
|
|
381
486
|
### MariaDB
|
|
@@ -411,17 +516,22 @@ const Product = prorm.define('Product', {
|
|
|
411
516
|
attributes: DataTypes.JSON,
|
|
412
517
|
});
|
|
413
518
|
|
|
414
|
-
// Stored procedure
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
519
|
+
// Stored procedure - declared once, created by sync()
|
|
520
|
+
class ProductProcedures {
|
|
521
|
+
@Procedure({
|
|
522
|
+
name: 'get_products_by_price',
|
|
523
|
+
params: [{ name: 'min_price', type: 'DECIMAL(10,2)', mode: 'IN' }],
|
|
524
|
+
body: 'SELECT * FROM products WHERE price >= min_price;',
|
|
525
|
+
})
|
|
526
|
+
getProductsByPrice(minPrice: number) {}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
prorm.registerProcedures(ProductProcedures);
|
|
530
|
+
await prorm.sync();
|
|
421
531
|
|
|
422
|
-
await
|
|
423
|
-
|
|
424
|
-
|
|
532
|
+
const rows = await ProcedureRegistry.call(
|
|
533
|
+
prorm, ProductProcedures, 'getProductsByPrice', [10.0]
|
|
534
|
+
);
|
|
425
535
|
```
|
|
426
536
|
|
|
427
537
|
### Oracle
|
|
@@ -453,19 +563,23 @@ const Employee = prorm.define('Employee', {
|
|
|
453
563
|
});
|
|
454
564
|
|
|
455
565
|
// Oracle sequence
|
|
456
|
-
await prorm.
|
|
457
|
-
|
|
458
|
-
|
|
566
|
+
await prorm.getQueryInterface().createSequence('employee_seq', {
|
|
567
|
+
start: 1000,
|
|
568
|
+
increment: 1,
|
|
569
|
+
});
|
|
459
570
|
|
|
460
|
-
// Stored procedure with OUT parameter
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
571
|
+
// Stored procedure with an OUT parameter
|
|
572
|
+
class EmployeeProcedures {
|
|
573
|
+
@Procedure({
|
|
574
|
+
name: 'get_employee_count',
|
|
575
|
+
params: [{ name: 'p_count', type: 'NUMBER', mode: 'OUT' }],
|
|
576
|
+
body: 'SELECT COUNT(*) INTO p_count FROM employees;',
|
|
577
|
+
})
|
|
578
|
+
getEmployeeCount() {}
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
prorm.registerProcedures(EmployeeProcedures);
|
|
582
|
+
await prorm.sync();
|
|
469
583
|
```
|
|
470
584
|
|
|
471
585
|
### MSSQL
|
|
@@ -499,11 +613,14 @@ const Order = prorm.define('Order', {
|
|
|
499
613
|
});
|
|
500
614
|
|
|
501
615
|
// MSSQL sequence
|
|
502
|
-
await prorm.
|
|
503
|
-
|
|
504
|
-
|
|
616
|
+
await prorm.getQueryInterface().createSequence('order_id_seq', {
|
|
617
|
+
start: 1000,
|
|
618
|
+
increment: 1,
|
|
619
|
+
});
|
|
505
620
|
|
|
506
|
-
// Row-Level Security
|
|
621
|
+
// Row-Level Security. SQL Server models RLS as a security policy bound to a
|
|
622
|
+
// predicate function rather than as a per-table policy, and prorm has no
|
|
623
|
+
// builder for it yet - this is one of the few places raw SQL is still needed.
|
|
507
624
|
await prorm.query(`
|
|
508
625
|
CREATE SECURITY POLICY SalesFilter
|
|
509
626
|
ADD FILTER PREDICATE dbo.fn_tenantAccessPredicate(TenantId)
|
|
@@ -515,7 +632,7 @@ await prorm.query(`
|
|
|
515
632
|
|
|
516
633
|
```bash
|
|
517
634
|
# Generate a model
|
|
518
|
-
npm run model:
|
|
635
|
+
npm run model:create -- --name User --attributes name:string,email:string
|
|
519
636
|
|
|
520
637
|
# Run migrations
|
|
521
638
|
npm run model:create
|
|
@@ -568,6 +685,11 @@ In-depth, code-level reference docs for each major subsystem, living alongside t
|
|
|
568
685
|
|
|
569
686
|
Online documentation: [GitLab Pages](https://malcolmston.gitlab.io/prod-orm)
|
|
570
687
|
|
|
688
|
+
## Contributing
|
|
689
|
+
|
|
690
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md) for the development workflow, testing,
|
|
691
|
+
the release/publish flow, and the CI/CD + deployment runbook.
|
|
692
|
+
|
|
571
693
|
## License
|
|
572
694
|
|
|
573
695
|
MIT
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit History Query methods
|
|
3
|
+
* Provides model-level and instance-level methods for querying audit history
|
|
4
|
+
*/
|
|
5
|
+
import { AuditLogger } from './logger';
|
|
6
|
+
/**
|
|
7
|
+
* Set the global AuditLogger instance
|
|
8
|
+
* This should be called once when setting up audit logging
|
|
9
|
+
*
|
|
10
|
+
* @param logger - The AuditLogger instance
|
|
11
|
+
*/
|
|
12
|
+
export declare function setAuditLogger(logger: AuditLogger): void;
|
|
13
|
+
/**
|
|
14
|
+
* Get the current AuditLogger instance
|
|
15
|
+
*/
|
|
16
|
+
export declare function getAuditLogger(): AuditLogger | null;
|
|
17
|
+
/**
|
|
18
|
+
* Add model-level audit history methods to a Model class
|
|
19
|
+
*
|
|
20
|
+
* @param model - The Model static (class) to add methods to
|
|
21
|
+
*/
|
|
22
|
+
export declare function addAuditHistoryToModel(model: any): void;
|
|
23
|
+
/**
|
|
24
|
+
* Add instance-level audit history methods to a ModelInstance
|
|
25
|
+
*
|
|
26
|
+
* @param instance - The Model instance prototype
|
|
27
|
+
*/
|
|
28
|
+
export declare function addAuditHistoryToInstance(instance: any): void;
|
|
29
|
+
declare const _default: {
|
|
30
|
+
setAuditLogger: typeof setAuditLogger;
|
|
31
|
+
getAuditLogger: typeof getAuditLogger;
|
|
32
|
+
addAuditHistoryToModel: typeof addAuditHistoryToModel;
|
|
33
|
+
addAuditHistoryToInstance: typeof addAuditHistoryToInstance;
|
|
34
|
+
};
|
|
35
|
+
export default _default;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Module
|
|
3
|
+
* Provides audit logging capabilities for tracking model changes
|
|
4
|
+
*/
|
|
5
|
+
export { AuditLogger, AuditLog, AuditLoggerOptions } from './logger';
|
|
6
|
+
export { setAuditLogger, getAuditLogger, addAuditHistoryToModel, addAuditHistoryToInstance, } from './history-query';
|
|
7
|
+
import { AuditLogger } from './logger';
|
|
8
|
+
import { setAuditLogger, getAuditLogger, addAuditHistoryToModel, addAuditHistoryToInstance } from './history-query';
|
|
9
|
+
declare const _default: {
|
|
10
|
+
AuditLogger: typeof AuditLogger;
|
|
11
|
+
setAuditLogger: typeof setAuditLogger;
|
|
12
|
+
getAuditLogger: typeof getAuditLogger;
|
|
13
|
+
addAuditHistoryToModel: typeof addAuditHistoryToModel;
|
|
14
|
+
addAuditHistoryToInstance: typeof addAuditHistoryToInstance;
|
|
15
|
+
};
|
|
16
|
+
export default _default;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Logger for the TypeScript ORM
|
|
3
|
+
* Provides persistent audit logging for model changes with database storage
|
|
4
|
+
*/
|
|
5
|
+
import { Prorm, ModelStatic } from '../prorm';
|
|
6
|
+
/**
|
|
7
|
+
* Represents a single audit log entry
|
|
8
|
+
*/
|
|
9
|
+
export interface AuditLog {
|
|
10
|
+
/** Unique identifier for the audit log entry */
|
|
11
|
+
id: number;
|
|
12
|
+
/** Name of the table that was modified */
|
|
13
|
+
tableName: string;
|
|
14
|
+
/** Type of action performed (CREATE, UPDATE, DELETE) */
|
|
15
|
+
action: 'CREATE' | 'UPDATE' | 'DELETE';
|
|
16
|
+
/** Primary key identifier of the affected record */
|
|
17
|
+
recordId: string | number;
|
|
18
|
+
/** Previous state of the record (for UPDATE/DELETE) */
|
|
19
|
+
oldValues?: Record<string, any>;
|
|
20
|
+
/** New state of the record (for CREATE/UPDATE) */
|
|
21
|
+
newValues?: Record<string, any>;
|
|
22
|
+
/** ID of the user who made the change */
|
|
23
|
+
userId?: string | number;
|
|
24
|
+
/** Timestamp of when the change occurred */
|
|
25
|
+
timestamp: Date;
|
|
26
|
+
/** IP address of the client that made the change */
|
|
27
|
+
ipAddress?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Options for configuring the AuditLogger
|
|
31
|
+
*/
|
|
32
|
+
export interface AuditLoggerOptions {
|
|
33
|
+
/** Custom table name for the audit log. Default: 'AuditLogs' */
|
|
34
|
+
tableName?: string;
|
|
35
|
+
/** Function to get the current user ID */
|
|
36
|
+
userIdGetter?: () => string | number | undefined;
|
|
37
|
+
/** Function to get the current IP address */
|
|
38
|
+
ipAddressGetter?: () => string | undefined;
|
|
39
|
+
/** Custom model name for the audit log model */
|
|
40
|
+
modelName?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* AuditLogger - Provides persistent audit logging for model changes
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* const auditLogger = new AuditLogger(prorm);
|
|
47
|
+
* await auditLogger.setupHooks();
|
|
48
|
+
*
|
|
49
|
+
* // Manually log an action
|
|
50
|
+
* await auditLogger.logAction('CREATE', 'User', 1, {}, { name: 'John' });
|
|
51
|
+
*
|
|
52
|
+
* // Get audit history
|
|
53
|
+
* const history = await auditLogger.getHistory('User', 1);
|
|
54
|
+
*/
|
|
55
|
+
export declare class AuditLogger {
|
|
56
|
+
private prorm;
|
|
57
|
+
private options;
|
|
58
|
+
private auditModel;
|
|
59
|
+
private hookedModels;
|
|
60
|
+
/**
|
|
61
|
+
* Create a new AuditLogger instance
|
|
62
|
+
*
|
|
63
|
+
* @param prorm - The Prorm instance
|
|
64
|
+
* @param options - Optional configuration options
|
|
65
|
+
*/
|
|
66
|
+
constructor(prorm: Prorm, options?: AuditLoggerOptions);
|
|
67
|
+
/**
|
|
68
|
+
* Get the audit model
|
|
69
|
+
*/
|
|
70
|
+
getModel(): ModelStatic<any> | null;
|
|
71
|
+
/**
|
|
72
|
+
* Get the current user ID
|
|
73
|
+
*/
|
|
74
|
+
private getUserId;
|
|
75
|
+
/**
|
|
76
|
+
* Get the current IP address
|
|
77
|
+
*/
|
|
78
|
+
private getIpAddress;
|
|
79
|
+
/**
|
|
80
|
+
* Define and create the audit log model
|
|
81
|
+
*/
|
|
82
|
+
private ensureAuditModel;
|
|
83
|
+
/**
|
|
84
|
+
* Log an audit action
|
|
85
|
+
*
|
|
86
|
+
* @param action - The type of action (CREATE, UPDATE, DELETE)
|
|
87
|
+
* @param tableName - The name of the table
|
|
88
|
+
* @param recordId - The primary key of the record
|
|
89
|
+
* @param oldValues - The previous values (for UPDATE/DELETE)
|
|
90
|
+
* @param newValues - The new values (for CREATE/UPDATE)
|
|
91
|
+
*/
|
|
92
|
+
logAction(action: 'CREATE' | 'UPDATE' | 'DELETE', tableName: string, recordId: string | number, oldValues?: Record<string, any>, newValues?: Record<string, any>): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Get audit history for a table and optional record
|
|
95
|
+
*
|
|
96
|
+
* @param tableName - The name of the table
|
|
97
|
+
* @param recordId - Optional record ID to filter by
|
|
98
|
+
* @param options - Query options
|
|
99
|
+
*/
|
|
100
|
+
getHistory(tableName: string, recordId?: string | number, options?: {
|
|
101
|
+
limit?: number;
|
|
102
|
+
offset?: number;
|
|
103
|
+
startDate?: Date;
|
|
104
|
+
endDate?: Date;
|
|
105
|
+
}): Promise<AuditLog[]>;
|
|
106
|
+
/**
|
|
107
|
+
* Setup hooks for all models to automatically log changes
|
|
108
|
+
*
|
|
109
|
+
* This method iterates through all registered models and adds
|
|
110
|
+
* beforeCreate, beforeUpdate, and beforeDestroy hooks
|
|
111
|
+
*/
|
|
112
|
+
setupHooks(): void;
|
|
113
|
+
/**
|
|
114
|
+
* Add audit hooks to a specific model
|
|
115
|
+
*
|
|
116
|
+
* @param model - The model to add hooks to
|
|
117
|
+
*/
|
|
118
|
+
addHooksToModel(model: ModelStatic<any>): void;
|
|
119
|
+
/**
|
|
120
|
+
* Check if a model has audit hooks
|
|
121
|
+
*
|
|
122
|
+
* @param model - The model to check
|
|
123
|
+
*/
|
|
124
|
+
hasHooks(model: ModelStatic<any>): boolean;
|
|
125
|
+
}
|
|
126
|
+
export default AuditLogger;
|