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
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* ERDiagram — generates a fully-rendered Entity-Relationship diagram SVG for
|
|
4
|
-
* a collection of ORM models and their associations
|
|
4
|
+
* a collection of ORM models and their associations, styled to the "Industry"
|
|
5
|
+
* blueprint design system.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
* -
|
|
12
|
-
* -
|
|
13
|
-
* -
|
|
14
|
-
* - Fully self-contained SVG (
|
|
7
|
+
* Look:
|
|
8
|
+
* - #f2f2f3 ground with a faint hairline blueprint grid
|
|
9
|
+
* - Solid accent (#5980a6) banner, Barlow Condensed title
|
|
10
|
+
* - White entity cards on a grid: SQUARE corners, 1px hairline borders, a solid
|
|
11
|
+
* accent / accent-2 (two-tone) header bar — no vibrant gradients or shadows
|
|
12
|
+
* - Compact rows: name (mono) + type (mono, neutral) + PK/FK marks
|
|
13
|
+
* - Hairline crow's-foot relationship connectors with mono cardinality marks
|
|
14
|
+
* - Legend bottom-right, Barlow labels
|
|
15
|
+
* - Fully self-contained SVG (fonts via an embedded @import + system fallbacks)
|
|
15
16
|
*
|
|
16
17
|
* Usage:
|
|
17
18
|
* const er = new ERDiagram({
|
|
@@ -57,46 +58,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
57
58
|
exports.ERDiagram = void 0;
|
|
58
59
|
const fs = __importStar(require("fs"));
|
|
59
60
|
const path = __importStar(require("path"));
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
{ header: '#1E3A8A', mid: '#2563EB', light: '#DBEAFE', text: '#1E3A8A' }, // blue
|
|
63
|
-
{ header: '#5B21B6', mid: '#7C3AED', light: '#EDE9FE', text: '#5B21B6' }, // violet
|
|
64
|
-
{ header: '#065F46', mid: '#059669', light: '#D1FAE5', text: '#065F46' }, // emerald
|
|
65
|
-
{ header: '#92400E', mid: '#D97706', light: '#FEF3C7', text: '#92400E' }, // amber
|
|
66
|
-
{ header: '#831843', mid: '#DB2777', light: '#FCE7F3', text: '#831843' }, // pink
|
|
67
|
-
{ header: '#0C4A6E', mid: '#0284C7', light: '#E0F2FE', text: '#0C4A6E' }, // sky
|
|
68
|
-
{ header: '#1E1B4B', mid: '#4338CA', light: '#E0E7FF', text: '#1E1B4B' }, // indigo
|
|
69
|
-
{ header: '#4A1942', mid: '#9333EA', light: '#F3E8FF', text: '#4A1942' }, // purple
|
|
70
|
-
{ header: '#7F1D1D', mid: '#DC2626', light: '#FEE2E2', text: '#7F1D1D' }, // red
|
|
71
|
-
{ header: '#134E4A', mid: '#0D9488', light: '#CCFBF1', text: '#134E4A' }, // teal
|
|
72
|
-
{ header: '#1C1917', mid: '#44403C', light: '#F5F5F4', text: '#1C1917' }, // stone
|
|
73
|
-
{ header: '#14532D', mid: '#16A34A', light: '#DCFCE7', text: '#14532D' }, // green
|
|
74
|
-
];
|
|
75
|
-
// ─── Type-color helper (compact, same palette as model-diagram) ─────────────
|
|
76
|
-
function typeCol(t) {
|
|
77
|
-
const s = t.toUpperCase();
|
|
78
|
-
if (/STRING|VARCHAR|CHAR|TEXT/.test(s))
|
|
79
|
-
return { text: '#059669', bg: '#D1FAE5' };
|
|
80
|
-
if (/INT|BIGINT|SMALLINT|FLOAT|DOUBLE|DECIMAL|NUMERIC/.test(s))
|
|
81
|
-
return { text: '#7C3AED', bg: '#EDE9FE' };
|
|
82
|
-
if (/DATE|TIME|TIMESTAMP/.test(s))
|
|
83
|
-
return { text: '#EA580C', bg: '#FFEDD5' };
|
|
84
|
-
if (/BOOL/.test(s))
|
|
85
|
-
return { text: '#DB2777', bg: '#FCE7F3' };
|
|
86
|
-
if (/UUID/.test(s))
|
|
87
|
-
return { text: '#0891B2', bg: '#CFFAFE' };
|
|
88
|
-
if (/JSONB/.test(s))
|
|
89
|
-
return { text: '#4338CA', bg: '#E0E7FF' };
|
|
90
|
-
if (/JSON/.test(s))
|
|
91
|
-
return { text: '#4F46E5', bg: '#E0E7FF' };
|
|
92
|
-
if (/BLOB|BINARY/.test(s))
|
|
93
|
-
return { text: '#92400E', bg: '#FEF3C7' };
|
|
94
|
-
if (/ENUM/.test(s))
|
|
95
|
-
return { text: '#B45309', bg: '#FEF3C7' };
|
|
96
|
-
if (/ARRAY/.test(s))
|
|
97
|
-
return { text: '#0369A1', bg: '#E0F2FE' };
|
|
98
|
-
return { text: '#475569', bg: '#F1F5F9' };
|
|
99
|
-
}
|
|
61
|
+
const palette_1 = require("./palette");
|
|
62
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
100
63
|
function xmlEsc(s) {
|
|
101
64
|
return String(s ?? '')
|
|
102
65
|
.replace(/&/g, '&')
|
|
@@ -119,6 +82,13 @@ function resolveType(field) {
|
|
|
119
82
|
// ─── ERDiagram class ────────────────────────────────────────────────────────
|
|
120
83
|
class ERDiagram {
|
|
121
84
|
constructor(options) {
|
|
85
|
+
// Resolved Industry colors (populated per-generate()).
|
|
86
|
+
this.accentMid = palette_1.INDUSTRY.accent;
|
|
87
|
+
this.accentText = palette_1.INDUSTRY.accentText;
|
|
88
|
+
this.accentLight = palette_1.INDUSTRY.accentLight;
|
|
89
|
+
this.accent2Mid = palette_1.INDUSTRY.accent2;
|
|
90
|
+
this.accent2Text = palette_1.INDUSTRY.accent2Text;
|
|
91
|
+
this.accent2Light = palette_1.INDUSTRY.accent2Light;
|
|
122
92
|
this.opts = {
|
|
123
93
|
title: options.title ?? 'Entity-Relationship Diagram',
|
|
124
94
|
columns: options.columns ?? 3,
|
|
@@ -129,6 +99,12 @@ class ERDiagram {
|
|
|
129
99
|
color: options.color ?? '',
|
|
130
100
|
};
|
|
131
101
|
}
|
|
102
|
+
/** Two-tone entity styling — even entities accent, odd accent-2. */
|
|
103
|
+
entityStyle(idx) {
|
|
104
|
+
return idx % 2 === 0
|
|
105
|
+
? { header: this.accentMid, light: this.accentLight, text: this.accentText }
|
|
106
|
+
: { header: this.accent2Mid, light: this.accent2Light, text: this.accent2Text };
|
|
107
|
+
}
|
|
132
108
|
// ── Compute box height for a model ──────────────────────────────────────
|
|
133
109
|
boxHeight(model) {
|
|
134
110
|
const fieldCount = Object.keys(model.fields ?? {}).length;
|
|
@@ -181,106 +157,73 @@ class ERDiagram {
|
|
|
181
157
|
return layout;
|
|
182
158
|
}
|
|
183
159
|
// ── Draw a single entity box ─────────────────────────────────────────────
|
|
184
|
-
renderBox(box,
|
|
160
|
+
renderBox(box, idx) {
|
|
185
161
|
const { model, x, y, w, h } = box;
|
|
186
|
-
const
|
|
187
|
-
const uid = model.name.replace(/\W/g, '') + colorIdx;
|
|
162
|
+
const style = this.entityStyle(idx);
|
|
188
163
|
const HDR = ERDiagram.BOX_HDR;
|
|
189
164
|
const ROW = ERDiagram.BOX_ROW;
|
|
190
165
|
const FOOT = ERDiagram.BOX_FOOT;
|
|
191
|
-
const
|
|
166
|
+
const div = palette_1.INDUSTRY.divider;
|
|
192
167
|
const fieldEntries = Object.entries(model.fields ?? {});
|
|
193
168
|
let out = `\n <!-- ═ Entity: ${xmlEsc(model.name)} ═ -->`;
|
|
194
|
-
// ──
|
|
195
|
-
out += `\n <
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
</filter>
|
|
203
|
-
</defs>`;
|
|
204
|
-
out += `\n <rect x="${x - 1}" y="${y - 1}" width="${w + 2}" height="${h + 2}"
|
|
205
|
-
rx="${R + 1}" fill="#CBD5E1" filter="url(#esh${uid})"/>`;
|
|
206
|
-
out += `\n <rect x="${x}" y="${y}" width="${w}" height="${h}"
|
|
207
|
-
rx="${R}" fill="#FFFFFF"/>`;
|
|
208
|
-
// ── Header ──
|
|
209
|
-
out += `\n <rect x="${x}" y="${y}" width="${w}" height="${HDR}"
|
|
210
|
-
rx="${R}" fill="url(#ehg${uid})"/>`;
|
|
211
|
-
// flatten bottom of header
|
|
212
|
-
out += `\n <rect x="${x}" y="${y + HDR - R}" width="${w}" height="${R}"
|
|
213
|
-
fill="url(#ehg${uid})"/>`;
|
|
214
|
-
// Entity name
|
|
215
|
-
out += `\n <text x="${x + w / 2}" y="${y + 28}"
|
|
216
|
-
font-family="system-ui,-apple-system,sans-serif"
|
|
217
|
-
font-size="16" font-weight="800" fill="#FFFFFF"
|
|
218
|
-
text-anchor="middle">${xmlEsc(model.name)}</text>`;
|
|
219
|
-
// Table name sub-label
|
|
169
|
+
// ── Surface + hairline frame (square) ──
|
|
170
|
+
out += `\n <rect x="${x}" y="${y}" width="${w}" height="${h}" fill="${palette_1.INDUSTRY.card}"/>`;
|
|
171
|
+
out += `\n <rect x="${x}" y="${y}" width="${w}" height="${h}" fill="none" stroke="${div}" stroke-width="1"/>`;
|
|
172
|
+
// ── Header (solid accent bar) ──
|
|
173
|
+
out += `\n <rect x="${x}" y="${y}" width="${w}" height="${HDR}" fill="${style.header}"/>`;
|
|
174
|
+
out += `\n <text x="${x + 12}" y="${y + 20}"
|
|
175
|
+
font-family='${palette_1.FONTS.heading}'
|
|
176
|
+
font-size="17" font-weight="600" fill="#FFFFFF">${xmlEsc(model.name)}</text>`;
|
|
220
177
|
const tbl = model.tableName ?? model.name.toLowerCase() + 's';
|
|
221
|
-
out += `\n <text x="${x +
|
|
222
|
-
font-family=
|
|
223
|
-
fill="rgba(255,255,255,0.
|
|
178
|
+
out += `\n <text x="${x + 12}" y="${y + 35}"
|
|
179
|
+
font-family='${palette_1.FONTS.mono}' font-size="10"
|
|
180
|
+
fill="rgba(255,255,255,0.78)">${xmlEsc(tbl)}</text>`;
|
|
224
181
|
// ── Field rows ──
|
|
225
182
|
fieldEntries.forEach(([colName, field], fi) => {
|
|
226
183
|
const fy = y + HDR + fi * ROW;
|
|
227
184
|
const isPK = !!field.primaryKey;
|
|
228
185
|
const isFK = !!(field.foreignKey || field.references);
|
|
229
186
|
const typeStr = resolveType(field);
|
|
230
|
-
const
|
|
231
|
-
const rowBg = fi % 2 === 0 ? '#FFFFFF' : '#F9FAFB';
|
|
187
|
+
const rowBg = fi % 2 === 0 ? palette_1.INDUSTRY.card : palette_1.INDUSTRY.neutral[100];
|
|
232
188
|
out += `\n <rect x="${x}" y="${fy}" width="${w}" height="${ROW}" fill="${rowBg}"/>`;
|
|
233
|
-
// Accent stripe
|
|
189
|
+
// Accent stripe: PK → accent, FK → accent-2.
|
|
234
190
|
if (isPK)
|
|
235
|
-
out += `\n <rect x="${x}" y="${fy}" width="
|
|
191
|
+
out += `\n <rect x="${x}" y="${fy}" width="3" height="${ROW}" fill="${this.accentMid}"/>`;
|
|
236
192
|
else if (isFK)
|
|
237
|
-
out += `\n <rect x="${x}" y="${fy}" width="
|
|
238
|
-
// Icon (SVG instead of emoji)
|
|
239
|
-
const ixc = x + 14;
|
|
193
|
+
out += `\n <rect x="${x}" y="${fy}" width="3" height="${ROW}" fill="${this.accent2Mid}"/>`;
|
|
240
194
|
const ity = fy + ROW / 2 + 4;
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
else if (isFK) {
|
|
247
|
-
out += `\n <g transform="translate(${ixc - 5}, ${ity - 7})">
|
|
248
|
-
<path d="M6 4l4 4-4 4M10 4l4 4" stroke="#3B82F6" stroke-width="1.5" fill="none"/>
|
|
249
|
-
</g>`;
|
|
195
|
+
// PK/FK mark chip.
|
|
196
|
+
if (isPK || isFK) {
|
|
197
|
+
out += `\n <text x="${x + 12}" y="${ity}"
|
|
198
|
+
font-family='${palette_1.FONTS.heading}' font-size="9" font-weight="600"
|
|
199
|
+
fill="${isPK ? this.accentText : this.accent2Text}">${isPK ? 'PK' : 'FK'}</text>`;
|
|
250
200
|
}
|
|
251
201
|
else {
|
|
252
|
-
out += `\n <circle cx="${
|
|
202
|
+
out += `\n <circle cx="${x + 15}" cy="${fy + ROW / 2}" r="2" fill="${palette_1.INDUSTRY.neutral[400]}"/>`;
|
|
253
203
|
}
|
|
254
|
-
// Column name
|
|
255
|
-
const nameC = isPK ?
|
|
256
|
-
const nameW = isPK
|
|
257
|
-
const dispN = colName.length >
|
|
258
|
-
out += `\n <text x="${x +
|
|
259
|
-
font-family=
|
|
204
|
+
// Column name.
|
|
205
|
+
const nameC = isPK ? this.accentText : isFK ? this.accent2Text : palette_1.INDUSTRY.text;
|
|
206
|
+
const nameW = isPK || isFK ? '600' : '400';
|
|
207
|
+
const dispN = colName.length > 16 ? colName.slice(0, 15) + '…' : colName;
|
|
208
|
+
out += `\n <text x="${x + 30}" y="${ity}"
|
|
209
|
+
font-family='${palette_1.FONTS.mono}' font-size="11"
|
|
260
210
|
font-weight="${nameW}" fill="${nameC}">${xmlEsc(dispN)}</text>`;
|
|
261
|
-
// Type
|
|
262
|
-
const typTxt = typeStr.length >
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
font-family="'SF Mono',monospace" font-size="9"
|
|
268
|
-
font-weight="600" fill="${tc.text}" text-anchor="middle">${xmlEsc(typTxt)}</text>`;
|
|
269
|
-
// Row separator
|
|
211
|
+
// Type (right-aligned, mono neutral).
|
|
212
|
+
const typTxt = typeStr.length > 14 ? typeStr.slice(0, 13) + '…' : typeStr;
|
|
213
|
+
out += `\n <text x="${x + w - 8}" y="${ity}"
|
|
214
|
+
font-family='${palette_1.FONTS.mono}' font-size="10"
|
|
215
|
+
fill="${palette_1.INDUSTRY.neutral[700]}" text-anchor="end">${xmlEsc(typTxt)}</text>`;
|
|
216
|
+
// Row separator (hairline).
|
|
270
217
|
out += `\n <line x1="${x}" y1="${fy + ROW}" x2="${x + w}" y2="${fy + ROW}"
|
|
271
|
-
stroke="
|
|
218
|
+
stroke="${div}" stroke-width="1"/>`;
|
|
272
219
|
});
|
|
273
220
|
// ── Footer ──
|
|
274
221
|
const footY = y + HDR + fieldEntries.length * ROW;
|
|
275
|
-
out += `\n <rect x="${x}" y="${footY}" width="${w}" height="${FOOT}" fill="${
|
|
276
|
-
|
|
277
|
-
out += `\n <rect x="${x}" y="${footY + FOOT - R}" width="${w}" height="${R}"
|
|
278
|
-
rx="${R}" fill="${colors.light}"/>`;
|
|
222
|
+
out += `\n <rect x="${x}" y="${footY}" width="${w}" height="${FOOT}" fill="${style.light}"/>`;
|
|
223
|
+
out += `\n <line x1="${x}" y1="${footY}" x2="${x + w}" y2="${footY}" stroke="${div}" stroke-width="1"/>`;
|
|
279
224
|
const assocCount = (model.associations ?? []).length;
|
|
280
|
-
out += `\n <text x="${x +
|
|
281
|
-
font-family=
|
|
282
|
-
${Object.keys(model.fields ?? {}).length} fields${assocCount > 0 ? ` · ${assocCount} associations` : ''}
|
|
283
|
-
</text>`;
|
|
225
|
+
out += `\n <text x="${x + 12}" y="${footY + 17}"
|
|
226
|
+
font-family='${palette_1.FONTS.body}' font-size="10" fill="${palette_1.INDUSTRY.neutral[700]}">${Object.keys(model.fields ?? {}).length} fields${assocCount > 0 ? ` · ${assocCount} associations` : ''}</text>`;
|
|
284
227
|
return out;
|
|
285
228
|
}
|
|
286
229
|
// ── Draw relationship lines (crow's-foot) ──────────────────────────────
|
|
@@ -288,12 +231,14 @@ class ERDiagram {
|
|
|
288
231
|
const byName = new Map();
|
|
289
232
|
layout.forEach((b) => byName.set(b.model.name, b));
|
|
290
233
|
let out = '\n <!-- ═══ RELATIONSHIPS ═══ -->';
|
|
291
|
-
//
|
|
292
|
-
const
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
234
|
+
// Single-hue (accent) connectors — blueprint monochrome.
|
|
235
|
+
const color = this.accentMid;
|
|
236
|
+
// Cardinality marks per association type.
|
|
237
|
+
const REL_MARK = {
|
|
238
|
+
hasOne: '1:1',
|
|
239
|
+
hasMany: '1:N',
|
|
240
|
+
belongsTo: 'N:1',
|
|
241
|
+
belongsToMany: 'N:N',
|
|
297
242
|
};
|
|
298
243
|
// Track drawn pairs to avoid duplicates
|
|
299
244
|
const drawn = new Set();
|
|
@@ -308,15 +253,13 @@ class ERDiagram {
|
|
|
308
253
|
if (drawn.has(pairKey))
|
|
309
254
|
return;
|
|
310
255
|
drawn.add(pairKey);
|
|
311
|
-
const
|
|
312
|
-
const label = assoc.type;
|
|
256
|
+
const label = REL_MARK[assoc.type] ?? assoc.type;
|
|
313
257
|
// Choose connection points (pick nearest horizontal sides)
|
|
314
258
|
let sx, sy, tx, ty;
|
|
315
259
|
let srcSide, tgtSide;
|
|
316
260
|
const srcMidX = srcBox.x + srcBox.w / 2;
|
|
317
261
|
const tgtMidX = tgtBox.x + tgtBox.w / 2;
|
|
318
262
|
if (tgtMidX >= srcMidX) {
|
|
319
|
-
// target is to the right
|
|
320
263
|
sx = srcBox.x + srcBox.w;
|
|
321
264
|
sy = srcBox.y + srcBox.h / 2;
|
|
322
265
|
tx = tgtBox.x;
|
|
@@ -325,7 +268,6 @@ class ERDiagram {
|
|
|
325
268
|
tgtSide = 'left';
|
|
326
269
|
}
|
|
327
270
|
else {
|
|
328
|
-
// target is to the left
|
|
329
271
|
sx = srcBox.x;
|
|
330
272
|
sy = srcBox.y + srcBox.h / 2;
|
|
331
273
|
tx = tgtBox.x + tgtBox.w;
|
|
@@ -355,10 +297,9 @@ class ERDiagram {
|
|
|
355
297
|
const cpOffset = Math.max(dx * 0.5, 60);
|
|
356
298
|
const cpsx = srcSide === 'right' ? sx + cpOffset : sx - cpOffset;
|
|
357
299
|
const cptx = tgtSide === 'left' ? tx - cpOffset : tx + cpOffset;
|
|
358
|
-
// Main line
|
|
300
|
+
// Main line (hairline).
|
|
359
301
|
out += `\n <path d="M ${sx} ${sy} C ${cpsx} ${sy}, ${cptx} ${ty}, ${tx} ${ty}"
|
|
360
|
-
fill="none" stroke="${color}" stroke-width="1.
|
|
361
|
-
stroke-dasharray="0" opacity="0.85"/>`;
|
|
302
|
+
fill="none" stroke="${color}" stroke-width="1.4"/>`;
|
|
362
303
|
// ── Crow's foot at TARGET (many side for hasMany/belongsToMany) ──
|
|
363
304
|
const manyAtTarget = assoc.type === 'hasMany' || assoc.type === 'belongsToMany';
|
|
364
305
|
const manyAtSource = assoc.type === 'belongsTo' || assoc.type === 'belongsToMany';
|
|
@@ -374,19 +315,19 @@ class ERDiagram {
|
|
|
374
315
|
else {
|
|
375
316
|
out += this.singleBar(sx, sy, srcSide === 'right' ? 'left' : 'right', color);
|
|
376
317
|
}
|
|
377
|
-
//
|
|
318
|
+
// Cardinality label at midpoint (mono, hairline chip).
|
|
378
319
|
const mx = (sx + tx) / 2;
|
|
379
320
|
const my = (sy + ty) / 2;
|
|
380
|
-
const labelW = label.length *
|
|
381
|
-
out += `\n <rect x="${mx - labelW / 2}" y="${my -
|
|
382
|
-
|
|
321
|
+
const labelW = label.length * 8 + 14;
|
|
322
|
+
out += `\n <rect x="${mx - labelW / 2}" y="${my - 10}" width="${labelW}" height="18"
|
|
323
|
+
fill="${palette_1.INDUSTRY.card}" stroke="${color}" stroke-width="1"/>`;
|
|
383
324
|
out += `\n <text x="${mx}" y="${my + 3}"
|
|
384
|
-
font-family=
|
|
385
|
-
fill="${
|
|
325
|
+
font-family='${palette_1.FONTS.mono}' font-size="11" font-weight="600"
|
|
326
|
+
fill="${this.accentText}" text-anchor="middle">${xmlEsc(label)}</text>`;
|
|
386
327
|
// Alias label (smaller, below)
|
|
387
328
|
if (assoc.as) {
|
|
388
|
-
out += `\n <text x="${mx}" y="${my +
|
|
389
|
-
font-family=
|
|
329
|
+
out += `\n <text x="${mx}" y="${my + 20}"
|
|
330
|
+
font-family='${palette_1.FONTS.mono}' font-size="9" fill="${palette_1.INDUSTRY.neutral[600]}"
|
|
390
331
|
text-anchor="middle">as: ${xmlEsc(assoc.as)}</text>`;
|
|
391
332
|
}
|
|
392
333
|
});
|
|
@@ -394,23 +335,20 @@ class ERDiagram {
|
|
|
394
335
|
return out;
|
|
395
336
|
}
|
|
396
337
|
// ── Crow's foot symbol ──────────────────────────────────────────────────
|
|
397
|
-
// direction = which way the line is approaching the symbol
|
|
398
|
-
// (the symbol points AWAY from the entity)
|
|
399
338
|
crowFoot(x, y, dir, color) {
|
|
400
|
-
// 'right' means line comes from the right → symbol points left into the entity
|
|
401
339
|
const sign = dir === 'right' ? -1 : 1;
|
|
402
340
|
const reach = 12;
|
|
403
341
|
const spread = 7;
|
|
404
342
|
return `
|
|
405
343
|
<!-- crow foot at (${x},${y}) dir=${dir} -->
|
|
406
344
|
<line x1="${x}" y1="${y}" x2="${x + sign * reach}" y2="${y - spread}"
|
|
407
|
-
stroke="${color}" stroke-width="1.
|
|
345
|
+
stroke="${color}" stroke-width="1.4"/>
|
|
408
346
|
<line x1="${x}" y1="${y}" x2="${x + sign * reach}" y2="${y}"
|
|
409
|
-
stroke="${color}" stroke-width="1.
|
|
347
|
+
stroke="${color}" stroke-width="1.4"/>
|
|
410
348
|
<line x1="${x}" y1="${y}" x2="${x + sign * reach}" y2="${y + spread}"
|
|
411
|
-
stroke="${color}" stroke-width="1.
|
|
349
|
+
stroke="${color}" stroke-width="1.4"/>
|
|
412
350
|
<line x1="${x + sign * reach}" y1="${y - spread}" x2="${x + sign * reach}" y2="${y + spread}"
|
|
413
|
-
stroke="${color}" stroke-width="1.
|
|
351
|
+
stroke="${color}" stroke-width="1.2"/>`;
|
|
414
352
|
}
|
|
415
353
|
// ── Single bar (one) symbol ─────────────────────────────────────────────
|
|
416
354
|
singleBar(x, y, dir, color) {
|
|
@@ -421,9 +359,9 @@ class ERDiagram {
|
|
|
421
359
|
return `
|
|
422
360
|
<!-- single bar at (${x},${y}) dir=${dir} -->
|
|
423
361
|
<line x1="${x + sign * gap}" y1="${y - ht}" x2="${x + sign * gap}" y2="${y + ht}"
|
|
424
|
-
stroke="${color}" stroke-width="1.
|
|
362
|
+
stroke="${color}" stroke-width="1.6"/>
|
|
425
363
|
<line x1="${x + sign * reach}" y1="${y - ht}" x2="${x + sign * reach}" y2="${y + ht}"
|
|
426
|
-
stroke="${color}" stroke-width="1.
|
|
364
|
+
stroke="${color}" stroke-width="1.6"/>`;
|
|
427
365
|
}
|
|
428
366
|
// ── Banner ──────────────────────────────────────────────────────────────
|
|
429
367
|
renderBanner(totalW) {
|
|
@@ -432,91 +370,94 @@ class ERDiagram {
|
|
|
432
370
|
const now = new Date().toISOString().slice(0, 10);
|
|
433
371
|
return /* xml */ `
|
|
434
372
|
<!-- ═══ BANNER ═══ -->
|
|
435
|
-
<
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
<text x="24" y="36"
|
|
445
|
-
font-family="system-ui,-apple-system,sans-serif"
|
|
446
|
-
font-size="24" font-weight="800" fill="#FFFFFF">${xmlEsc(title)}</text>
|
|
447
|
-
<text x="24" y="54"
|
|
448
|
-
font-family="system-ui,sans-serif" font-size="12" fill="rgba(255,255,255,0.55)">
|
|
449
|
-
${models.length} entities · generated ${now}
|
|
450
|
-
</text>
|
|
451
|
-
<!-- ER tag pill -->
|
|
452
|
-
<rect x="${totalW - 100}" y="18" width="80" height="28" rx="14"
|
|
453
|
-
fill="rgba(255,255,255,0.15)"/>
|
|
454
|
-
<text x="${totalW - 60}" y="37"
|
|
455
|
-
font-family="'SF Mono',monospace" font-size="12" font-weight="700"
|
|
456
|
-
fill="rgba(255,255,255,0.9)" text-anchor="middle">ER DIAGRAM</text>`;
|
|
373
|
+
<rect width="${totalW}" height="${H}" fill="${this.accentMid}"/>
|
|
374
|
+
<text x="24" y="30"
|
|
375
|
+
font-family='${palette_1.FONTS.heading}'
|
|
376
|
+
font-size="24" font-weight="600" fill="#FFFFFF">${xmlEsc(title)}</text>
|
|
377
|
+
<text x="24" y="48"
|
|
378
|
+
font-family='${palette_1.FONTS.body}' font-size="12" fill="rgba(255,255,255,0.82)">${models.length} entities · generated ${now}</text>
|
|
379
|
+
<text x="${totalW - 20}" y="30"
|
|
380
|
+
font-family='${palette_1.FONTS.heading}' font-size="12" font-weight="600"
|
|
381
|
+
letter-spacing="1.4" fill="rgba(255,255,255,0.85)" text-anchor="end">ER DIAGRAM</text>`;
|
|
457
382
|
}
|
|
458
383
|
// ── Legend ──────────────────────────────────────────────────────────────
|
|
459
384
|
renderLegend(lx, ly) {
|
|
460
385
|
const LW = ERDiagram.LEGEND_W;
|
|
461
386
|
const LP = ERDiagram.LEGEND_PAD;
|
|
462
387
|
const lineH = 28;
|
|
388
|
+
const div = palette_1.INDUSTRY.divider;
|
|
463
389
|
const items = [
|
|
464
|
-
{
|
|
465
|
-
{
|
|
466
|
-
{
|
|
467
|
-
{
|
|
390
|
+
{ mark: '1:1', label: 'Has One' },
|
|
391
|
+
{ mark: '1:N', label: 'Has Many' },
|
|
392
|
+
{ mark: 'N:1', label: 'Belongs To' },
|
|
393
|
+
{ mark: 'N:N', label: 'Belongs To Many' },
|
|
468
394
|
];
|
|
469
|
-
const legendH = LP * 2 + 24 + items.length * lineH;
|
|
395
|
+
const legendH = LP * 2 + 24 + items.length * lineH + 44;
|
|
470
396
|
let out = `\n <!-- ═══ LEGEND ═══ -->`;
|
|
471
397
|
out += `\n <rect x="${lx}" y="${ly}" width="${LW}" height="${legendH}"
|
|
472
|
-
|
|
473
|
-
out += `\n <rect x="${lx}" y="${ly}" width="${LW}" height="
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
font-family="system-ui,sans-serif" font-size="12" font-weight="700"
|
|
478
|
-
fill="#FFFFFF" text-anchor="middle">LEGEND</text>`;
|
|
398
|
+
fill="${palette_1.INDUSTRY.card}" stroke="${div}" stroke-width="1"/>`;
|
|
399
|
+
out += `\n <rect x="${lx}" y="${ly}" width="${LW}" height="30" fill="${this.accentMid}"/>`;
|
|
400
|
+
out += `\n <text x="${lx + LP}" y="${ly + 20}"
|
|
401
|
+
font-family='${palette_1.FONTS.heading}' font-size="13" font-weight="600"
|
|
402
|
+
letter-spacing="1" fill="#FFFFFF">LEGEND</text>`;
|
|
479
403
|
items.forEach((item, i) => {
|
|
480
|
-
const iy = ly +
|
|
481
|
-
const badgeW =
|
|
482
|
-
out += `\n <rect x="${lx + LP}" y="${iy +
|
|
483
|
-
|
|
484
|
-
out += `\n <text x="${lx + LP + badgeW / 2}" y="${iy +
|
|
485
|
-
font-family=
|
|
486
|
-
fill="${
|
|
487
|
-
// Sample line
|
|
488
|
-
out += `\n <line x1="${lx + LP + badgeW +
|
|
489
|
-
x2="${lx + LP + badgeW +
|
|
490
|
-
stroke="${
|
|
491
|
-
out += `\n <text x="${lx + LP + badgeW +
|
|
492
|
-
font-family=
|
|
493
|
-
fill="
|
|
494
|
-
// Key icon legend (SVG instead of emoji)
|
|
495
|
-
if (i === items.length - 1) {
|
|
496
|
-
const ky = iy + lineH + 4;
|
|
497
|
-
// Key icon
|
|
498
|
-
out += `\n <g transform="translate(${lx + LP}, ${ky + 2})">
|
|
499
|
-
<path d="M8 0l2 2-2 2 1.5 1.5 2-2 2 2 1.5-1.5-2-2 2-2-1.5-1.5-2 2-2-2z" fill="#F59E0B"/>
|
|
500
|
-
</g>`;
|
|
501
|
-
out += `\n <text x="${lx + LP + 22}" y="${ky + 14}"
|
|
502
|
-
font-family="system-ui,sans-serif" font-size="11" fill="#64748B">Primary Key</text>`;
|
|
503
|
-
// Link icon
|
|
504
|
-
out += `\n <g transform="translate(${lx + LP}, ${ky + 18})">
|
|
505
|
-
<path d="M4 2l4 4-4 4M8 2l4 4" stroke="#3B82F6" stroke-width="1.5" fill="none"/>
|
|
506
|
-
</g>`;
|
|
507
|
-
out += `\n <text x="${lx + LP + 22}" y="${ky + 30}"
|
|
508
|
-
font-family="system-ui,sans-serif" font-size="11" fill="#64748B">Foreign Key</text>`;
|
|
509
|
-
}
|
|
404
|
+
const iy = ly + 30 + LP + i * lineH;
|
|
405
|
+
const badgeW = 34;
|
|
406
|
+
out += `\n <rect x="${lx + LP}" y="${iy + 4}" width="${badgeW}" height="18"
|
|
407
|
+
fill="${this.accentLight}" stroke="${div}" stroke-width="1"/>`;
|
|
408
|
+
out += `\n <text x="${lx + LP + badgeW / 2}" y="${iy + 17}"
|
|
409
|
+
font-family='${palette_1.FONTS.mono}' font-size="10" font-weight="600"
|
|
410
|
+
fill="${this.accentText}" text-anchor="middle">${item.mark}</text>`;
|
|
411
|
+
// Sample connector line.
|
|
412
|
+
out += `\n <line x1="${lx + LP + badgeW + 8}" y1="${iy + 13}"
|
|
413
|
+
x2="${lx + LP + badgeW + 30}" y2="${iy + 13}"
|
|
414
|
+
stroke="${this.accentMid}" stroke-width="1.4"/>`;
|
|
415
|
+
out += `\n <text x="${lx + LP + badgeW + 38}" y="${iy + 17}"
|
|
416
|
+
font-family='${palette_1.FONTS.body}' font-size="12"
|
|
417
|
+
fill="${palette_1.INDUSTRY.text}">${item.label}</text>`;
|
|
510
418
|
});
|
|
419
|
+
// PK/FK key.
|
|
420
|
+
const ky = ly + 30 + LP + items.length * lineH + 6;
|
|
421
|
+
out += `\n <line x1="${lx + LP}" y1="${ky + 4}" x2="${lx + LP + 44}" y2="${ky + 4}" stroke="${div}" stroke-width="1"/>`;
|
|
422
|
+
out += `\n <text x="${lx + LP}" y="${ky + 20}"
|
|
423
|
+
font-family='${palette_1.FONTS.heading}' font-size="9" font-weight="600"
|
|
424
|
+
fill="${this.accentText}">PK</text>`;
|
|
425
|
+
out += `\n <text x="${lx + LP + 22}" y="${ky + 20}"
|
|
426
|
+
font-family='${palette_1.FONTS.body}' font-size="11" fill="${palette_1.INDUSTRY.neutral[700]}">Primary Key</text>`;
|
|
427
|
+
out += `\n <text x="${lx + LP}" y="${ky + 36}"
|
|
428
|
+
font-family='${palette_1.FONTS.heading}' font-size="9" font-weight="600"
|
|
429
|
+
fill="${this.accent2Text}">FK</text>`;
|
|
430
|
+
out += `\n <text x="${lx + LP + 22}" y="${ky + 36}"
|
|
431
|
+
font-family='${palette_1.FONTS.body}' font-size="11" fill="${palette_1.INDUSTRY.neutral[700]}">Foreign Key</text>`;
|
|
511
432
|
return out;
|
|
512
433
|
}
|
|
434
|
+
/**
|
|
435
|
+
* Embedded font @import so browsers resolve Barlow / JetBrains Mono. Wrapped
|
|
436
|
+
* in CDATA because the Google-Fonts URL contains raw `&` separators that
|
|
437
|
+
* would otherwise be invalid XML in this string-built document.
|
|
438
|
+
*/
|
|
439
|
+
fontDefs() {
|
|
440
|
+
return `\n <defs><style type="text/css"><![CDATA[${palette_1.FONT_IMPORT}]]></style></defs>`;
|
|
441
|
+
}
|
|
513
442
|
// ── Generate the full SVG ────────────────────────────────────────────────
|
|
514
443
|
generate() {
|
|
515
|
-
const { models,
|
|
444
|
+
const { models, columns } = this.opts;
|
|
445
|
+
void columns;
|
|
516
446
|
const MARGIN = ERDiagram.MARGIN;
|
|
517
447
|
const BANNER = ERDiagram.BANNER_H;
|
|
518
448
|
const LEGEND_W = ERDiagram.LEGEND_W;
|
|
519
449
|
const BOX_W = ERDiagram.BOX_W;
|
|
450
|
+
// Resolve accent / accent-2 from --color (Industry defaults otherwise).
|
|
451
|
+
const accent = (0, palette_1.resolveAccent)(this.opts.color);
|
|
452
|
+
const a2 = (0, palette_1.accent2Of)(accent);
|
|
453
|
+
this.accentMid = accent.mid;
|
|
454
|
+
this.accentText = accent.text;
|
|
455
|
+
this.accentLight = accent.light;
|
|
456
|
+
this.accent2Mid = a2.color;
|
|
457
|
+
this.accent2Text = a2.text;
|
|
458
|
+
this.accent2Light = a2.light;
|
|
459
|
+
// Theme reserved for future dark-mode support of ER (kept API-compatible).
|
|
460
|
+
void (0, palette_1.resolveTheme)(this.opts.theme);
|
|
520
461
|
const layout = this.computeLayout();
|
|
521
462
|
// Guard: with no models there are no boxes, so `Math.max(...[])` would be
|
|
522
463
|
// -Infinity and produce invalid width/height/viewBox. Emit a minimal, valid
|
|
@@ -530,10 +471,11 @@ class ERDiagram {
|
|
|
530
471
|
`<svg xmlns="http://www.w3.org/2000/svg"`,
|
|
531
472
|
` width="${emptyW}" height="${emptyH}"`,
|
|
532
473
|
` viewBox="0 0 ${emptyW} ${emptyH}">`,
|
|
533
|
-
|
|
474
|
+
this.fontDefs(),
|
|
475
|
+
` <rect width="${emptyW}" height="${emptyH}" fill="${palette_1.INDUSTRY.ground}"/>`,
|
|
534
476
|
this.renderBanner(emptyW),
|
|
535
477
|
` <text x="${emptyW / 2}" y="${BANNER + MARGIN + 20}"`,
|
|
536
|
-
` font-family=
|
|
478
|
+
` font-family='${palette_1.FONTS.body}' font-size="14" fill="${palette_1.INDUSTRY.neutral[600]}"`,
|
|
537
479
|
` text-anchor="middle">No entities to display</text>`,
|
|
538
480
|
`</svg>`,
|
|
539
481
|
].join('\n');
|
|
@@ -553,17 +495,18 @@ class ERDiagram {
|
|
|
553
495
|
` width="${totalW}" height="${totalH}"`,
|
|
554
496
|
` viewBox="0 0 ${totalW} ${totalH}">`,
|
|
555
497
|
].join('\n');
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
498
|
+
svg += this.fontDefs();
|
|
499
|
+
// Ground
|
|
500
|
+
svg += `\n <rect width="${totalW}" height="${totalH}" fill="${palette_1.INDUSTRY.ground}"/>`;
|
|
501
|
+
// Faint hairline blueprint grid.
|
|
502
|
+
svg += `\n <!-- blueprint grid -->`;
|
|
560
503
|
for (let gx = 0; gx < totalW; gx += 40) {
|
|
561
504
|
svg += `\n <line x1="${gx}" y1="${BANNER}" x2="${gx}" y2="${totalH}"
|
|
562
|
-
stroke="
|
|
505
|
+
stroke="${palette_1.INDUSTRY.neutral[200]}" stroke-width="0.5" opacity="0.6"/>`;
|
|
563
506
|
}
|
|
564
507
|
for (let gy = BANNER; gy < totalH; gy += 40) {
|
|
565
508
|
svg += `\n <line x1="0" y1="${gy}" x2="${totalW}" y2="${gy}"
|
|
566
|
-
stroke="
|
|
509
|
+
stroke="${palette_1.INDUSTRY.neutral[200]}" stroke-width="0.5" opacity="0.6"/>`;
|
|
567
510
|
}
|
|
568
511
|
// Banner
|
|
569
512
|
svg += this.renderBanner(totalW);
|
|
@@ -594,12 +537,12 @@ class ERDiagram {
|
|
|
594
537
|
exports.ERDiagram = ERDiagram;
|
|
595
538
|
// Entity box constants (px)
|
|
596
539
|
ERDiagram.BOX_W = 270;
|
|
597
|
-
ERDiagram.BOX_HDR =
|
|
540
|
+
ERDiagram.BOX_HDR = 42;
|
|
598
541
|
ERDiagram.BOX_ROW = 26;
|
|
599
|
-
ERDiagram.BOX_FOOT =
|
|
542
|
+
ERDiagram.BOX_FOOT = 26;
|
|
600
543
|
ERDiagram.MIN_H = 100;
|
|
601
544
|
// Diagram chrome constants
|
|
602
|
-
ERDiagram.BANNER_H =
|
|
603
|
-
ERDiagram.LEGEND_W =
|
|
545
|
+
ERDiagram.BANNER_H = 60;
|
|
546
|
+
ERDiagram.LEGEND_W = 210;
|
|
604
547
|
ERDiagram.LEGEND_PAD = 16;
|
|
605
548
|
ERDiagram.MARGIN = 48;
|