/** Controls when the `EntityManager` flushes pending changes to the database. */
export var FlushMode;
(function (FlushMode) {
  /** The `EntityManager` delays the flush until the current Transaction is committed. */
  FlushMode['COMMIT'] = 'commit';
  /** This is the default mode, and it flushes the `EntityManager` only if necessary. */
  FlushMode['AUTO'] = 'auto';
  /** Flushes the `EntityManager` before every query. */
  FlushMode['ALWAYS'] = 'always';
})(FlushMode || (FlushMode = {}));
/** Controls how populate hints are resolved when using `FindOptions.populateWhere`. */
export var PopulateHint;
(function (PopulateHint) {
  /** Infer population hints from the `where` condition. */
  PopulateHint['INFER'] = 'infer';
  /** Apply population hints to all relations. */
  PopulateHint['ALL'] = 'all';
})(PopulateHint || (PopulateHint = {}));
/** Special tokens used as populate path values in `FindOptions.populate`. */
export var PopulatePath;
(function (PopulatePath) {
  /** Infer which relations to populate based on fields accessed in the `where` or `orderBy` clause. */
  PopulatePath['INFER'] = '$infer';
  /** Populate all relations. */
  PopulatePath['ALL'] = '*';
})(PopulatePath || (PopulatePath = {}));
/** Logical grouping operators for combining query conditions. */
export var GroupOperator;
(function (GroupOperator) {
  /** Logical AND — all conditions must match. */
  GroupOperator['$and'] = 'and';
  /** Logical OR — at least one condition must match. */
  GroupOperator['$or'] = 'or';
})(GroupOperator || (GroupOperator = {}));
/** Comparison and filtering operators used in query conditions. */
export var QueryOperator;
(function (QueryOperator) {
  /** Equal. */
  QueryOperator['$eq'] = '=';
  /** Included in the given list. */
  QueryOperator['$in'] = 'in';
  /** Not included in the given list. */
  QueryOperator['$nin'] = 'not in';
  /** Greater than. */
  QueryOperator['$gt'] = '>';
  /** Greater than or equal to. */
  QueryOperator['$gte'] = '>=';
  /** Less than. */
  QueryOperator['$lt'] = '<';
  /** Less than or equal to. */
  QueryOperator['$lte'] = '<=';
  /** Not equal. */
  QueryOperator['$ne'] = '!=';
  /** Negation wrapper. */
  QueryOperator['$not'] = 'not';
  /** SQL LIKE pattern matching. */
  QueryOperator['$like'] = 'like';
  /** Regular expression matching. */
  QueryOperator['$re'] = 'regexp';
  /** Full-text search. */
  QueryOperator['$fulltext'] = 'fulltext';
  /** Checks that the value is not null (i.e., exists). */
  QueryOperator['$exists'] = 'not null';
  /** Case-insensitive LIKE (PostgreSQL only). */
  QueryOperator['$ilike'] = 'ilike';
  /** Array overlap operator (PostgreSQL only). */
  QueryOperator['$overlap'] = '&&';
  /** Array/JSON contains operator (PostgreSQL only). */
  QueryOperator['$contains'] = '@>';
  /** Array/JSON contained-by operator (PostgreSQL only). */
  QueryOperator['$contained'] = '<@';
  /** No element in the collection matches (SQL only). */
  QueryOperator['$none'] = 'none';
  /** At least one element in the collection matches (SQL only). */
  QueryOperator['$some'] = 'some';
  /** Every element in the collection matches (SQL only). */
  QueryOperator['$every'] = 'every';
  /** Matches collections by their size (SQL only). */
  QueryOperator['$size'] = 'size';
  /** JSON object has the given key (PostgreSQL only). */
  QueryOperator['$hasKey'] = '?';
  /** JSON object has all of the given keys (PostgreSQL only). */
  QueryOperator['$hasKeys'] = '?&';
  /** JSON object has at least one of the given keys (PostgreSQL only). */
  QueryOperator['$hasSomeKeys'] = '?|';
  /** Matches an element inside a JSON array (SQL only). */
  QueryOperator['$elemMatch'] = 'elemMatch';
})(QueryOperator || (QueryOperator = {}));
export const ARRAY_OPERATORS = ['$eq', '$gt', '$gte', '$lt', '$lte', '$ne', '$overlap', '$contains', '$contained'];
export const JSON_KEY_OPERATORS = ['$hasKey', '$hasKeys', '$hasSomeKeys'];
/** Sort direction for query results. Both upper- and lower-case variants are accepted. */
export var QueryOrder;
(function (QueryOrder) {
  /** Ascending order. */
  QueryOrder['ASC'] = 'ASC';
  /** Ascending order with nulls sorted last. */
  QueryOrder['ASC_NULLS_LAST'] = 'ASC NULLS LAST';
  /** Ascending order with nulls sorted first. */
  QueryOrder['ASC_NULLS_FIRST'] = 'ASC NULLS FIRST';
  /** Descending order. */
  QueryOrder['DESC'] = 'DESC';
  /** Descending order with nulls sorted last. */
  QueryOrder['DESC_NULLS_LAST'] = 'DESC NULLS LAST';
  /** Descending order with nulls sorted first. */
  QueryOrder['DESC_NULLS_FIRST'] = 'DESC NULLS FIRST';
  /** Ascending order (lower-case variant). */
  QueryOrder['asc'] = 'asc';
  /** Ascending order with nulls sorted last (lower-case variant). */
  QueryOrder['asc_nulls_last'] = 'asc nulls last';
  /** Ascending order with nulls sorted first (lower-case variant). */
  QueryOrder['asc_nulls_first'] = 'asc nulls first';
  /** Descending order (lower-case variant). */
  QueryOrder['desc'] = 'desc';
  /** Descending order with nulls sorted last (lower-case variant). */
  QueryOrder['desc_nulls_last'] = 'desc nulls last';
  /** Descending order with nulls sorted first (lower-case variant). */
  QueryOrder['desc_nulls_first'] = 'desc nulls first';
})(QueryOrder || (QueryOrder = {}));
/** Numeric sort direction, compatible with MongoDB-style ordering. */
export var QueryOrderNumeric;
(function (QueryOrderNumeric) {
  /** Ascending order. */
  QueryOrderNumeric[(QueryOrderNumeric['ASC'] = 1)] = 'ASC';
  /** Descending order. */
  QueryOrderNumeric[(QueryOrderNumeric['DESC'] = -1)] = 'DESC';
})(QueryOrderNumeric || (QueryOrderNumeric = {}));
/** Flags that modify query builder behavior. */
export var QueryFlag;
(function (QueryFlag) {
  /** Add a DISTINCT clause to the SELECT statement. */
  QueryFlag['DISTINCT'] = 'DISTINCT';
  /** Enable result pagination via a sub-query for the primary keys. */
  QueryFlag['PAGINATE'] = 'PAGINATE';
  /** Disable the automatic pagination sub-query. */
  QueryFlag['DISABLE_PAGINATE'] = 'DISABLE_PAGINATE';
  /** Wrap UPDATE statements in a sub-query. */
  QueryFlag['UPDATE_SUB_QUERY'] = 'UPDATE_SUB_QUERY';
  /** Wrap DELETE statements in a sub-query. */
  QueryFlag['DELETE_SUB_QUERY'] = 'DELETE_SUB_QUERY';
  /** Convert values through custom type mappings when reading results. */
  QueryFlag['CONVERT_CUSTOM_TYPES'] = 'CONVERT_CUSTOM_TYPES';
  /** Include lazy formula properties in the SELECT clause. */
  QueryFlag['INCLUDE_LAZY_FORMULAS'] = 'INCLUDE_LAZY_FORMULAS';
  /** Automatically join the owning side of one-to-one relations. */
  QueryFlag['AUTO_JOIN_ONE_TO_ONE_OWNER'] = 'AUTO_JOIN_ONE_TO_ONE_OWNER';
  /** Infer the populate hint from the query fields. */
  QueryFlag['INFER_POPULATE'] = 'INFER_POPULATE';
  /** Prevent nested conditions from being promoted to INNER JOINs. */
  QueryFlag['DISABLE_NESTED_INNER_JOIN'] = 'DISABLE_NESTED_INNER_JOIN';
  /** Enable IDENTITY_INSERT for explicit PK values (MSSQL only). */
  QueryFlag['IDENTITY_INSERT'] = 'IDENTITY_INSERT';
  /** Use an OUTPUT...INTO temp table for returning rows (MSSQL only). */
  QueryFlag['OUTPUT_TABLE'] = 'OUTPUT_TABLE';
})(QueryFlag || (QueryFlag = {}));
export const SCALAR_TYPES = new Set([
  'string',
  'number',
  'boolean',
  'bigint',
  'Uint8Array',
  'Date',
  'Buffer',
  'RegExp',
]);
/** Describes the kind of relationship a property represents. */
export var ReferenceKind;
(function (ReferenceKind) {
  /** A plain scalar property (not a relation). */
  ReferenceKind['SCALAR'] = 'scalar';
  /** A one-to-one relation. */
  ReferenceKind['ONE_TO_ONE'] = '1:1';
  /** A one-to-many relation (inverse side of a many-to-one). */
  ReferenceKind['ONE_TO_MANY'] = '1:m';
  /** A many-to-one relation (owning side). */
  ReferenceKind['MANY_TO_ONE'] = 'm:1';
  /** A many-to-many relation. */
  ReferenceKind['MANY_TO_MANY'] = 'm:n';
  /** An embedded entity (inline object stored within the parent). */
  ReferenceKind['EMBEDDED'] = 'embedded';
})(ReferenceKind || (ReferenceKind = {}));
/** Cascade operations that propagate from a parent entity to its relations. */
export var Cascade;
(function (Cascade) {
  /** Cascade persist — new related entities are automatically persisted. */
  Cascade['PERSIST'] = 'persist';
  /** Cascade merge — detached related entities are merged into the identity map. */
  Cascade['MERGE'] = 'merge';
  /** Cascade remove — removing the parent also removes related entities. */
  Cascade['REMOVE'] = 'remove';
  /** Enable all cascade operations (persist, merge, remove). */
  Cascade['ALL'] = 'all';
  /** @internal */
  Cascade['SCHEDULE_ORPHAN_REMOVAL'] = 'schedule_orphan_removal';
  /** @internal */
  Cascade['CANCEL_ORPHAN_REMOVAL'] = 'cancel_orphan_removal';
})(Cascade || (Cascade = {}));
/** Strategy used to load related entities when populating. */
export var LoadStrategy;
(function (LoadStrategy) {
  /** Load relations with a separate SELECT ... WHERE pk IN (...) query. */
  LoadStrategy['SELECT_IN'] = 'select-in';
  /** Load relations via SQL JOINs in a single query. */
  LoadStrategy['JOINED'] = 'joined';
  /** Use joined strategy for to-one relations and select-in for to-many. */
  LoadStrategy['BALANCED'] = 'balanced';
})(LoadStrategy || (LoadStrategy = {}));
/** Controls which relation types use the dataloader for batched loading. */
export var DataloaderType;
(function (DataloaderType) {
  /** Dataloader is disabled. */
  DataloaderType[(DataloaderType['NONE'] = 0)] = 'NONE';
  /** Use the dataloader for Reference (to-one) relations only. */
  DataloaderType[(DataloaderType['REFERENCE'] = 1)] = 'REFERENCE';
  /** Use the dataloader for Collection (to-many) relations only. */
  DataloaderType[(DataloaderType['COLLECTION'] = 2)] = 'COLLECTION';
  /** Use the dataloader for both Reference and Collection relations. */
  DataloaderType[(DataloaderType['ALL'] = 3)] = 'ALL';
})(DataloaderType || (DataloaderType = {}));
/** Locking strategy for concurrency control. */
export var LockMode;
(function (LockMode) {
  /** No locking. */
  LockMode[(LockMode['NONE'] = 0)] = 'NONE';
  /** Optimistic locking via a version column. */
  LockMode[(LockMode['OPTIMISTIC'] = 1)] = 'OPTIMISTIC';
  /** Pessimistic shared lock (FOR SHARE). */
  LockMode[(LockMode['PESSIMISTIC_READ'] = 2)] = 'PESSIMISTIC_READ';
  /** Pessimistic exclusive lock (FOR UPDATE). */
  LockMode[(LockMode['PESSIMISTIC_WRITE'] = 3)] = 'PESSIMISTIC_WRITE';
  /** Pessimistic exclusive lock that skips already-locked rows (FOR UPDATE SKIP LOCKED). */
  LockMode[(LockMode['PESSIMISTIC_PARTIAL_WRITE'] = 4)] = 'PESSIMISTIC_PARTIAL_WRITE';
  /** Pessimistic exclusive lock that fails immediately if the row is locked (FOR UPDATE NOWAIT). */
  LockMode[(LockMode['PESSIMISTIC_WRITE_OR_FAIL'] = 5)] = 'PESSIMISTIC_WRITE_OR_FAIL';
  /** Pessimistic shared lock that skips already-locked rows (FOR SHARE SKIP LOCKED). */
  LockMode[(LockMode['PESSIMISTIC_PARTIAL_READ'] = 6)] = 'PESSIMISTIC_PARTIAL_READ';
  /** Pessimistic shared lock that fails immediately if the row is locked (FOR SHARE NOWAIT). */
  LockMode[(LockMode['PESSIMISTIC_READ_OR_FAIL'] = 7)] = 'PESSIMISTIC_READ_OR_FAIL';
})(LockMode || (LockMode = {}));
/** Transaction isolation levels as defined by the SQL standard (plus vendor extensions). */
export var IsolationLevel;
(function (IsolationLevel) {
  /** Allows dirty reads, non-repeatable reads, and phantom reads. */
  IsolationLevel['READ_UNCOMMITTED'] = 'read uncommitted';
  /** Prevents dirty reads; non-repeatable and phantom reads are still possible. */
  IsolationLevel['READ_COMMITTED'] = 'read committed';
  /** Snapshot isolation — each transaction sees a consistent snapshot of the database (MSSQL). */
  IsolationLevel['SNAPSHOT'] = 'snapshot';
  /** Prevents dirty and non-repeatable reads; phantom reads are still possible. */
  IsolationLevel['REPEATABLE_READ'] = 'repeatable read';
  /** Full isolation — transactions are executed as if they were run sequentially. */
  IsolationLevel['SERIALIZABLE'] = 'serializable';
})(IsolationLevel || (IsolationLevel = {}));
/** Lifecycle and transaction events emitted by the ORM. */
export var EventType;
(function (EventType) {
  /** Fired when an entity instance is created (via constructor or `em.create`). */
  EventType['onInit'] = 'onInit';
  /** Fired after an entity is loaded from the database. */
  EventType['onLoad'] = 'onLoad';
  /** Fired before a new entity is inserted into the database. */
  EventType['beforeCreate'] = 'beforeCreate';
  /** Fired after a new entity has been inserted into the database. */
  EventType['afterCreate'] = 'afterCreate';
  /** Fired before an existing entity is updated in the database. */
  EventType['beforeUpdate'] = 'beforeUpdate';
  /** Fired after an existing entity has been updated in the database. */
  EventType['afterUpdate'] = 'afterUpdate';
  /** Fired before an upsert operation. */
  EventType['beforeUpsert'] = 'beforeUpsert';
  /** Fired after an upsert operation. */
  EventType['afterUpsert'] = 'afterUpsert';
  /** Fired before an entity is deleted from the database. */
  EventType['beforeDelete'] = 'beforeDelete';
  /** Fired after an entity has been deleted from the database. */
  EventType['afterDelete'] = 'afterDelete';
  /** Fired at the very beginning of `em.flush()`, before change detection. */
  EventType['beforeFlush'] = 'beforeFlush';
  /** Fired during `em.flush()` after change detection but before database writes. */
  EventType['onFlush'] = 'onFlush';
  /** Fired after `em.flush()` has completed all database writes. */
  EventType['afterFlush'] = 'afterFlush';
  /** Fired before a new database transaction is started. */
  EventType['beforeTransactionStart'] = 'beforeTransactionStart';
  /** Fired after a new database transaction has been started. */
  EventType['afterTransactionStart'] = 'afterTransactionStart';
  /** Fired before a database transaction is committed. */
  EventType['beforeTransactionCommit'] = 'beforeTransactionCommit';
  /** Fired after a database transaction has been committed. */
  EventType['afterTransactionCommit'] = 'afterTransactionCommit';
  /** Fired before a database transaction is rolled back. */
  EventType['beforeTransactionRollback'] = 'beforeTransactionRollback';
  /** Fired after a database transaction has been rolled back. */
  EventType['afterTransactionRollback'] = 'afterTransactionRollback';
})(EventType || (EventType = {}));
export const EventTypeMap = Object.keys(EventType).reduce((a, b, i) => {
  a[b] = i;
  return a;
}, {});
/** Controls how a transactional operation interacts with an existing transaction. */
export var TransactionPropagation;
(function (TransactionPropagation) {
  /** Join the current transaction or create a new one if none exists. */
  TransactionPropagation['REQUIRED'] = 'required';
  /** Always create a new transaction, suspending the current one if it exists. */
  TransactionPropagation['REQUIRES_NEW'] = 'requires_new';
  /** Create a nested savepoint within the current transaction, or a new transaction if none exists. */
  TransactionPropagation['NESTED'] = 'nested';
  /** Execute non-transactionally, suspending the current transaction if one exists. */
  TransactionPropagation['NOT_SUPPORTED'] = 'not_supported';
  /** Join the current transaction if one exists, otherwise execute non-transactionally. */
  TransactionPropagation['SUPPORTS'] = 'supports';
  /** Join the current transaction; throw if no transaction is active. */
  TransactionPropagation['MANDATORY'] = 'mandatory';
  /** Execute non-transactionally; throw if a transaction is active. */
  TransactionPropagation['NEVER'] = 'never';
})(TransactionPropagation || (TransactionPropagation = {}));
export class PlainObject {}
/** Constraint deferral mode for database constraints (e.g., foreign keys, unique). */
export var DeferMode;
(function (DeferMode) {
  /** The constraint is checked immediately by default, but can be deferred within a transaction. */
  DeferMode['INITIALLY_IMMEDIATE'] = 'immediate';
  /** The constraint is deferred until the transaction is committed. */
  DeferMode['INITIALLY_DEFERRED'] = 'deferred';
})(DeferMode || (DeferMode = {}));
