renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
78 lines (77 loc) • 3.81 kB
JavaScript
import { logger } from "../../../logger/index.js";
import { getQueryString, joinUrlParts, parseUrl } from "../../../util/url.js";
import { id } from "../../versioning/ruby/index.js";
import { withCache } from "../../../util/cache/package/with-cache.js";
import { RequestError } from "../../../util/http/got.js";
import { AsyncResult, Result } from "../../../util/result.js";
import { Http } from "../../../util/http/index.js";
import { Datasource } from "../datasource.js";
import { GemInfo, MarshalledVersionInfo } from "./schema.js";
import { getV1Releases } from "./common.js";
import { MetadataCache } from "./metadata-cache.js";
import { VersionsEndpointCache } from "./versions-endpoint-cache.js";
import { Marshal } from "@qnighy/marshal";
//#region lib/modules/datasource/rubygems/index.ts
function unlessServerSide(err, cb) {
if (err instanceof RequestError && err.response?.statusCode) {
const code = err.response.statusCode;
if (code >= 500 && code <= 599) return AsyncResult.err(err);
}
return cb();
}
var RubygemsDatasource = class RubygemsDatasource extends Datasource {
static id = "rubygems";
metadataCache;
constructor() {
super(RubygemsDatasource.id);
this.http = new Http(RubygemsDatasource.id);
this.versionsEndpointCache = new VersionsEndpointCache(this.http);
this.metadataCache = new MetadataCache(this.http);
}
defaultRegistryUrls = ["https://rubygems.org"];
defaultVersioning = id;
registryStrategy = "hunt";
versionsEndpointCache;
releaseTimestampSupport = true;
releaseTimestampNote = "The release timestamp is determined from the `created_at` field in the results.";
sourceUrlSupport = "release";
sourceUrlNote = "The source URL is determined from the `source_code_uri` field in the results.";
async _getReleases({ packageName, registryUrl }) {
/* v8 ignore next 3 -- should never happen */
if (!registryUrl) return null;
const registryHostname = parseUrl(registryUrl)?.hostname;
let result;
if (registryHostname === "rubygems.org") result = Result.wrap(this.versionsEndpointCache.getVersions(registryUrl, packageName)).transform((versions) => this.metadataCache.getRelease(registryUrl, packageName, versions));
else if (registryHostname === "rubygems.pkg.github.com" || registryHostname === "gitlab.com") result = this.getReleasesViaDeprecatedAPI(registryUrl, packageName);
else result = getV1Releases(this.http, registryUrl, packageName).catch((err) => unlessServerSide(err, () => this.getReleasesViaInfoEndpoint(registryUrl, packageName))).catch((err) => unlessServerSide(err, () => this.getReleasesViaDeprecatedAPI(registryUrl, packageName)));
const { val, err } = await result.unwrap();
if (val) return val;
if (err instanceof Error) this.handleGenericErrors(err);
logger.debug({
packageName,
registryUrl
}, `Rubygems fetch error: ${err}`);
return null;
}
getReleases(config) {
const registryHostname = parseUrl(config.registryUrl)?.hostname;
return withCache({
namespace: `datasource-${RubygemsDatasource.id}`,
key: `releases:${config.registryUrl}:${config.packageName}`,
fallback: true,
cacheable: registryHostname === "rubygems.org"
}, () => this._getReleases(config));
}
getReleasesViaInfoEndpoint(registryUrl, packageName) {
const url = joinUrlParts(registryUrl, "/info", packageName);
return Result.wrap(this.http.getText(url)).transform(({ body }) => body).parse(GemInfo);
}
getReleasesViaDeprecatedAPI(registryUrl, packageName) {
const url = `${joinUrlParts(registryUrl, `/api/v1/dependencies`)}?${getQueryString({ gems: packageName })}`;
const bufPromise = this.http.getBuffer(url);
return Result.wrap(bufPromise).transform(({ body }) => MarshalledVersionInfo.safeParse(Marshal.parse(body)));
}
};
//#endregion
export { RubygemsDatasource };
//# sourceMappingURL=index.js.map