import { AdditionalConstraintName, ConstraintName } from "../../util/exec/types.js";
import { Timestamp } from "../../util/timestamp.js";
import { ModuleApi } from "../../types/base.js";
import { ConstraintsFilter, CustomDatasourceConfig } from "../../config/types.js";

//#region lib/modules/datasource/types.d.ts
interface GetDigestInputConfig {
  datasource: string;
  packageName: string;
  defaultRegistryUrls?: string[];
  registryUrls?: string[] | null;
  registryUrl?: string;
  lookupName?: string;
  additionalRegistryUrls?: string[];
  currentValue?: string;
  currentDigest?: string;
  replacementName?: string;
}
interface DigestConfig {
  packageName: string;
  lookupName?: string;
  registryUrl?: string;
  currentValue?: string;
  currentDigest?: string;
}
interface GetReleasesConfig {
  customDatasources?: Record<string, CustomDatasourceConfig>;
  datasource?: string;
  packageName: string;
  registryUrl?: string;
  currentValue?: string;
  constraints?: Partial<Record<ConstraintName, string>>;
  /**
   * Any specific overrides for the versioning for the `AdditionalConstraintName`s.
   */
  constraintsVersioning?: Partial<Record<AdditionalConstraintName, string>>;
  constraintsFiltering?: ConstraintsFilter;
}
interface GetPkgReleasesConfig {
  customDatasources?: Record<string, CustomDatasourceConfig>;
  npmrc?: string;
  defaultRegistryUrls?: string[];
  registryUrls?: string[] | null;
  additionalRegistryUrls?: string[];
  datasource: string;
  packageName: string;
  currentValue?: string;
  versioning?: string;
  extractVersion?: string;
  versionCompatibility?: string;
  currentCompatibility?: string;
  constraints?: Partial<Record<ConstraintName, string>>;
  replacementName?: string;
  replacementVersion?: string;
  constraintsFiltering?: ConstraintsFilter;
  /**
   * Any specific overrides for the versioning for the `AdditionalConstraintName`s.
   */
  constraintsVersioning?: Partial<Record<AdditionalConstraintName, string>>;
  registryStrategy?: RegistryStrategy;
}
interface Release {
  changelogContent?: string;
  changelogUrl?: string;
  checksumUrl?: string;
  downloadUrl?: string;
  gitRef?: string;
  isDeprecated?: boolean;
  isStable?: boolean;
  releaseTimestamp?: Timestamp | null;
  version: string;
  /** The original value to which `extractVersion` was applied */
  versionOrig?: string;
  newDigest?: string | null;
  constraints?: Partial<Record<ConstraintName, string[]>>;
  dependencies?: Record<string, string>;
  devDependencies?: Record<string, string>;
  registryUrl?: string;
  sourceUrl?: string | undefined;
  sourceDirectory?: string;
  currentAge?: string;
  isLatest?: boolean;
  attestation?: boolean;
}
interface ReleaseTags {
  /** The latest release, according to the datasource **/
  latest?: string;
  [key: string]: string | undefined;
}
interface ReleaseResult {
  deprecationMessage?: string;
  isPrivate?: boolean;
  releases: Release[];
  tags?: ReleaseTags | undefined;
  changelogContent?: string;
  changelogUrl?: string;
  dependencyUrl?: string;
  homepage?: string | undefined;
  gitRef?: string;
  sourceUrl?: string | null;
  sourceDirectory?: string;
  registryUrl?: string;
  replacementName?: string;
  replacementVersion?: string;
  lookupName?: string;
  packageScope?: string;
  mostRecentTimestamp?: Timestamp;
  isAbandoned?: boolean;
  respectLatest?: boolean;
}
interface PostprocessReleaseConfig {
  packageName: string;
  registryUrl: string | null;
}
type PostprocessReleaseResult = Release | 'reject';
type RegistryStrategy =
/**
 * Only the first registry URL is queried.
 *
 * If multiple URLs are configured a warning is logged and the rest are ignored. Returns whatever the first registry returns, including `null`.
 */
'first'
/**
 * Registries are tried in order, returning the first non-null result.
 *
 * `null` results and non-fatal errors (HTTP 401/403/404 and generic errors) are skipped and the next registry is tried.
 * An `ExternalHostError` aborts immediately (unless the cause is `HOST_DISABLED`, which returns `null`).
 *
 * Returns `null` when all registries are exhausted without a result.
 *
 * The default when `registryStrategy` is `undefined`.
 */
| 'hunt'
/**
 * All registries are queried.
 *
 * Releases are merged and deduplicated by version; tags are merged with later registries' values taking precedence for duplicate keys.
 *
 * An `ExternalHostError` aborts immediately.
 *
 * Returns `null` when all registries fail.
 */
| 'merge';
type SourceUrlSupport = 'package' | 'release' | 'none';
interface DatasourceApi extends ModuleApi {
  id: string;
  getDigest?(config: DigestConfig, newValue?: string): Promise<string | null>;
  getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null>;
  defaultRegistryUrls?: string[] | (() => string[]);
  defaultVersioning?: string | undefined;
  defaultConfig?: Record<string, unknown> | undefined;
  /**
   * Strategy to use when multiple registryUrls are available to the datasource.
   *
   * @see RegistryStrategy
   */
  registryStrategy?: RegistryStrategy | undefined;
  /**
   * Whether custom registryUrls are allowed.
   */
  customRegistrySupport: boolean;
  /**
   * Whether release timestamp can be returned.
   */
  releaseTimestampSupport: boolean;
  /**
   * Notes on how release timestamp is determined.
   */
  releaseTimestampNote?: string;
  /**
   * Whether sourceURL can be returned.
   */
  sourceUrlSupport: SourceUrlSupport;
  /**
   * Notes on how sourceURL is determined.
   */
  sourceUrlNote?: string;
  /**
   * Whether to perform centralized caching in the datasource index/wrapper or not.
   *
   * - `true`: datasource index wrapper will cache all results (based on registryUrl/packageName)
   *   - **Must be set only if datasource is able to determine and return `isPrivate` flag**
   * - `false`: centralized caching is not performed, implementation still could do caching internally
   */
  caching?: boolean | undefined;
  /**
   * When the candidate for update is formed, this method could be called
   * to fetch additional information such as `releaseTimestamp`.
   *
   * Also, the release could be checked (and potentially rejected)
   * via some datasource-specific external call.
   *
   * In case of reject, the next candidate release is selected,
   * and `postprocessRelease` is called again.
   *
   * Rejection must happen only when the release will lead to downstream error,
   * e.g. the release turned out to be yanked or doesn't exist for some reason.
   *
   * In other cases, the original `Release` parameter should be returned.
   */
  postprocessRelease(config: PostprocessReleaseConfig, release: Release): Promise<PostprocessReleaseResult>;
}
//#endregion
export { DatasourceApi, DigestConfig, GetDigestInputConfig, GetPkgReleasesConfig, GetReleasesConfig, PostprocessReleaseConfig, PostprocessReleaseResult, RegistryStrategy, Release, ReleaseResult, ReleaseTags, SourceUrlSupport };
//# sourceMappingURL=types.d.ts.map