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,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TypeScript interfaces for the Prorm-like ORM
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.QueryTypes = exports.IsolationLevel = exports.Transaction = exports.LockLevel = exports.ValidateOn = exports.SortDirection = exports.LoggingLevel = exports.ReferentialAction = void 0;
|
|
7
|
+
// ==================== Referential Actions ====================
|
|
8
|
+
/**
|
|
9
|
+
* Referential actions for foreign key constraints (onDelete / onUpdate).
|
|
10
|
+
*
|
|
11
|
+
* This enum is a companion to the existing string-literal unions used for
|
|
12
|
+
* `onDelete`/`onUpdate` fields (e.g. `'CASCADE' | 'RESTRICT' | ...`). Both
|
|
13
|
+
* forms are accepted wherever these fields appear, so existing string
|
|
14
|
+
* literals continue to work unchanged.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { ReferentialAction } from 'prorm';
|
|
19
|
+
*
|
|
20
|
+
* User.hasMany(Post, {
|
|
21
|
+
* foreignKey: 'userId',
|
|
22
|
+
* onDelete: ReferentialAction.Cascade,
|
|
23
|
+
* onUpdate: ReferentialAction.Cascade,
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* // Equivalent to the string-literal form:
|
|
27
|
+
* User.hasMany(Post, {
|
|
28
|
+
* foreignKey: 'userId',
|
|
29
|
+
* onDelete: 'CASCADE',
|
|
30
|
+
* onUpdate: 'CASCADE',
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
var ReferentialAction;
|
|
35
|
+
(function (ReferentialAction) {
|
|
36
|
+
ReferentialAction["Cascade"] = "CASCADE";
|
|
37
|
+
ReferentialAction["Restrict"] = "RESTRICT";
|
|
38
|
+
ReferentialAction["SetNull"] = "SET NULL";
|
|
39
|
+
ReferentialAction["NoAction"] = "NO ACTION";
|
|
40
|
+
ReferentialAction["SetDefault"] = "SET DEFAULT";
|
|
41
|
+
})(ReferentialAction || (exports.ReferentialAction = ReferentialAction = {}));
|
|
42
|
+
// ==================== Logging Levels ====================
|
|
43
|
+
/**
|
|
44
|
+
* Minimum log level for Prorm's built-in logger.
|
|
45
|
+
*
|
|
46
|
+
* This enum is a companion to the existing string-literal union used for
|
|
47
|
+
* `loggingLevel` (`'debug' | 'info' | 'warn' | 'error'`). Both forms are
|
|
48
|
+
* accepted wherever this field appears, so existing string literals
|
|
49
|
+
* continue to work unchanged.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* import { LoggingLevel } from 'prorm';
|
|
54
|
+
*
|
|
55
|
+
* new Prorm({
|
|
56
|
+
* dialect: 'postgres',
|
|
57
|
+
* loggingLevel: LoggingLevel.Warn,
|
|
58
|
+
* });
|
|
59
|
+
*
|
|
60
|
+
* // Equivalent to the string-literal form:
|
|
61
|
+
* new Prorm({
|
|
62
|
+
* dialect: 'postgres',
|
|
63
|
+
* loggingLevel: 'warn',
|
|
64
|
+
* });
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
var LoggingLevel;
|
|
68
|
+
(function (LoggingLevel) {
|
|
69
|
+
LoggingLevel["Debug"] = "debug";
|
|
70
|
+
LoggingLevel["Info"] = "info";
|
|
71
|
+
LoggingLevel["Warn"] = "warn";
|
|
72
|
+
LoggingLevel["Error"] = "error";
|
|
73
|
+
})(LoggingLevel || (exports.LoggingLevel = LoggingLevel = {}));
|
|
74
|
+
/**
|
|
75
|
+
* Sort direction for index column ordering.
|
|
76
|
+
*
|
|
77
|
+
* Companion enum for the `'ASC' | 'DESC'` string-literal union used by
|
|
78
|
+
* {@link IndexField.order}. Raw string literals remain valid; the enum is an
|
|
79
|
+
* additive, opt-in alternative.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* // Using raw string literals (still supported)
|
|
84
|
+
* indexes: [{ fields: [{ name: 'email', order: 'DESC' }] }]
|
|
85
|
+
*
|
|
86
|
+
* // Using the SortDirection enum
|
|
87
|
+
* import { SortDirection } from 'prorm';
|
|
88
|
+
* indexes: [{ fields: [{ name: 'email', order: SortDirection.DESC }] }]
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
var SortDirection;
|
|
92
|
+
(function (SortDirection) {
|
|
93
|
+
SortDirection["ASC"] = "ASC";
|
|
94
|
+
SortDirection["DESC"] = "DESC";
|
|
95
|
+
})(SortDirection || (exports.SortDirection = SortDirection = {}));
|
|
96
|
+
/**
|
|
97
|
+
* Companion enum for `ValidateOnOption`. Mirrors the same fixed set of
|
|
98
|
+
* string values so callers who prefer enums (autocomplete, refactor-safe
|
|
99
|
+
* references, etc.) can use `ValidateOn.Create` instead of the raw string
|
|
100
|
+
* literal `'create'`. Both forms are accepted anywhere `ValidateOnOption`
|
|
101
|
+
* is used - this is purely additive and does not replace the string
|
|
102
|
+
* literal union.
|
|
103
|
+
*/
|
|
104
|
+
var ValidateOn;
|
|
105
|
+
(function (ValidateOn) {
|
|
106
|
+
ValidateOn["Create"] = "create";
|
|
107
|
+
ValidateOn["Update"] = "update";
|
|
108
|
+
ValidateOn["Save"] = "save";
|
|
109
|
+
ValidateOn["SaveOnly"] = "saveOnly";
|
|
110
|
+
})(ValidateOn || (exports.ValidateOn = ValidateOn = {}));
|
|
111
|
+
/**
|
|
112
|
+
* Lock types for row-level locking
|
|
113
|
+
* - 'UPDATE': FOR UPDATE (PostgreSQL/MySQL) - prevents other transactions from modifying the rows
|
|
114
|
+
* - 'SHARE': FOR SHARE (PostgreSQL) / LOCK IN SHARE MODE (MySQL) - allows other transactions to read but not modify
|
|
115
|
+
* - 'KEY SHARE': FOR KEY SHARE (PostgreSQL only) - prevents key updates but allows row updates
|
|
116
|
+
*/
|
|
117
|
+
var LockLevel;
|
|
118
|
+
(function (LockLevel) {
|
|
119
|
+
LockLevel["Share"] = "SHARE";
|
|
120
|
+
LockLevel["Update"] = "UPDATE";
|
|
121
|
+
LockLevel["KeyShare"] = "KEY SHARE";
|
|
122
|
+
})(LockLevel || (exports.LockLevel = LockLevel = {}));
|
|
123
|
+
// ==================== Transaction Options ====================
|
|
124
|
+
/**
|
|
125
|
+
* Transaction class
|
|
126
|
+
*/
|
|
127
|
+
class Transaction {
|
|
128
|
+
constructor(options) {
|
|
129
|
+
this.id = `tx_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
130
|
+
this.finished = false;
|
|
131
|
+
this.options = options || {};
|
|
132
|
+
this.parent = null;
|
|
133
|
+
this.savepoints = [];
|
|
134
|
+
}
|
|
135
|
+
async commit() {
|
|
136
|
+
this.finished = true;
|
|
137
|
+
}
|
|
138
|
+
async rollback() {
|
|
139
|
+
this.finished = true;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.Transaction = Transaction;
|
|
143
|
+
/**
|
|
144
|
+
* ANSI SQL transaction isolation levels.
|
|
145
|
+
*
|
|
146
|
+
* This is a companion enum for `IsolationLevelString` / the
|
|
147
|
+
* `TransactionOptions.isolationLevel` field. The field accepts both this
|
|
148
|
+
* enum and the raw string literals for backwards compatibility, so either
|
|
149
|
+
* of the following work:
|
|
150
|
+
* @example
|
|
151
|
+
* transaction.start({ isolationLevel: 'SERIALIZABLE' });
|
|
152
|
+
* @example
|
|
153
|
+
* transaction.start({ isolationLevel: IsolationLevel.Serializable });
|
|
154
|
+
*/
|
|
155
|
+
var IsolationLevel;
|
|
156
|
+
(function (IsolationLevel) {
|
|
157
|
+
IsolationLevel["ReadUncommitted"] = "READ UNCOMMITTED";
|
|
158
|
+
IsolationLevel["ReadCommitted"] = "READ COMMITTED";
|
|
159
|
+
IsolationLevel["RepeatableRead"] = "REPEATABLE READ";
|
|
160
|
+
IsolationLevel["Serializable"] = "SERIALIZABLE";
|
|
161
|
+
})(IsolationLevel || (exports.IsolationLevel = IsolationLevel = {}));
|
|
162
|
+
// ==================== Query Types ====================
|
|
163
|
+
/**
|
|
164
|
+
* Enum for query types used in prorm.query()
|
|
165
|
+
* @example
|
|
166
|
+
* prorm.query('SELECT * FROM users', { type: QueryTypes.SELECT })
|
|
167
|
+
* prorm.query('INSERT INTO users VALUES(...)', { type: QueryTypes.INSERT })
|
|
168
|
+
*/
|
|
169
|
+
var QueryTypes;
|
|
170
|
+
(function (QueryTypes) {
|
|
171
|
+
QueryTypes["SELECT"] = "SELECT";
|
|
172
|
+
QueryTypes["INSERT"] = "INSERT";
|
|
173
|
+
QueryTypes["UPDATE"] = "UPDATE";
|
|
174
|
+
QueryTypes["DELETE"] = "DELETE";
|
|
175
|
+
QueryTypes["BULKINSERT"] = "BULKINSERT";
|
|
176
|
+
QueryTypes["BULKUPDATE"] = "BULKUPDATE";
|
|
177
|
+
QueryTypes["BULKDELETE"] = "BULKDELETE";
|
|
178
|
+
QueryTypes["RAW"] = "RAW";
|
|
179
|
+
QueryTypes["CALL"] = "CALL";
|
|
180
|
+
})(QueryTypes || (exports.QueryTypes = QueryTypes = {}));
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* User and privilege management for the TypeScript ORM.
|
|
4
|
+
* Supported dialects: MySQL, MariaDB (MySQL 8+ roles also supported).
|
|
5
|
+
* SQLite throws DatabaseError – user management is not a concept in SQLite.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.UserManager = exports.PRIVILEGE_LEVELS = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Convenience groupings of privilege types by category.
|
|
11
|
+
*/
|
|
12
|
+
exports.PRIVILEGE_LEVELS = {
|
|
13
|
+
ALL: ['ALL PRIVILEGES'],
|
|
14
|
+
READ: ['SELECT'],
|
|
15
|
+
WRITE: ['INSERT', 'UPDATE', 'DELETE'],
|
|
16
|
+
DDL: ['CREATE', 'DROP', 'ALTER', 'INDEX'],
|
|
17
|
+
DML: ['SELECT', 'INSERT', 'UPDATE', 'DELETE'],
|
|
18
|
+
ROUTINE: ['EXECUTE', 'CREATE ROUTINE', 'ALTER ROUTINE'],
|
|
19
|
+
VIEW: ['CREATE VIEW', 'SHOW VIEW'],
|
|
20
|
+
};
|
|
21
|
+
class UserManager {
|
|
22
|
+
constructor(prorm) {
|
|
23
|
+
this.prorm = prorm;
|
|
24
|
+
}
|
|
25
|
+
// ---- User CRUD ----
|
|
26
|
+
async createUser(username, options) {
|
|
27
|
+
const dialect = this.prorm.dialect;
|
|
28
|
+
if (!dialect)
|
|
29
|
+
throw new Error('Database not connected');
|
|
30
|
+
const sql = dialect.buildCreateUserQuery(username, options);
|
|
31
|
+
await dialect.query(sql);
|
|
32
|
+
}
|
|
33
|
+
async alterUser(username, options) {
|
|
34
|
+
const dialect = this.prorm.dialect;
|
|
35
|
+
if (!dialect)
|
|
36
|
+
throw new Error('Database not connected');
|
|
37
|
+
const sql = dialect.buildAlterUserQuery(username, options);
|
|
38
|
+
await dialect.query(sql);
|
|
39
|
+
}
|
|
40
|
+
async dropUser(username, options) {
|
|
41
|
+
const dialect = this.prorm.dialect;
|
|
42
|
+
if (!dialect)
|
|
43
|
+
throw new Error('Database not connected');
|
|
44
|
+
const sql = dialect.buildDropUserQuery(username, options);
|
|
45
|
+
await dialect.query(sql);
|
|
46
|
+
}
|
|
47
|
+
async getUsers() {
|
|
48
|
+
const dialect = this.prorm.dialect;
|
|
49
|
+
if (!dialect)
|
|
50
|
+
throw new Error('Database not connected');
|
|
51
|
+
const sql = dialect.getUsersQuery();
|
|
52
|
+
const result = await dialect.query(sql);
|
|
53
|
+
return result.rows || [];
|
|
54
|
+
}
|
|
55
|
+
async userExists(username, host) {
|
|
56
|
+
const users = await this.getUsers();
|
|
57
|
+
return users.some((u) => u.user === username && (!host || u.host === host));
|
|
58
|
+
}
|
|
59
|
+
// ---- Grants ----
|
|
60
|
+
async grant(options) {
|
|
61
|
+
const dialect = this.prorm.dialect;
|
|
62
|
+
if (!dialect)
|
|
63
|
+
throw new Error('Database not connected');
|
|
64
|
+
const sql = dialect.buildGrantQuery(options);
|
|
65
|
+
await dialect.query(sql);
|
|
66
|
+
}
|
|
67
|
+
async revoke(options) {
|
|
68
|
+
const dialect = this.prorm.dialect;
|
|
69
|
+
if (!dialect)
|
|
70
|
+
throw new Error('Database not connected');
|
|
71
|
+
const sql = dialect.buildRevokeQuery(options);
|
|
72
|
+
await dialect.query(sql);
|
|
73
|
+
}
|
|
74
|
+
async showGrants(username, host) {
|
|
75
|
+
const dialect = this.prorm.dialect;
|
|
76
|
+
if (!dialect)
|
|
77
|
+
throw new Error('Database not connected');
|
|
78
|
+
const sql = dialect.buildShowGrantsQuery(username, host);
|
|
79
|
+
const result = await dialect.query(sql);
|
|
80
|
+
return result.rows || [];
|
|
81
|
+
}
|
|
82
|
+
async flushPrivileges() {
|
|
83
|
+
const dialect = this.prorm.dialect;
|
|
84
|
+
if (!dialect)
|
|
85
|
+
throw new Error('Database not connected');
|
|
86
|
+
const sql = dialect.buildFlushPrivilegesQuery();
|
|
87
|
+
await dialect.query(sql);
|
|
88
|
+
}
|
|
89
|
+
// ---- Roles (MySQL 8+ / MariaDB) ----
|
|
90
|
+
async createRole(roleName, options) {
|
|
91
|
+
const dialect = this.prorm.dialect;
|
|
92
|
+
if (!dialect)
|
|
93
|
+
throw new Error('Database not connected');
|
|
94
|
+
const sql = dialect.buildCreateRoleQuery(roleName, options);
|
|
95
|
+
await dialect.query(sql);
|
|
96
|
+
}
|
|
97
|
+
async dropRole(roleName, options) {
|
|
98
|
+
const dialect = this.prorm.dialect;
|
|
99
|
+
if (!dialect)
|
|
100
|
+
throw new Error('Database not connected');
|
|
101
|
+
const sql = dialect.buildDropRoleQuery(roleName, options);
|
|
102
|
+
await dialect.query(sql);
|
|
103
|
+
}
|
|
104
|
+
async grantRole(role, to, options) {
|
|
105
|
+
const dialect = this.prorm.dialect;
|
|
106
|
+
if (!dialect)
|
|
107
|
+
throw new Error('Database not connected');
|
|
108
|
+
const sql = dialect.buildGrantRoleQuery(role, to, options);
|
|
109
|
+
await dialect.query(sql);
|
|
110
|
+
}
|
|
111
|
+
async revokeRole(role, from, options) {
|
|
112
|
+
const dialect = this.prorm.dialect;
|
|
113
|
+
if (!dialect)
|
|
114
|
+
throw new Error('Database not connected');
|
|
115
|
+
const sql = dialect.buildRevokeRoleQuery(role, from, options);
|
|
116
|
+
await dialect.query(sql);
|
|
117
|
+
}
|
|
118
|
+
async getRoles() {
|
|
119
|
+
const dialect = this.prorm.dialect;
|
|
120
|
+
if (!dialect)
|
|
121
|
+
throw new Error('Database not connected');
|
|
122
|
+
const sql = dialect.getRolesQuery();
|
|
123
|
+
const result = await dialect.query(sql);
|
|
124
|
+
return (result.rows || []).map((r) => r.role || r.Role || r.rolname || '');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.UserManager = UserManager;
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Date utility functions
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.dateUtils = exports.format = void 0;
|
|
7
|
+
exports.now = now;
|
|
8
|
+
exports.today = today;
|
|
9
|
+
exports.tomorrow = tomorrow;
|
|
10
|
+
exports.yesterday = yesterday;
|
|
11
|
+
exports.addDays = addDays;
|
|
12
|
+
exports.subtractDays = subtractDays;
|
|
13
|
+
exports.addMonths = addMonths;
|
|
14
|
+
exports.subtractMonths = subtractMonths;
|
|
15
|
+
exports.addYears = addYears;
|
|
16
|
+
exports.subtractYears = subtractYears;
|
|
17
|
+
exports.formatDate = formatDate;
|
|
18
|
+
exports.formatISO = formatISO;
|
|
19
|
+
exports.formatRelative = formatRelative;
|
|
20
|
+
exports.isToday = isToday;
|
|
21
|
+
exports.isTomorrow = isTomorrow;
|
|
22
|
+
exports.isYesterday = isYesterday;
|
|
23
|
+
exports.isSameDay = isSameDay;
|
|
24
|
+
exports.startOfDay = startOfDay;
|
|
25
|
+
exports.endOfDay = endOfDay;
|
|
26
|
+
exports.startOfMonth = startOfMonth;
|
|
27
|
+
exports.endOfMonth = endOfMonth;
|
|
28
|
+
exports.startOfYear = startOfYear;
|
|
29
|
+
exports.endOfYear = endOfYear;
|
|
30
|
+
exports.daysBetween = daysBetween;
|
|
31
|
+
exports.isValidDate = isValidDate;
|
|
32
|
+
// ==================== Date Utils ====================
|
|
33
|
+
/**
|
|
34
|
+
* Get current date/time
|
|
35
|
+
*/
|
|
36
|
+
function now() {
|
|
37
|
+
return new Date();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get today's date (midnight)
|
|
41
|
+
*/
|
|
42
|
+
function today() {
|
|
43
|
+
const d = new Date();
|
|
44
|
+
d.setHours(0, 0, 0, 0);
|
|
45
|
+
return d;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get tomorrow's date (midnight)
|
|
49
|
+
*/
|
|
50
|
+
function tomorrow() {
|
|
51
|
+
const d = today();
|
|
52
|
+
d.setDate(d.getDate() + 1);
|
|
53
|
+
return d;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get yesterday's date (midnight)
|
|
57
|
+
*/
|
|
58
|
+
function yesterday() {
|
|
59
|
+
const d = today();
|
|
60
|
+
d.setDate(d.getDate() - 1);
|
|
61
|
+
return d;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Add days to a date
|
|
65
|
+
*/
|
|
66
|
+
function addDays(date, days) {
|
|
67
|
+
const result = new Date(date);
|
|
68
|
+
result.setDate(result.getDate() + days);
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Subtract days from a date
|
|
73
|
+
*/
|
|
74
|
+
function subtractDays(date, days) {
|
|
75
|
+
return addDays(date, -days);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Add months to a date
|
|
79
|
+
*/
|
|
80
|
+
function addMonths(date, months) {
|
|
81
|
+
const result = new Date(date);
|
|
82
|
+
result.setMonth(result.getMonth() + months);
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Subtract months from a date
|
|
87
|
+
*/
|
|
88
|
+
function subtractMonths(date, months) {
|
|
89
|
+
return addMonths(date, -months);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Add years to a date
|
|
93
|
+
*/
|
|
94
|
+
function addYears(date, years) {
|
|
95
|
+
const result = new Date(date);
|
|
96
|
+
result.setFullYear(result.getFullYear() + years);
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Subtract years from a date
|
|
101
|
+
*/
|
|
102
|
+
function subtractYears(date, years) {
|
|
103
|
+
return addYears(date, -years);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Format a date
|
|
107
|
+
* Format tokens: YYYY, YY, MM, DD, HH, mm, ss
|
|
108
|
+
*
|
|
109
|
+
* Note: exported as `formatDate` (not `format`) so it doesn't collide with
|
|
110
|
+
* the numeric `format(value, decimals)` helper in './index'. Local exports
|
|
111
|
+
* in index.ts take precedence over this module's `export * from './date'`
|
|
112
|
+
* re-export for identically-named bindings, so a top-level `utils.format`
|
|
113
|
+
* pointing at a date formatter would silently break numeric-formatting
|
|
114
|
+
* callers (and vice versa).
|
|
115
|
+
*/
|
|
116
|
+
function formatDate(date, formatStr = 'YYYY-MM-DD') {
|
|
117
|
+
// Use UTC getters so formatting is stable regardless of the host's local
|
|
118
|
+
// timezone. `new Date('2024-01-15')` (a date-only ISO string) parses as
|
|
119
|
+
// UTC midnight; using local getters (getDate/getMonth/...) shifts the
|
|
120
|
+
// result by a day in timezones behind UTC.
|
|
121
|
+
const year = date.getUTCFullYear();
|
|
122
|
+
const month = String(date.getUTCMonth() + 1).padStart(2, '0');
|
|
123
|
+
const day = String(date.getUTCDate()).padStart(2, '0');
|
|
124
|
+
const hours = String(date.getUTCHours()).padStart(2, '0');
|
|
125
|
+
const minutes = String(date.getUTCMinutes()).padStart(2, '0');
|
|
126
|
+
const seconds = String(date.getUTCSeconds()).padStart(2, '0');
|
|
127
|
+
return formatStr
|
|
128
|
+
.replace('YYYY', String(year))
|
|
129
|
+
.replace('YY', String(year).slice(-2))
|
|
130
|
+
.replace('MM', month)
|
|
131
|
+
.replace('DD', day)
|
|
132
|
+
.replace('HH', hours)
|
|
133
|
+
.replace('mm', minutes)
|
|
134
|
+
.replace('ss', seconds);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Format a date (alias for formatDate). Kept for direct
|
|
138
|
+
* `import { format } from './utils/date'` consumers; not re-exported at the
|
|
139
|
+
* top-level `utils` barrel under this name (see note above).
|
|
140
|
+
*/
|
|
141
|
+
exports.format = formatDate;
|
|
142
|
+
/**
|
|
143
|
+
* Format date as ISO string (YYYY-MM-DD)
|
|
144
|
+
*/
|
|
145
|
+
function formatISO(date) {
|
|
146
|
+
return date.toISOString().split('T')[0];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get relative time string (e.g., "2 hours ago", "in 3 days")
|
|
150
|
+
*/
|
|
151
|
+
function formatRelative(date) {
|
|
152
|
+
const now = new Date();
|
|
153
|
+
const diffMs = date.getTime() - now.getTime();
|
|
154
|
+
const diffSeconds = Math.round(diffMs / 1000);
|
|
155
|
+
const diffMinutes = Math.round(diffSeconds / 60);
|
|
156
|
+
const diffHours = Math.round(diffMinutes / 60);
|
|
157
|
+
const diffDays = Math.round(diffHours / 24);
|
|
158
|
+
if (diffSeconds < 0) {
|
|
159
|
+
// Past
|
|
160
|
+
if (Math.abs(diffSeconds) < 60)
|
|
161
|
+
return 'just now';
|
|
162
|
+
if (Math.abs(diffMinutes) < 60)
|
|
163
|
+
return `${Math.abs(diffMinutes)} minute${Math.abs(diffMinutes) === 1 ? '' : 's'} ago`;
|
|
164
|
+
if (Math.abs(diffHours) < 24)
|
|
165
|
+
return `${Math.abs(diffHours)} hour${Math.abs(diffHours) === 1 ? '' : 's'} ago`;
|
|
166
|
+
if (Math.abs(diffDays) < 30)
|
|
167
|
+
return `${Math.abs(diffDays)} day${Math.abs(diffDays) === 1 ? '' : 's'} ago`;
|
|
168
|
+
return (0, exports.format)(date);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Future
|
|
172
|
+
if (diffSeconds < 60)
|
|
173
|
+
return 'just now';
|
|
174
|
+
if (diffMinutes < 60)
|
|
175
|
+
return `in ${diffMinutes} minute${diffMinutes === 1 ? '' : 's'}`;
|
|
176
|
+
if (diffHours < 24)
|
|
177
|
+
return `in ${diffHours} hour${diffHours === 1 ? '' : 's'}`;
|
|
178
|
+
if (diffDays < 30)
|
|
179
|
+
return `in ${diffDays} day${diffDays === 1 ? '' : 's'}`;
|
|
180
|
+
return (0, exports.format)(date);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check if date is today
|
|
185
|
+
*/
|
|
186
|
+
function isToday(date) {
|
|
187
|
+
return isSameDay(date, new Date());
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Check if date is tomorrow
|
|
191
|
+
*/
|
|
192
|
+
function isTomorrow(date) {
|
|
193
|
+
return isSameDay(date, tomorrow());
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Check if date is yesterday
|
|
197
|
+
*/
|
|
198
|
+
function isYesterday(date) {
|
|
199
|
+
return isSameDay(date, yesterday());
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Check if two dates are the same day
|
|
203
|
+
*/
|
|
204
|
+
function isSameDay(date1, date2) {
|
|
205
|
+
return (date1.getFullYear() === date2.getFullYear() &&
|
|
206
|
+
date1.getMonth() === date2.getMonth() &&
|
|
207
|
+
date1.getDate() === date2.getDate());
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get start of day (midnight)
|
|
211
|
+
*/
|
|
212
|
+
function startOfDay(date) {
|
|
213
|
+
const result = new Date(date);
|
|
214
|
+
result.setHours(0, 0, 0, 0);
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get end of day (23:59:59.999)
|
|
219
|
+
*/
|
|
220
|
+
function endOfDay(date) {
|
|
221
|
+
const result = new Date(date);
|
|
222
|
+
result.setHours(23, 59, 59, 999);
|
|
223
|
+
return result;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get start of month
|
|
227
|
+
*/
|
|
228
|
+
function startOfMonth(date) {
|
|
229
|
+
const result = new Date(date);
|
|
230
|
+
result.setDate(1);
|
|
231
|
+
return startOfDay(result);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get end of month
|
|
235
|
+
*/
|
|
236
|
+
function endOfMonth(date) {
|
|
237
|
+
const result = new Date(date.getFullYear(), date.getMonth() + 1, 0);
|
|
238
|
+
return endOfDay(result);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Get start of year
|
|
242
|
+
*/
|
|
243
|
+
function startOfYear(date) {
|
|
244
|
+
const result = new Date(date);
|
|
245
|
+
result.setMonth(0, 1);
|
|
246
|
+
return startOfDay(result);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get end of year
|
|
250
|
+
*/
|
|
251
|
+
function endOfYear(date) {
|
|
252
|
+
const result = new Date(date.getFullYear(), 11, 31);
|
|
253
|
+
return endOfDay(result);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Get number of days between two dates
|
|
257
|
+
*/
|
|
258
|
+
function daysBetween(date1, date2) {
|
|
259
|
+
const oneDay = 24 * 60 * 60 * 1000;
|
|
260
|
+
const firstDay = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate());
|
|
261
|
+
const secondDay = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());
|
|
262
|
+
return Math.round((secondDay.getTime() - firstDay.getTime()) / oneDay);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Check if value is a valid date
|
|
266
|
+
*/
|
|
267
|
+
function isValidDate(date) {
|
|
268
|
+
return date instanceof Date && !isNaN(date.getTime());
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Date utilities object for convenient access
|
|
272
|
+
*/
|
|
273
|
+
exports.dateUtils = {
|
|
274
|
+
now,
|
|
275
|
+
today,
|
|
276
|
+
tomorrow,
|
|
277
|
+
yesterday,
|
|
278
|
+
addDays,
|
|
279
|
+
subtractDays,
|
|
280
|
+
addMonths,
|
|
281
|
+
subtractMonths,
|
|
282
|
+
addYears,
|
|
283
|
+
subtractYears,
|
|
284
|
+
format: exports.format,
|
|
285
|
+
formatISO,
|
|
286
|
+
formatRelative,
|
|
287
|
+
isToday,
|
|
288
|
+
isTomorrow,
|
|
289
|
+
isYesterday,
|
|
290
|
+
isSameDay,
|
|
291
|
+
startOfDay,
|
|
292
|
+
endOfDay,
|
|
293
|
+
startOfMonth,
|
|
294
|
+
endOfMonth,
|
|
295
|
+
startOfYear,
|
|
296
|
+
endOfYear,
|
|
297
|
+
daysBetween,
|
|
298
|
+
isValidDate,
|
|
299
|
+
};
|
|
300
|
+
exports.default = exports.dateUtils;
|