ts-prorm-orm 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1111 -0
- package/LICENSE +21 -0
- package/README.md +573 -0
- package/dist/audit/history-query.js +180 -0
- package/dist/audit/index.js +23 -0
- package/dist/audit/logger.js +236 -0
- package/dist/cache/cache-manager.js +84 -0
- package/dist/cache/index.js +16 -0
- package/dist/cache/redis-cluster-cache.js +557 -0
- package/dist/cli.js +2200 -0
- package/dist/compliance/audit-trail.js +68 -0
- package/dist/compliance/backup-verification.js +685 -0
- package/dist/compliance/breach-detector.js +505 -0
- package/dist/compliance/consent-record.js +227 -0
- package/dist/compliance/consent-versioning.js +331 -0
- package/dist/compliance/cross-border-log.js +530 -0
- package/dist/compliance/data-classifier.js +258 -0
- package/dist/compliance/data-lineage.js +565 -0
- package/dist/compliance/data-masker.js +303 -0
- package/dist/compliance/data-portability.js +265 -0
- package/dist/compliance/data-retention.js +195 -0
- package/dist/compliance/dsar-workflow.js +342 -0
- package/dist/compliance/field-encryption.js +223 -0
- package/dist/compliance/immutable-record.js +148 -0
- package/dist/compliance/index.js +260 -0
- package/dist/compliance/privacy-impact-assessment.js +364 -0
- package/dist/compliance/pseudonymization.js +269 -0
- package/dist/compliance/query-firewall.js +1182 -0
- package/dist/compliance/rate-limiter.js +580 -0
- package/dist/compliance/right-to-erasure.js +117 -0
- package/dist/compliance/row-level-security.js +246 -0
- package/dist/compliance/security-decorator.js +574 -0
- package/dist/compliance/security-monitor.js +525 -0
- package/dist/compliance/sensitive-data-discovery.js +476 -0
- package/dist/compliance/session-isolation.js +472 -0
- package/dist/compliance/tls-enforcer.js +108 -0
- package/dist/compliance/worm-storage.js +712 -0
- package/dist/connection-manager.js +198 -0
- package/dist/connection-pool.js +519 -0
- package/dist/decorators/audit.js +136 -0
- package/dist/decorators/belongs-to-many.js +115 -0
- package/dist/decorators/belongs-to.js +115 -0
- package/dist/decorators/check.js +435 -0
- package/dist/decorators/collate.js +329 -0
- package/dist/decorators/comment.js +205 -0
- package/dist/decorators/database-settings.js +236 -0
- package/dist/decorators/default.js +244 -0
- package/dist/decorators/encryption.js +235 -0
- package/dist/decorators/engine.js +97 -0
- package/dist/decorators/fk-constraints.js +594 -0
- package/dist/decorators/foreign-table.js +136 -0
- package/dist/decorators/generated.js +274 -0
- package/dist/decorators/has-many.js +127 -0
- package/dist/decorators/has-one.js +116 -0
- package/dist/decorators/hstore.js +129 -0
- package/dist/decorators/index.js +355 -0
- package/dist/decorators/json-column.js +83 -0
- package/dist/decorators/jsonb.js +101 -0
- package/dist/decorators/orm-decorators.js +425 -0
- package/dist/decorators/permissions.js +294 -0
- package/dist/decorators/procedure.js +210 -0
- package/dist/decorators/query-options.js +556 -0
- package/dist/decorators/range.js +167 -0
- package/dist/decorators/set-column.js +83 -0
- package/dist/decorators/spatial.js +114 -0
- package/dist/decorators/storage.js +580 -0
- package/dist/decorators/timezone.js +512 -0
- package/dist/decorators/trigger.js +90 -0
- package/dist/decorators/uuid.js +135 -0
- package/dist/decorators/view.js +258 -0
- package/dist/diagrams/chen-diagram.js +354 -0
- package/dist/diagrams/class-diagram.js +384 -0
- package/dist/diagrams/dependency-diagram.js +432 -0
- package/dist/diagrams/er-diagram.js +605 -0
- package/dist/diagrams/flow-diagram.js +394 -0
- package/dist/diagrams/gantt-diagram.js +411 -0
- package/dist/diagrams/index-diagram.js +353 -0
- package/dist/diagrams/index.js +184 -0
- package/dist/diagrams/migration-diagram.js +316 -0
- package/dist/diagrams/model-diagram.js +616 -0
- package/dist/diagrams/package-diagram.js +376 -0
- package/dist/diagrams/palette.js +85 -0
- package/dist/diagrams/relational-diagram.js +455 -0
- package/dist/diagrams/schemadoc-diagram.js +309 -0
- package/dist/diagrams/sequence-diagram.js +307 -0
- package/dist/diagrams/state-diagram.js +344 -0
- package/dist/diagrams/svg-dom.js +111 -0
- package/dist/diagrams/tree-diagram.js +250 -0
- package/dist/dialects/clickhouse/index.js +1742 -0
- package/dist/dialects/cockroachdb/index.js +4677 -0
- package/dist/dialects/cratedb/index.js +441 -0
- package/dist/dialects/databricks/index.js +517 -0
- package/dist/dialects/db2/index.js +2225 -0
- package/dist/dialects/dialect.js +720 -0
- package/dist/dialects/duckdb/index.js +2014 -0
- package/dist/dialects/exasol/index.js +357 -0
- package/dist/dialects/firebird/index.js +495 -0
- package/dist/dialects/greenplum/index.js +457 -0
- package/dist/dialects/hana/index.js +1741 -0
- package/dist/dialects/mariadb/index.js +3590 -0
- package/dist/dialects/mssql/index.js +2296 -0
- package/dist/dialects/mysql/index.js +4058 -0
- package/dist/dialects/oracle/index.js +2999 -0
- package/dist/dialects/postgres/index.js +5319 -0
- package/dist/dialects/query-stream-helper.js +152 -0
- package/dist/dialects/questdb/index.js +433 -0
- package/dist/dialects/redshift/index.js +2277 -0
- package/dist/dialects/singlestore/index.js +354 -0
- package/dist/dialects/snowflake/index.js +2082 -0
- package/dist/dialects/spanner/index.js +1768 -0
- package/dist/dialects/sqlite/index.js +3382 -0
- package/dist/dialects/tidb/index.js +377 -0
- package/dist/dialects/timescaledb/index.js +164 -0
- package/dist/dialects/trino/index.js +420 -0
- package/dist/dialects/turso/index.js +227 -0
- package/dist/dialects/vertica/index.js +317 -0
- package/dist/dialects/yugabytedb/index.js +424 -0
- package/dist/errors/index.js +472 -0
- package/dist/errors/utils.js +340 -0
- package/dist/errors.js +21 -0
- package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
- package/dist/extensions/catalog/mssql-features.js +147 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
- package/dist/extensions/catalog/oracle-db2-features.js +196 -0
- package/dist/extensions/catalog/postgres-extensions.js +516 -0
- package/dist/extensions/index.js +71 -0
- package/dist/extensions/types.js +13 -0
- package/dist/foreign-data.js +173 -0
- package/dist/hooks/hooks-manager.js +350 -0
- package/dist/hooks/index.js +37 -0
- package/dist/index.js +463 -0
- package/dist/logging.js +335 -0
- package/dist/migrations/index.js +40 -0
- package/dist/migrations/migration.js +196 -0
- package/dist/migrations/migrator.js +411 -0
- package/dist/migrations/prormmigration.js +275 -0
- package/dist/migrations/query-interface.js +435 -0
- package/dist/migrations/seeder.js +353 -0
- package/dist/models/associations.js +852 -0
- package/dist/models/constraints.js +288 -0
- package/dist/models/data-types.js +2518 -0
- package/dist/models/decorators.js +445 -0
- package/dist/models/index.js +33 -0
- package/dist/models/indexes.js +531 -0
- package/dist/models/methods.js +382 -0
- package/dist/models/model-manager.js +103 -0
- package/dist/models/model.js +5349 -0
- package/dist/models/operators.js +67 -0
- package/dist/models/scopes.js +189 -0
- package/dist/models/typescript-types.js +26 -0
- package/dist/nosql/aerospike/index.js +205 -0
- package/dist/nosql/allegrograph/index.js +169 -0
- package/dist/nosql/arangodb/index.js +364 -0
- package/dist/nosql/azure-blob/index.js +206 -0
- package/dist/nosql/beanstalkd/index.js +231 -0
- package/dist/nosql/beequeue/index.js +210 -0
- package/dist/nosql/bigchaindb/index.js +195 -0
- package/dist/nosql/bigtable/index.js +224 -0
- package/dist/nosql/blazegraph/index.js +173 -0
- package/dist/nosql/bullmq/index.js +191 -0
- package/dist/nosql/cassandra/index.js +174 -0
- package/dist/nosql/chroma/index.js +190 -0
- package/dist/nosql/cloudflare-kv/index.js +220 -0
- package/dist/nosql/coherence/index.js +200 -0
- package/dist/nosql/cosmosdb/index.js +157 -0
- package/dist/nosql/couchbase/index.js +213 -0
- package/dist/nosql/dax/index.js +212 -0
- package/dist/nosql/deno-kv/index.js +206 -0
- package/dist/nosql/dgraph/index.js +171 -0
- package/dist/nosql/doris/index.js +169 -0
- package/dist/nosql/druid/index.js +162 -0
- package/dist/nosql/dynamodb/index.js +937 -0
- package/dist/nosql/elasticsearch/index.js +377 -0
- package/dist/nosql/etcd/index.js +502 -0
- package/dist/nosql/eventhubs/index.js +213 -0
- package/dist/nosql/eventstore/index.js +254 -0
- package/dist/nosql/faunadb/index.js +188 -0
- package/dist/nosql/firestore/index.js +177 -0
- package/dist/nosql/fluree/index.js +148 -0
- package/dist/nosql/fuseki/index.js +170 -0
- package/dist/nosql/gcs/index.js +172 -0
- package/dist/nosql/gearman/index.js +160 -0
- package/dist/nosql/geode/index.js +196 -0
- package/dist/nosql/graphdb/index.js +169 -0
- package/dist/nosql/graylog/index.js +188 -0
- package/dist/nosql/gridgain/index.js +171 -0
- package/dist/nosql/hazelcast/index.js +162 -0
- package/dist/nosql/hbase/index.js +230 -0
- package/dist/nosql/ignite/index.js +173 -0
- package/dist/nosql/immudb/index.js +184 -0
- package/dist/nosql/index.js +232 -0
- package/dist/nosql/infinispan/index.js +200 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.js +234 -0
- package/dist/nosql/keyspaces/index.js +189 -0
- package/dist/nosql/kinesis/index.js +253 -0
- package/dist/nosql/leveldb/index.js +153 -0
- package/dist/nosql/lmdb/index.js +160 -0
- package/dist/nosql/loki/index.js +201 -0
- package/dist/nosql/marklogic/index.js +204 -0
- package/dist/nosql/materialize/index.js +145 -0
- package/dist/nosql/meilisearch/index.js +154 -0
- package/dist/nosql/memcached/index.js +223 -0
- package/dist/nosql/milvus/index.js +410 -0
- package/dist/nosql/minio/index.js +265 -0
- package/dist/nosql/momento/index.js +179 -0
- package/dist/nosql/mongodb/index.js +461 -0
- package/dist/nosql/nats/index.js +247 -0
- package/dist/nosql/nedb/index.js +164 -0
- package/dist/nosql/neo4j/index.js +450 -0
- package/dist/nosql/neptune/index.js +470 -0
- package/dist/nosql/nsq/index.js +200 -0
- package/dist/nosql/opensearch/index.js +186 -0
- package/dist/nosql/orientdb/index.js +175 -0
- package/dist/nosql/papertrail/index.js +200 -0
- package/dist/nosql/pinecone/index.js +0 -0
- package/dist/nosql/pinot/index.js +133 -0
- package/dist/nosql/pouchdb/index.js +172 -0
- package/dist/nosql/prometheus/index.js +174 -0
- package/dist/nosql/provendb/index.js +147 -0
- package/dist/nosql/pubsub/index.js +187 -0
- package/dist/nosql/pulsar/index.js +232 -0
- package/dist/nosql/qdrant/index.js +295 -0
- package/dist/nosql/qldb/index.js +192 -0
- package/dist/nosql/r2/index.js +281 -0
- package/dist/nosql/rabbitmq/index.js +237 -0
- package/dist/nosql/ravendb/index.js +175 -0
- package/dist/nosql/redis/index.js +607 -0
- package/dist/nosql/redpanda/index.js +237 -0
- package/dist/nosql/resque/index.js +203 -0
- package/dist/nosql/rethinkdb/index.js +232 -0
- package/dist/nosql/rocksdb/index.js +152 -0
- package/dist/nosql/rockset/index.js +126 -0
- package/dist/nosql/s3/index.js +298 -0
- package/dist/nosql/scylladb/index.js +178 -0
- package/dist/nosql/signoz/index.js +227 -0
- package/dist/nosql/sns/index.js +201 -0
- package/dist/nosql/solr/index.js +231 -0
- package/dist/nosql/splunk/index.js +227 -0
- package/dist/nosql/sqs/index.js +246 -0
- package/dist/nosql/stardog/index.js +169 -0
- package/dist/nosql/starrocks/index.js +170 -0
- package/dist/nosql/store.js +2 -0
- package/dist/nosql/sumologic/index.js +213 -0
- package/dist/nosql/surrealdb/index.js +179 -0
- package/dist/nosql/terminusdb/index.js +151 -0
- package/dist/nosql/tigergraph/index.js +469 -0
- package/dist/nosql/typesense/index.js +148 -0
- package/dist/nosql/unqlite/index.js +157 -0
- package/dist/nosql/upstash/index.js +167 -0
- package/dist/nosql/vercel-kv/index.js +166 -0
- package/dist/nosql/victoriametrics/index.js +213 -0
- package/dist/nosql/virtuoso/index.js +169 -0
- package/dist/nosql/weaviate/index.js +276 -0
- package/dist/operators/index.js +108 -0
- package/dist/operators.js +2690 -0
- package/dist/prisma-migrate/index.js +38 -0
- package/dist/prisma-migrate/migration-generator.js +125 -0
- package/dist/prisma-migrate/model-generator.js +172 -0
- package/dist/prisma-migrate/relations.js +100 -0
- package/dist/prisma-migrate/schema-parser.js +167 -0
- package/dist/prisma-migrate/type-mapper.js +40 -0
- package/dist/prorm.js +6832 -0
- package/dist/query-builders/cte-builder.js +80 -0
- package/dist/query-builders/functions/aggregate.js +390 -0
- package/dist/query-builders/functions/conditional.js +503 -0
- package/dist/query-builders/functions/datetime.js +695 -0
- package/dist/query-builders/functions/fulltext.js +439 -0
- package/dist/query-builders/functions/index.js +93 -0
- package/dist/query-builders/functions/json.js +427 -0
- package/dist/query-builders/functions/math.js +399 -0
- package/dist/query-builders/functions/string.js +518 -0
- package/dist/query-builders/functions/window.js +328 -0
- package/dist/query-builders/include-builder.js +323 -0
- package/dist/query-builders/index-expression-builder.js +242 -0
- package/dist/query-builders/index.js +161 -0
- package/dist/query-builders/insert-builder.js +164 -0
- package/dist/query-builders/model-helpers.js +38 -0
- package/dist/query-builders/order-limit-builder.js +239 -0
- package/dist/query-builders/sql-compiler.js +2040 -0
- package/dist/query-builders/subquery-builder.js +152 -0
- package/dist/query-builders/update-builder.js +182 -0
- package/dist/query-builders/view-builder.js +218 -0
- package/dist/query-builders/where-builder.js +1532 -0
- package/dist/query-interface.js +622 -0
- package/dist/query-optimizers/batch-optimizer.js +426 -0
- package/dist/query-optimizers/explain-plans.js +415 -0
- package/dist/query-optimizers/index.js +51 -0
- package/dist/query-optimizers/prepared-statement-cache.js +423 -0
- package/dist/query-optimizers/query-hints.js +438 -0
- package/dist/query-optimizers/query-optimizer.js +278 -0
- package/dist/query-optimizers/slow-query-logger.js +271 -0
- package/dist/replica-manager.js +507 -0
- package/dist/schema/index.js +15 -0
- package/dist/schema/migration-generator.js +374 -0
- package/dist/schema/schema-differ.js +549 -0
- package/dist/schema/types.js +6 -0
- package/dist/sql-constants.js +300 -0
- package/dist/sqlite-advanced.js +1047 -0
- package/dist/streams/index.js +12 -0
- package/dist/streams/transforms.js +178 -0
- package/dist/transaction.js +456 -0
- package/dist/types/index.js +180 -0
- package/dist/user-management.js +127 -0
- package/dist/utils/date.js +300 -0
- package/dist/utils/index.js +1079 -0
- package/dist/utils/string.js +161 -0
- package/dist/validators/index.js +19 -0
- package/dist/validators/validator.js +911 -0
- package/package.json +190 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DataClassifier
|
|
4
|
+
*
|
|
5
|
+
* Tags model fields with sensitivity classifications (PII, PHI, PCI, etc.)
|
|
6
|
+
* to enable other compliance classes to auto-identify sensitive data.
|
|
7
|
+
* Stores classifications in model metadata for runtime discovery.
|
|
8
|
+
*
|
|
9
|
+
* Covers ~25 compliance frameworks including:
|
|
10
|
+
* NIST CSF, NIST SP 800-122, FIPS 199, ISO 29101, China Data Security Law,
|
|
11
|
+
* PIPL, AI Act EU, GDPR Art 25/30/32, and data classification requirements.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* // Tag fields with sensitivity levels:
|
|
15
|
+
* @Classify('PII')
|
|
16
|
+
* @FieldClassification('email', 'PII')
|
|
17
|
+
* @FieldClassification('ssn', 'PHI') // PHI = Personal Health Information
|
|
18
|
+
* @FieldClassification('creditCard', 'PCI')
|
|
19
|
+
* @FieldClassification('salary', 'CONFIDENTIAL')
|
|
20
|
+
* class User extends Model { ... }
|
|
21
|
+
*
|
|
22
|
+
* // Query classifications:
|
|
23
|
+
* const fields = DataClassifier.getPIIFields(User);
|
|
24
|
+
* const classification = DataClassifier.getClassification(User, 'email');
|
|
25
|
+
* const all = DataClassifier.getClassifications(User);
|
|
26
|
+
*
|
|
27
|
+
* // Auto-discover fields by name patterns:
|
|
28
|
+
* DataClassifier.autoDiscover(User, ['ssn', 'social', 'dob', 'card', 'password']);
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.DataClassifier = void 0;
|
|
32
|
+
exports.Classify = Classify;
|
|
33
|
+
exports.FieldClassification = FieldClassification;
|
|
34
|
+
exports.getClassification = getClassification;
|
|
35
|
+
exports.getClassificationsForModel = getClassificationsForModel;
|
|
36
|
+
exports.getFieldsByCategory = getFieldsByCategory;
|
|
37
|
+
exports.getPIIFields = getPIIFields;
|
|
38
|
+
exports.getPHIFields = getPHIFields;
|
|
39
|
+
exports.getPCIFields = getPCIFields;
|
|
40
|
+
exports.getFinancialFields = getFinancialFields;
|
|
41
|
+
exports.getFieldsByLevel = getFieldsByLevel;
|
|
42
|
+
exports.getConfidentialFields = getConfidentialFields;
|
|
43
|
+
exports.isSensitive = isSensitive;
|
|
44
|
+
exports.autoDiscover = autoDiscover;
|
|
45
|
+
exports.inheritClassifications = inheritClassifications;
|
|
46
|
+
const CLASSIFICATION_KEY = '__orm_classifications__';
|
|
47
|
+
// ==================== Registry ====================
|
|
48
|
+
function getClassifications(target) {
|
|
49
|
+
if (!target[CLASSIFICATION_KEY]) {
|
|
50
|
+
target[CLASSIFICATION_KEY] = new Map();
|
|
51
|
+
}
|
|
52
|
+
return target[CLASSIFICATION_KEY];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Classify the entire model (applies to all fields, use field-level for specifics).
|
|
56
|
+
*
|
|
57
|
+
* @Classify('CONFIDENTIAL')
|
|
58
|
+
* class FinancialRecord extends Model { ... }
|
|
59
|
+
*/
|
|
60
|
+
function Classify(level) {
|
|
61
|
+
return function (target) {
|
|
62
|
+
// Apply a default classification to all fields
|
|
63
|
+
const map = getClassifications(target);
|
|
64
|
+
// Store at a special key to indicate model-level classification
|
|
65
|
+
map.set('__model__', { level, category: 'PII' });
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Classify a specific field.
|
|
70
|
+
*
|
|
71
|
+
* @FieldClassification('email', 'PII')
|
|
72
|
+
* @FieldClassification('ssn', 'PHI', { level: 'SECRET', regulations: ['HIPAA'] })
|
|
73
|
+
* @FieldClassification('creditCard', 'PCI_PAN', { level: 'TOP_SECRET' })
|
|
74
|
+
*/
|
|
75
|
+
function FieldClassification(field, category, options = {}) {
|
|
76
|
+
return function (target) {
|
|
77
|
+
const map = getClassifications(target);
|
|
78
|
+
map.set(field, {
|
|
79
|
+
level: options.level ?? 'CONFIDENTIAL',
|
|
80
|
+
category,
|
|
81
|
+
isIdentifier: options.isIdentifier ?? false,
|
|
82
|
+
canLog: options.canLog ?? false,
|
|
83
|
+
regulations: options.regulations,
|
|
84
|
+
description: options.description,
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// ==================== Query Methods ====================
|
|
89
|
+
/**
|
|
90
|
+
* Get the classification for a specific field.
|
|
91
|
+
*/
|
|
92
|
+
function getClassification(Model, field) {
|
|
93
|
+
return getClassifications(Model).get(field);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get all classifications for a model.
|
|
97
|
+
*/
|
|
98
|
+
function getClassificationsForModel(Model) {
|
|
99
|
+
return getClassifications(Model);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get all fields with a specific category (e.g., all PII fields).
|
|
103
|
+
*/
|
|
104
|
+
function getFieldsByCategory(Model, category) {
|
|
105
|
+
const map = getClassifications(Model);
|
|
106
|
+
const fields = [];
|
|
107
|
+
for (const [field, meta] of map.entries()) {
|
|
108
|
+
if (field === '__model__')
|
|
109
|
+
continue;
|
|
110
|
+
if (meta.category === category) {
|
|
111
|
+
fields.push(field);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return fields;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Convenience: get all PII (Personally Identifiable Information) fields.
|
|
118
|
+
*/
|
|
119
|
+
function getPIIFields(Model) {
|
|
120
|
+
return getFieldsByCategory(Model, 'PII');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Convenience: get all PHI (Protected Health Information) fields.
|
|
124
|
+
*/
|
|
125
|
+
function getPHIFields(Model) {
|
|
126
|
+
return getFieldsByCategory(Model, 'PHI');
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Convenience: get all PCI (Payment Card Industry) fields.
|
|
130
|
+
*/
|
|
131
|
+
function getPCIFields(Model) {
|
|
132
|
+
return getFieldsByCategory(Model, 'PCI');
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Convenience: get all financial data fields.
|
|
136
|
+
*/
|
|
137
|
+
function getFinancialFields(Model) {
|
|
138
|
+
return getFieldsByCategory(Model, 'FINANCIAL');
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get all fields with a specific sensitivity level.
|
|
142
|
+
*/
|
|
143
|
+
function getFieldsByLevel(Model, level) {
|
|
144
|
+
const map = getClassifications(Model);
|
|
145
|
+
const fields = [];
|
|
146
|
+
for (const [field, meta] of map.entries()) {
|
|
147
|
+
if (field === '__model__')
|
|
148
|
+
continue;
|
|
149
|
+
if (meta.level === level) {
|
|
150
|
+
fields.push(field);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return fields;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get all fields classified as CONFIDENTIAL or higher.
|
|
157
|
+
*/
|
|
158
|
+
function getConfidentialFields(Model) {
|
|
159
|
+
const levels = ['CONFIDENTIAL', 'SECRET', 'TOP_SECRET'];
|
|
160
|
+
const map = getClassifications(Model);
|
|
161
|
+
const fields = [];
|
|
162
|
+
for (const [field, meta] of map.entries()) {
|
|
163
|
+
if (field === '__model__')
|
|
164
|
+
continue;
|
|
165
|
+
if (levels.includes(meta.level)) {
|
|
166
|
+
fields.push(field);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return fields;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Check if a field contains sensitive data (PII, PHI, PCI, etc.).
|
|
173
|
+
*/
|
|
174
|
+
function isSensitive(Model, field) {
|
|
175
|
+
const meta = getClassification(Model, field);
|
|
176
|
+
if (!meta)
|
|
177
|
+
return false;
|
|
178
|
+
return ['PII', 'PHI', 'PCI', 'PCI_PAN', 'FINANCIAL', 'HEALTH', 'BIOMETRIC', 'CUI', 'SENSITIVE'].includes(meta.category);
|
|
179
|
+
}
|
|
180
|
+
// ==================== Auto-Discovery ====================
|
|
181
|
+
const DEFAULT_PATTERNS = {
|
|
182
|
+
PII: [/name/i, /email/i, /phone/i, /address/i, /dob/i, /birth/i, /passport/i, /driver/i],
|
|
183
|
+
PHI: [/medical/i, /diagnosis/i, /prescription/i, /health/i, /treatment/i, /condition/i],
|
|
184
|
+
PCI: [/card/i, /payment/i, /credit/i, /debit/i, /cvv/i, /expir/i],
|
|
185
|
+
PCI_PAN: [/card.?number/i, /pan/i, /card.number/i],
|
|
186
|
+
FINANCIAL: [/salary/i, /income/i, /account/i, /balance/i, /transaction/i, /iban/i, /swift/i],
|
|
187
|
+
HEALTH: [/blood/i, /pulse/i, /heart/i, /weight/i, /height/i, /allergy/i],
|
|
188
|
+
BIOMETRIC: [/fingerprint/i, /face/i, /iris/i, /biometric/i, /voice/i],
|
|
189
|
+
CUI: [/military/i, /government/i, /classified/i],
|
|
190
|
+
SENSITIVE: [/password/i, /secret/i, /private/i, /token/i, /api.?key/i],
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* Automatically classify fields based on their names.
|
|
194
|
+
* Call this after model definition to tag common sensitive fields.
|
|
195
|
+
*
|
|
196
|
+
* @param Model - The model to scan
|
|
197
|
+
* @param patterns - Optional custom patterns (merged with defaults)
|
|
198
|
+
*/
|
|
199
|
+
function autoDiscover(Model, additionalPatterns) {
|
|
200
|
+
const attributes = Model.rawAttributes ?? {};
|
|
201
|
+
const map = getClassifications(Model);
|
|
202
|
+
// Build pattern list
|
|
203
|
+
const patterns = { ...DEFAULT_PATTERNS };
|
|
204
|
+
if (additionalPatterns) {
|
|
205
|
+
for (const p of additionalPatterns) {
|
|
206
|
+
const regex = typeof p === 'string' ? new RegExp(p, 'i') : p;
|
|
207
|
+
patterns.PII.push(regex);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Scan each attribute
|
|
211
|
+
for (const fieldName of Object.keys(attributes)) {
|
|
212
|
+
if (map.has(fieldName))
|
|
213
|
+
continue; // skip if already classified
|
|
214
|
+
for (const [category, regexes] of Object.entries(patterns)) {
|
|
215
|
+
for (const regex of regexes) {
|
|
216
|
+
if (regex.test(fieldName)) {
|
|
217
|
+
map.set(fieldName, {
|
|
218
|
+
level: category === 'PCI_PAN' || category === 'PHI' ? 'TOP_SECRET' : 'CONFIDENTIAL',
|
|
219
|
+
category: category,
|
|
220
|
+
isIdentifier: category === 'PII',
|
|
221
|
+
canLog: false,
|
|
222
|
+
});
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Merge classifications from another model (useful for inheritance).
|
|
231
|
+
*/
|
|
232
|
+
function inheritClassifications(child, parent) {
|
|
233
|
+
const parentMap = getClassifications(parent);
|
|
234
|
+
const childMap = getClassifications(child);
|
|
235
|
+
for (const [field, meta] of parentMap) {
|
|
236
|
+
if (!childMap.has(field)) {
|
|
237
|
+
childMap.set(field, meta);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// ==================== Class Export ====================
|
|
242
|
+
class DataClassifier {
|
|
243
|
+
}
|
|
244
|
+
exports.DataClassifier = DataClassifier;
|
|
245
|
+
DataClassifier.Classify = Classify;
|
|
246
|
+
DataClassifier.FieldClassification = FieldClassification;
|
|
247
|
+
DataClassifier.getClassification = getClassification;
|
|
248
|
+
DataClassifier.getClassifications = getClassificationsForModel;
|
|
249
|
+
DataClassifier.getFieldsByCategory = getFieldsByCategory;
|
|
250
|
+
DataClassifier.getPIIFields = getPIIFields;
|
|
251
|
+
DataClassifier.getPHIFields = getPHIFields;
|
|
252
|
+
DataClassifier.getPCIFields = getPCIFields;
|
|
253
|
+
DataClassifier.getFinancialFields = getFinancialFields;
|
|
254
|
+
DataClassifier.getFieldsByLevel = getFieldsByLevel;
|
|
255
|
+
DataClassifier.getConfidentialFields = getConfidentialFields;
|
|
256
|
+
DataClassifier.isSensitive = isSensitive;
|
|
257
|
+
DataClassifier.autoDiscover = autoDiscover;
|
|
258
|
+
DataClassifier.inheritClassifications = inheritClassifications;
|