import type { EntityMetadata, EntityName } from '../typings.js';
import { type MetadataDiscoveryOptions } from '../utils/Configuration.js';
import type { MetadataStorage } from './MetadataStorage.js';
/**
 * @internal
 */
export declare class MetadataValidator {
  validateEntityDefinition<T>(metadata: MetadataStorage, name: EntityName<T>, options: MetadataDiscoveryOptions): void;
  validateDiscovered(discovered: EntityMetadata[], options: MetadataDiscoveryOptions): void;
  private validateReference;
  private validateTargetKey;
  /**
   * Checks if a property has a unique constraint (either via `unique: true` or single-property `@Unique` decorator).
   * Composite unique constraints are not sufficient for targetKey.
   */
  private isPropertyUnique;
  private validatePolymorphicTargets;
  private validateBidirectional;
  private validateOwningSide;
  private validateInverseSide;
  private validateIndexes;
  private validateDuplicateFieldNames;
  private validateVersionField;
  /**
   * Validates that entity properties do not use dangerous names that could lead to
   * prototype pollution vulnerabilities. This validation ensures that property names
   * cannot be exploited to modify object prototypes when values are assigned during
   * entity hydration or persistence operations.
   *
   * @internal
   */
  private validatePropertyNames;
  /**
   * Validates view entity configuration.
   * View entities must have an expression.
   */
  private validateViewEntity;
  /**
   * Validates that STI and TPT are not mixed in the same inheritance hierarchy.
   * An entity hierarchy can use either STI (discriminatorColumn) or TPT (inheritance: 'tpt'),
   * but not both.
   *
   * Note: This validation runs before `initTablePerTypeInheritance` sets `inheritanceType`,
   * so we check the raw `inheritance` option from the decorator/schema.
   */
  private validateInheritanceStrategies;
}
