import { ExternalHostError } from '../../types/errors/external-host-error.ts'; import { Http, HttpError } from '../../util/http/index.ts'; import type { DatasourceApi, DigestConfig, GetReleasesConfig, PostprocessReleaseConfig, PostprocessReleaseResult, RegistryStrategy, Release, ReleaseResult, SourceUrlSupport, } from './types.ts'; export abstract class Datasource implements DatasourceApi { public readonly id: string; protected constructor(id: string) { this.id = id; this.http = new Http(id); } caching: boolean | undefined; customRegistrySupport = true; defaultConfig: Record | undefined; defaultRegistryUrls?: string[] | (() => string[]); defaultVersioning?: string | undefined; registryStrategy: RegistryStrategy | undefined = 'first'; releaseTimestampSupport = false; releaseTimestampNote?: string | undefined; sourceUrlSupport: SourceUrlSupport = 'none'; sourceUrlNote?: string | undefined; protected http: Http; abstract getReleases( getReleasesConfig: GetReleasesConfig, ): Promise; getDigest?(config: DigestConfig, newValue?: string): Promise; handleHttpErrors(_err: HttpError): void { // intentionally empty } protected handleGenericErrors(err: Error): never { if (err instanceof ExternalHostError) { throw err; } if (err instanceof HttpError) { this.handleHttpErrors(err); const statusCode = err.response?.statusCode; if ( statusCode && (statusCode === 429 || (statusCode >= 500 && statusCode < 600)) ) { throw new ExternalHostError(err); } } throw err; } // istanbul ignore next: no-op implementation, never called postprocessRelease( _config: PostprocessReleaseConfig, release: Release, ): Promise { return Promise.resolve(release); } }