renovate 43.210.1 → 43.210.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,6 +2,7 @@ import { logger } from "../../../logger/index.js";
2
2
  import { PRESET_DEP_NOT_FOUND, PRESET_NOT_FOUND, PRESET_RENOVATE_CONFIG_NOT_FOUND } from "../util.js";
3
3
  import { Http } from "../../../util/http/index.js";
4
4
  import { memCacheProvider } from "../../../util/http/cache/memory-http-cache-provider.js";
5
+ import { NpmResponse } from "../../../modules/datasource/npm/schema.js";
5
6
  import { resolvePackageUrl, resolveRegistryUrl } from "../../../modules/datasource/npm/npmrc.js";
6
7
  //#region lib/config/presets/npm/index.ts
7
8
  const http = new Http("npm");
@@ -14,7 +15,7 @@ async function getPreset({ repo: pkg, presetName = "default" }) {
14
15
  pkg
15
16
  }, "Using npm packages for Renovate presets is now deprecated. Please migrate to repository-based presets instead.");
16
17
  const packageUrl = resolvePackageUrl(registryUrl, pkg);
17
- const body = (await http.getJsonUnchecked(packageUrl, { cacheProvider: memCacheProvider })).body;
18
+ const body = (await http.getJson(packageUrl, { cacheProvider: memCacheProvider }, NpmResponse)).body;
18
19
  dep = body.versions[body["dist-tags"].latest];
19
20
  } catch {
20
21
  throw new Error(PRESET_DEP_NOT_FOUND);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/config/presets/npm/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport {\n resolvePackageUrl,\n resolveRegistryUrl,\n} from '../../../modules/datasource/npm/npmrc.ts';\nimport type {\n NpmResponse,\n NpmResponseVersion,\n} from '../../../modules/datasource/npm/types.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport type { Preset, PresetConfig } from '../types.ts';\nimport {\n PRESET_DEP_NOT_FOUND,\n PRESET_NOT_FOUND,\n PRESET_RENOVATE_CONFIG_NOT_FOUND,\n} from '../util.ts';\n\nconst id = 'npm';\n\nconst http = new Http(id);\n\nexport async function getPreset({\n repo: pkg,\n presetName = 'default',\n}: PresetConfig): Promise<Preset | undefined> {\n let dep: (NpmResponseVersion & { 'renovate-config'?: any }) | undefined;\n try {\n const registryUrl = resolveRegistryUrl(pkg);\n logger.once.warn(\n { registryUrl, pkg },\n 'Using npm packages for Renovate presets is now deprecated. Please migrate to repository-based presets instead.',\n );\n const packageUrl = resolvePackageUrl(registryUrl, pkg);\n const body = (\n await http.getJsonUnchecked<NpmResponse>(packageUrl, {\n cacheProvider: memCacheProvider,\n })\n ).body;\n // TODO: check null #22198\n dep = body.versions![body['dist-tags']!.latest];\n } catch {\n throw new Error(PRESET_DEP_NOT_FOUND);\n }\n if (!dep?.['renovate-config']) {\n throw new Error(PRESET_RENOVATE_CONFIG_NOT_FOUND);\n }\n const presetConfig = dep['renovate-config'][presetName];\n if (!presetConfig) {\n const presetNames = Object.keys(dep['renovate-config']);\n logger.debug(\n { presetNames, presetName },\n 'Preset not found within renovate-config',\n );\n throw new Error(PRESET_NOT_FOUND);\n }\n return presetConfig;\n}\n"],"mappings":";;;;;;AAoBA,MAAM,OAAO,IAAI,KAAK,KAAE;AAExB,eAAsB,UAAU,EAC9B,MAAM,KACN,aAAa,aAC+B;CAC5C,IAAI;CACJ,IAAI;EACF,MAAM,cAAc,mBAAmB,GAAG;EAC1C,OAAO,KAAK,KACV;GAAE;GAAa;EAAI,GACnB,gHACF;EACA,MAAM,aAAa,kBAAkB,aAAa,GAAG;EACrD,MAAM,QACJ,MAAM,KAAK,iBAA8B,YAAY,EACnD,eAAe,iBACjB,CAAC,GACD;EAEF,MAAM,KAAK,SAAU,KAAK,aAAc;CAC1C,QAAQ;EACN,MAAM,IAAI,MAAM,oBAAoB;CACtC;CACA,IAAI,CAAC,MAAM,oBACT,MAAM,IAAI,MAAM,gCAAgC;CAElD,MAAM,eAAe,IAAI,mBAAmB;CAC5C,IAAI,CAAC,cAAc;EACjB,MAAM,cAAc,OAAO,KAAK,IAAI,kBAAkB;EACtD,OAAO,MACL;GAAE;GAAa;EAAW,GAC1B,yCACF;EACA,MAAM,IAAI,MAAM,gBAAgB;CAClC;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/config/presets/npm/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport {\n resolvePackageUrl,\n resolveRegistryUrl,\n} from '../../../modules/datasource/npm/npmrc.ts';\nimport type { NpmResponseVersion } from '../../../modules/datasource/npm/schema.ts';\nimport { NpmResponse } from '../../../modules/datasource/npm/schema.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport type { Preset, PresetConfig } from '../types.ts';\nimport {\n PRESET_DEP_NOT_FOUND,\n PRESET_NOT_FOUND,\n PRESET_RENOVATE_CONFIG_NOT_FOUND,\n} from '../util.ts';\n\nconst id = 'npm';\n\nconst http = new Http(id);\n\nexport async function getPreset({\n repo: pkg,\n presetName = 'default',\n}: PresetConfig): Promise<Preset | undefined> {\n let dep: (NpmResponseVersion & { 'renovate-config'?: any }) | undefined;\n try {\n const registryUrl = resolveRegistryUrl(pkg);\n logger.once.warn(\n { registryUrl, pkg },\n 'Using npm packages for Renovate presets is now deprecated. Please migrate to repository-based presets instead.',\n );\n const packageUrl = resolvePackageUrl(registryUrl, pkg);\n const body = (\n await http.getJson(\n packageUrl,\n { cacheProvider: memCacheProvider },\n NpmResponse,\n )\n ).body;\n // TODO: check null #22198\n dep = body.versions![body['dist-tags']!.latest];\n } catch {\n throw new Error(PRESET_DEP_NOT_FOUND);\n }\n if (!dep?.['renovate-config']) {\n throw new Error(PRESET_RENOVATE_CONFIG_NOT_FOUND);\n }\n const presetConfig = dep['renovate-config'][presetName];\n if (!presetConfig) {\n const presetNames = Object.keys(dep['renovate-config']);\n logger.debug(\n { presetNames, presetName },\n 'Preset not found within renovate-config',\n );\n throw new Error(PRESET_NOT_FOUND);\n }\n return presetConfig;\n}\n"],"mappings":";;;;;;;AAkBA,MAAM,OAAO,IAAI,KAAK,KAAE;AAExB,eAAsB,UAAU,EAC9B,MAAM,KACN,aAAa,aAC+B;CAC5C,IAAI;CACJ,IAAI;EACF,MAAM,cAAc,mBAAmB,GAAG;EAC1C,OAAO,KAAK,KACV;GAAE;GAAa;EAAI,GACnB,gHACF;EACA,MAAM,aAAa,kBAAkB,aAAa,GAAG;EACrD,MAAM,QACJ,MAAM,KAAK,QACT,YACA,EAAE,eAAe,iBAAiB,GAClC,WACF,GACA;EAEF,MAAM,KAAK,SAAU,KAAK,aAAc;CAC1C,QAAQ;EACN,MAAM,IAAI,MAAM,oBAAoB;CACtC;CACA,IAAI,CAAC,MAAM,oBACT,MAAM,IAAI,MAAM,gCAAgC;CAElD,MAAM,eAAe,IAAI,mBAAmB;CAC5C,IAAI,CAAC,cAAc;EACjB,MAAM,cAAc,OAAO,KAAK,IAAI,kBAAkB;EACtD,OAAO,MACL;GAAE;GAAa;EAAW,GAC1B,yCACF;EACA,MAAM,IAAI,MAAM,gBAAgB;CAClC;CACA,OAAO;AACT"}
@@ -15,6 +15,7 @@ import { BaseGoDatasource } from "./base.js";
15
15
  import { parseGoproxy, parseNoproxy } from "./goproxy-parser.js";
16
16
  import { getSourceUrl } from "./common.js";
17
17
  import { GoDirectDatasource } from "./releases-direct.js";
18
+ import { VersionInfo } from "./schema.js";
18
19
  import { isNonEmptyStringAndNotWhitespace, isTruthy } from "@sindresorhus/is";
19
20
  //#region lib/modules/datasource/go/releases-goproxy.ts
20
21
  /** TODO #42566 */
@@ -108,7 +109,7 @@ var GoProxyDatasource = class GoProxyDatasource extends Datasource {
108
109
  }
109
110
  async versionInfo(baseUrl, packageName, version) {
110
111
  const url = joinUrlParts(baseUrl, this.encodeCase(packageName), "@v", `${version}.info`);
111
- const res = await this.http.getJsonUnchecked(url);
112
+ const res = await this.http.getJson(url, VersionInfo);
112
113
  const result = { version: res.body.Version };
113
114
  const releaseTimestamp = asTimestamp(res.body.Time);
114
115
  if (releaseTimestamp) result.releaseTimestamp = releaseTimestamp;
@@ -146,7 +147,7 @@ var GoProxyDatasource = class GoProxyDatasource extends Datasource {
146
147
  async getLatestVersion(baseUrl, packageName) {
147
148
  try {
148
149
  const url = joinUrlParts(baseUrl, this.encodeCase(packageName), "@latest");
149
- return (await this.http.getJsonUnchecked(url)).body.Version;
150
+ return (await this.http.getJson(url, VersionInfo)).body.Version;
150
151
  } catch (err) {
151
152
  logger.trace({ err }, "Failed to get latest version");
152
153
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"releases-goproxy.js","names":["p.map","HttpError","goVersioning"],"sources":["../../../../lib/modules/datasource/go/releases-goproxy.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace, isTruthy } from '@sindresorhus/is';\nimport type { ConstraintsFilter } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport goVersioning from '../../versioning/go-mod-directive/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BaseGoDatasource } from './base.ts';\nimport { getSourceUrl } from './common.ts';\nimport { parseGoproxy, parseNoproxy } from './goproxy-parser.ts';\nimport { GoDirectDatasource } from './releases-direct.ts';\nimport type { VersionInfo } from './types.ts';\n\n/** TODO #42566 */\nconst goVersionRegex = regEx(/^\\s*go\\s+(?<version>[^\\s]+)\\s*$/);\n\nconst modRegex = regEx(/^(?<baseMod>.*?)(?:[./]v(?<majorVersion>\\d+))?$/);\n\n/**\n * @see https://go.dev/ref/mod#pseudo-versions\n */\nconst pseudoVersionRegex = regEx(\n /v\\d+\\.\\d+\\.\\d+-(?:\\w+\\.)?(?:0\\.)?(?<timestamp>\\d{14})-(?<digest>[a-f0-9]{12})/i,\n);\n\nexport function pseudoVersionToRelease(pseudoVersion: string): Release | null {\n const match = pseudoVersion.match(pseudoVersionRegex)?.groups;\n if (!match) {\n return null;\n }\n\n const { digest: newDigest, timestamp } = match;\n const releaseTimestamp = asTimestamp(timestamp);\n\n return {\n version: pseudoVersion,\n newDigest,\n releaseTimestamp,\n };\n}\n\nexport class GoProxyDatasource extends Datasource {\n static readonly id = 'go-proxy';\n\n constructor() {\n super(GoProxyDatasource.id);\n }\n\n readonly direct = new GoDirectDatasource();\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName } = config;\n logger.trace(`goproxy.getReleases(${packageName})`);\n const goproxy = getEnv().GOPROXY ?? 'https://proxy.golang.org,direct';\n if (goproxy === 'direct') {\n return this.direct.getReleases(config);\n }\n const proxyList = parseGoproxy(goproxy);\n const noproxy = parseNoproxy();\n\n let result: ReleaseResult | null = null;\n\n if (noproxy?.test(packageName)) {\n logger.debug(`Fetching ${packageName} via GONOPROXY match`);\n result = await this.direct.getReleases(config);\n return result;\n }\n\n for (const { url, fallback } of proxyList) {\n try {\n if (url === 'off') {\n break;\n } else if (url === 'direct') {\n result = await this.direct.getReleases(config);\n break;\n }\n\n const res = await this.getVersionsWithInfo(\n url,\n packageName,\n config.constraintsFiltering,\n );\n if (res.releases.length) {\n result = res;\n break;\n }\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const statusCode = potentialHttpError?.response?.statusCode;\n const canFallback =\n fallback === '|' ? true : statusCode === 404 || statusCode === 410;\n const msg = canFallback\n ? 'Goproxy error: trying next URL provided with GOPROXY'\n : 'Goproxy error: skipping other URLs provided with GOPROXY';\n logger.debug({ err }, msg);\n if (!canFallback) {\n break;\n }\n }\n }\n\n if (result && !result.sourceUrl) {\n try {\n const datasource = await BaseGoDatasource.getDatasource(packageName);\n const sourceUrl = getSourceUrl(datasource);\n if (sourceUrl) {\n result.sourceUrl = sourceUrl;\n }\n } catch (err) {\n logger.trace({ err }, `Can't get datasource for ${packageName}`);\n }\n }\n\n return result;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getCacheKey(config),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Avoid ambiguity when serving from case-insensitive file systems.\n *\n * @see https://golang.org/ref/mod#goproxy-protocol\n */\n encodeCase(input: string): string {\n return input.replace(regEx(/([A-Z])/g), (x) => `!${x.toLowerCase()}`);\n }\n\n async listVersions(baseUrl: string, packageName: string): Promise<Release[]> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n 'list',\n );\n const { body } = await this.http.getText(url);\n return filterMap(body.split(newlineRegex), (str) => {\n if (!isNonEmptyStringAndNotWhitespace(str)) {\n return null;\n }\n\n const [version, timestamp] = str.trim().split(regEx(/\\s+/));\n const release: Release = pseudoVersionToRelease(version) ?? { version };\n\n const releaseTimestamp = asTimestamp(timestamp);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n\n return release;\n });\n }\n\n async versionInfo(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<Release> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.info`,\n );\n const res = await this.http.getJsonUnchecked<VersionInfo>(url);\n\n const result: Release = {\n version: res.body.Version,\n };\n\n const releaseTimestamp = asTimestamp(res.body.Time);\n if (releaseTimestamp) {\n result.releaseTimestamp = releaseTimestamp;\n }\n\n return result;\n }\n\n /**\n * Retrieve the `go` directive for a given Go Module.\n *\n * NOTE that this means the `go` directive, not the `toolchain` directive.\n */\n async retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getVersionedCacheKey(packageName, version),\n // a module's `go.mod` should /never/ change after it's published. If going via the Go Proxy and the Go Checksum Database, a change in this value will result in build failures.\n ttlMinutes: 100 * 24 * 60,\n },\n () => this._retrieveGoDirectiveForModule(baseUrl, packageName, version),\n );\n }\n\n async _retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.mod`,\n );\n const res = await this.http.getText(url);\n\n let goDirective: string | undefined = undefined;\n\n for (const line of res.body.split('\\n')) {\n const goVersionMatches = goVersionRegex.exec(line)?.groups;\n if (goVersionMatches) {\n goDirective = goVersionMatches.version;\n break;\n }\n }\n\n if (!goDirective) {\n return goDirective;\n }\n\n // always return it in full SemVer format, which can then be matched on using `semver` or `semver-coerced`\n const parts = goDirective.split('.');\n if (parts.length === 1) {\n return `${parts[0]}.0.0`;\n } else if (parts.length === 2) {\n return `${parts[0]}.${parts[1]}.0`;\n } else {\n return `${parts[0]}.${parts[1]}.${parts[2]}`;\n }\n }\n\n async getLatestVersion(\n baseUrl: string,\n packageName: string,\n ): Promise<string | null> {\n try {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@latest',\n );\n const res = await this.http.getJsonUnchecked<VersionInfo>(url);\n return res.body.Version;\n } catch (err) {\n logger.trace({ err }, 'Failed to get latest version');\n return null;\n }\n }\n\n async getVersionsWithInfo(\n baseUrl: string,\n packageName: string,\n constraintsFiltering: ConstraintsFilter | undefined,\n ): Promise<ReleaseResult> {\n const isGopkgin = packageName.startsWith('gopkg.in/');\n const majorSuffixSeparator = isGopkgin ? '.' : '/';\n const modParts = packageName.match(modRegex)?.groups;\n const baseMod = modParts?.baseMod ?? /* v8 ignore next */ packageName;\n const packageMajor = parseInt(modParts?.majorVersion ?? '0', 10);\n\n const result: ReleaseResult = { releases: [] };\n for (let major = packageMajor; ; major += 1) {\n let pkg = `${baseMod}${majorSuffixSeparator}v${major}`;\n if (!isGopkgin && major < 2) {\n pkg = baseMod;\n major += 1; // v0 and v1 are the same module\n }\n\n let releases: Release[] = [];\n\n try {\n const res = await this.listVersions(baseUrl, pkg);\n\n // Artifactory returns all versions in any major (past and future),\n // so starting from v2, we filter them in order to avoid the infinite loop\n const filteredReleases = res.filter(({ version }) => {\n if (major < 2) {\n return true;\n }\n\n return (\n version.split(regEx(/[^\\d]+/)).find(isTruthy) === major.toString()\n );\n });\n\n releases = await p.map(filteredReleases, async (versionInfo) => {\n const { version, newDigest, releaseTimestamp } = versionInfo;\n\n if (releaseTimestamp) {\n return { version, newDigest, releaseTimestamp };\n }\n\n try {\n return await this.versionInfo(baseUrl, pkg, version);\n } catch (err) {\n logger.trace({ err }, `Can't obtain data from ${baseUrl}`);\n return { version };\n }\n });\n\n if (constraintsFiltering === 'strict') {\n releases = await p.map(releases, async (rel) => {\n try {\n const goDirective = await this.retrieveGoDirectiveForModule(\n baseUrl,\n pkg,\n rel.version,\n );\n if (goDirective) {\n rel.constraints ??= {};\n rel.constraints['%goMod'] ??= [];\n rel.constraints['%goMod'].push(goDirective);\n }\n } catch (err) {\n logger.trace(\n { err },\n `Can't obtain \\`go\\` directive from ${baseUrl}`,\n );\n }\n\n return rel;\n });\n }\n\n result.releases.push(...releases);\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const status = potentialHttpError.response?.statusCode;\n if (\n potentialHttpError instanceof HttpError &&\n (status === 404 || status === 403) &&\n major !== packageMajor\n ) {\n break;\n }\n\n throw err;\n }\n\n const latestVersion = await this.getLatestVersion(baseUrl, pkg);\n if (latestVersion) {\n result.tags ??= {};\n result.tags.latest ??= latestVersion;\n if (goVersioning.isGreaterThan(latestVersion, result.tags.latest)) {\n result.tags.latest = latestVersion;\n }\n if (!result.releases.length) {\n const releaseFromLatest = pseudoVersionToRelease(latestVersion);\n if (releaseFromLatest) {\n result.releases.push(releaseFromLatest);\n }\n }\n }\n\n if (!releases.length) {\n break;\n }\n }\n\n return result;\n }\n\n static getCacheKey({\n packageName,\n constraintsFiltering,\n }: GetReleasesConfig): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n const constraintsFilteringKey =\n constraintsFiltering && constraintsFiltering !== 'none'\n ? `@@${constraintsFiltering}`\n : '';\n // TODO: types (#22198)\n return `${packageName}@@${goproxy}@@${noproxy?.toString()}${constraintsFilteringKey}`;\n }\n\n static getVersionedCacheKey(packageName: string, version: string): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n // TODO: types (#22198)\n return `${packageName}@@${version}@@${goproxy}@@${noproxy?.toString()}`;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"releases-goproxy.js","names":["p.map","HttpError","goVersioning"],"sources":["../../../../lib/modules/datasource/go/releases-goproxy.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace, isTruthy } from '@sindresorhus/is';\nimport type { ConstraintsFilter } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport goVersioning from '../../versioning/go-mod-directive/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BaseGoDatasource } from './base.ts';\nimport { getSourceUrl } from './common.ts';\nimport { parseGoproxy, parseNoproxy } from './goproxy-parser.ts';\nimport { GoDirectDatasource } from './releases-direct.ts';\nimport { VersionInfo } from './schema.ts';\n\n/** TODO #42566 */\nconst goVersionRegex = regEx(/^\\s*go\\s+(?<version>[^\\s]+)\\s*$/);\n\nconst modRegex = regEx(/^(?<baseMod>.*?)(?:[./]v(?<majorVersion>\\d+))?$/);\n\n/**\n * @see https://go.dev/ref/mod#pseudo-versions\n */\nconst pseudoVersionRegex = regEx(\n /v\\d+\\.\\d+\\.\\d+-(?:\\w+\\.)?(?:0\\.)?(?<timestamp>\\d{14})-(?<digest>[a-f0-9]{12})/i,\n);\n\nexport function pseudoVersionToRelease(pseudoVersion: string): Release | null {\n const match = pseudoVersion.match(pseudoVersionRegex)?.groups;\n if (!match) {\n return null;\n }\n\n const { digest: newDigest, timestamp } = match;\n const releaseTimestamp = asTimestamp(timestamp);\n\n return {\n version: pseudoVersion,\n newDigest,\n releaseTimestamp,\n };\n}\n\nexport class GoProxyDatasource extends Datasource {\n static readonly id = 'go-proxy';\n\n constructor() {\n super(GoProxyDatasource.id);\n }\n\n readonly direct = new GoDirectDatasource();\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName } = config;\n logger.trace(`goproxy.getReleases(${packageName})`);\n const goproxy = getEnv().GOPROXY ?? 'https://proxy.golang.org,direct';\n if (goproxy === 'direct') {\n return this.direct.getReleases(config);\n }\n const proxyList = parseGoproxy(goproxy);\n const noproxy = parseNoproxy();\n\n let result: ReleaseResult | null = null;\n\n if (noproxy?.test(packageName)) {\n logger.debug(`Fetching ${packageName} via GONOPROXY match`);\n result = await this.direct.getReleases(config);\n return result;\n }\n\n for (const { url, fallback } of proxyList) {\n try {\n if (url === 'off') {\n break;\n } else if (url === 'direct') {\n result = await this.direct.getReleases(config);\n break;\n }\n\n const res = await this.getVersionsWithInfo(\n url,\n packageName,\n config.constraintsFiltering,\n );\n if (res.releases.length) {\n result = res;\n break;\n }\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const statusCode = potentialHttpError?.response?.statusCode;\n const canFallback =\n fallback === '|' ? true : statusCode === 404 || statusCode === 410;\n const msg = canFallback\n ? 'Goproxy error: trying next URL provided with GOPROXY'\n : 'Goproxy error: skipping other URLs provided with GOPROXY';\n logger.debug({ err }, msg);\n if (!canFallback) {\n break;\n }\n }\n }\n\n if (result && !result.sourceUrl) {\n try {\n const datasource = await BaseGoDatasource.getDatasource(packageName);\n const sourceUrl = getSourceUrl(datasource);\n if (sourceUrl) {\n result.sourceUrl = sourceUrl;\n }\n } catch (err) {\n logger.trace({ err }, `Can't get datasource for ${packageName}`);\n }\n }\n\n return result;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getCacheKey(config),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Avoid ambiguity when serving from case-insensitive file systems.\n *\n * @see https://golang.org/ref/mod#goproxy-protocol\n */\n encodeCase(input: string): string {\n return input.replace(regEx(/([A-Z])/g), (x) => `!${x.toLowerCase()}`);\n }\n\n async listVersions(baseUrl: string, packageName: string): Promise<Release[]> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n 'list',\n );\n const { body } = await this.http.getText(url);\n return filterMap(body.split(newlineRegex), (str) => {\n if (!isNonEmptyStringAndNotWhitespace(str)) {\n return null;\n }\n\n const [version, timestamp] = str.trim().split(regEx(/\\s+/));\n const release: Release = pseudoVersionToRelease(version) ?? { version };\n\n const releaseTimestamp = asTimestamp(timestamp);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n\n return release;\n });\n }\n\n async versionInfo(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<Release> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.info`,\n );\n const res = await this.http.getJson(url, VersionInfo);\n\n const result: Release = {\n version: res.body.Version,\n };\n\n const releaseTimestamp = asTimestamp(res.body.Time);\n if (releaseTimestamp) {\n result.releaseTimestamp = releaseTimestamp;\n }\n\n return result;\n }\n\n /**\n * Retrieve the `go` directive for a given Go Module.\n *\n * NOTE that this means the `go` directive, not the `toolchain` directive.\n */\n async retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getVersionedCacheKey(packageName, version),\n // a module's `go.mod` should /never/ change after it's published. If going via the Go Proxy and the Go Checksum Database, a change in this value will result in build failures.\n ttlMinutes: 100 * 24 * 60,\n },\n () => this._retrieveGoDirectiveForModule(baseUrl, packageName, version),\n );\n }\n\n async _retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.mod`,\n );\n const res = await this.http.getText(url);\n\n let goDirective: string | undefined = undefined;\n\n for (const line of res.body.split('\\n')) {\n const goVersionMatches = goVersionRegex.exec(line)?.groups;\n if (goVersionMatches) {\n goDirective = goVersionMatches.version;\n break;\n }\n }\n\n if (!goDirective) {\n return goDirective;\n }\n\n // always return it in full SemVer format, which can then be matched on using `semver` or `semver-coerced`\n const parts = goDirective.split('.');\n if (parts.length === 1) {\n return `${parts[0]}.0.0`;\n } else if (parts.length === 2) {\n return `${parts[0]}.${parts[1]}.0`;\n } else {\n return `${parts[0]}.${parts[1]}.${parts[2]}`;\n }\n }\n\n async getLatestVersion(\n baseUrl: string,\n packageName: string,\n ): Promise<string | null> {\n try {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@latest',\n );\n const res = await this.http.getJson(url, VersionInfo);\n return res.body.Version;\n } catch (err) {\n logger.trace({ err }, 'Failed to get latest version');\n return null;\n }\n }\n\n async getVersionsWithInfo(\n baseUrl: string,\n packageName: string,\n constraintsFiltering: ConstraintsFilter | undefined,\n ): Promise<ReleaseResult> {\n const isGopkgin = packageName.startsWith('gopkg.in/');\n const majorSuffixSeparator = isGopkgin ? '.' : '/';\n const modParts = packageName.match(modRegex)?.groups;\n const baseMod = modParts?.baseMod ?? /* v8 ignore next */ packageName;\n const packageMajor = parseInt(modParts?.majorVersion ?? '0', 10);\n\n const result: ReleaseResult = { releases: [] };\n for (let major = packageMajor; ; major += 1) {\n let pkg = `${baseMod}${majorSuffixSeparator}v${major}`;\n if (!isGopkgin && major < 2) {\n pkg = baseMod;\n major += 1; // v0 and v1 are the same module\n }\n\n let releases: Release[] = [];\n\n try {\n const res = await this.listVersions(baseUrl, pkg);\n\n // Artifactory returns all versions in any major (past and future),\n // so starting from v2, we filter them in order to avoid the infinite loop\n const filteredReleases = res.filter(({ version }) => {\n if (major < 2) {\n return true;\n }\n\n return (\n version.split(regEx(/[^\\d]+/)).find(isTruthy) === major.toString()\n );\n });\n\n releases = await p.map(filteredReleases, async (versionInfo) => {\n const { version, newDigest, releaseTimestamp } = versionInfo;\n\n if (releaseTimestamp) {\n return { version, newDigest, releaseTimestamp };\n }\n\n try {\n return await this.versionInfo(baseUrl, pkg, version);\n } catch (err) {\n logger.trace({ err }, `Can't obtain data from ${baseUrl}`);\n return { version };\n }\n });\n\n if (constraintsFiltering === 'strict') {\n releases = await p.map(releases, async (rel) => {\n try {\n const goDirective = await this.retrieveGoDirectiveForModule(\n baseUrl,\n pkg,\n rel.version,\n );\n if (goDirective) {\n rel.constraints ??= {};\n rel.constraints['%goMod'] ??= [];\n rel.constraints['%goMod'].push(goDirective);\n }\n } catch (err) {\n logger.trace(\n { err },\n `Can't obtain \\`go\\` directive from ${baseUrl}`,\n );\n }\n\n return rel;\n });\n }\n\n result.releases.push(...releases);\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const status = potentialHttpError.response?.statusCode;\n if (\n potentialHttpError instanceof HttpError &&\n (status === 404 || status === 403) &&\n major !== packageMajor\n ) {\n break;\n }\n\n throw err;\n }\n\n const latestVersion = await this.getLatestVersion(baseUrl, pkg);\n if (latestVersion) {\n result.tags ??= {};\n result.tags.latest ??= latestVersion;\n if (goVersioning.isGreaterThan(latestVersion, result.tags.latest)) {\n result.tags.latest = latestVersion;\n }\n if (!result.releases.length) {\n const releaseFromLatest = pseudoVersionToRelease(latestVersion);\n if (releaseFromLatest) {\n result.releases.push(releaseFromLatest);\n }\n }\n }\n\n if (!releases.length) {\n break;\n }\n }\n\n return result;\n }\n\n static getCacheKey({\n packageName,\n constraintsFiltering,\n }: GetReleasesConfig): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n const constraintsFilteringKey =\n constraintsFiltering && constraintsFiltering !== 'none'\n ? `@@${constraintsFiltering}`\n : '';\n // TODO: types (#22198)\n return `${packageName}@@${goproxy}@@${noproxy?.toString()}${constraintsFilteringKey}`;\n }\n\n static getVersionedCacheKey(packageName: string, version: string): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n // TODO: types (#22198)\n return `${packageName}@@${version}@@${goproxy}@@${noproxy?.toString()}`;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { MaybeTimestamp } from "../../../util/timestamp.js";
2
+ import { z } from "zod/v4";
3
+ //#region lib/modules/datasource/go/schema.ts
4
+ const VersionInfo = z.object({
5
+ Version: z.string(),
6
+ Time: MaybeTimestamp
7
+ });
8
+ //#endregion
9
+ export { VersionInfo };
10
+
11
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/go/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { MaybeTimestamp } from '../../../util/timestamp.ts';\n\nexport const VersionInfo = z.object({\n Version: z.string(),\n Time: MaybeTimestamp,\n});\n\nexport type VersionInfo = z.infer<typeof VersionInfo>;\n"],"mappings":";;;AAGA,MAAa,cAAc,EAAE,OAAO;CAClC,SAAS,EAAE,OAAO;CAClB,MAAM;AACR,CAAC"}
@@ -4,6 +4,7 @@ import { withCache } from "../../../util/cache/package/with-cache.js";
4
4
  import { asTimestamp } from "../../../util/timestamp.js";
5
5
  import { Datasource } from "../datasource.js";
6
6
  import { datasource, defaultRegistryUrl } from "./common.js";
7
+ import { NodeReleases } from "./schema.js";
7
8
  //#region lib/modules/datasource/node-version/index.ts
8
9
  var NodeVersionDatasource = class extends Datasource {
9
10
  static id = datasource;
@@ -27,8 +28,8 @@ var NodeVersionDatasource = class extends Datasource {
27
28
  releases: []
28
29
  };
29
30
  try {
30
- const resp = (await this.http.getJsonUnchecked(joinUrlParts(registryUrl, "index.json"))).body;
31
- result.releases.push(...resp.map(({ version, date, lts }) => ({
31
+ const resp = await this.http.getJson(joinUrlParts(registryUrl, "index.json"), NodeReleases);
32
+ result.releases.push(...resp.body.map(({ version, date, lts }) => ({
32
33
  version,
33
34
  releaseTimestamp: asTimestamp(date),
34
35
  isStable: lts !== false
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["versioning"],"sources":["../../../../lib/modules/datasource/node-version/index.ts"],"sourcesContent":["import { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as versioning } from '../../versioning/node/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport type { NodeRelease } from './types.ts';\n\nexport class NodeVersionDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n override readonly defaultVersioning = versioning;\n\n override readonly caching = true;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL: https://github.com/nodejs/node';\n\n private async _getReleases({\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n const result: ReleaseResult = {\n homepage: 'https://nodejs.org',\n sourceUrl: 'https://github.com/nodejs/node',\n registryUrl,\n releases: [],\n };\n try {\n const resp = (\n await this.http.getJsonUnchecked<NodeRelease[]>(\n joinUrlParts(registryUrl, 'index.json'),\n )\n ).body;\n result.releases.push(\n ...resp.map(({ version, date, lts }) => ({\n version,\n releaseTimestamp: asTimestamp(date),\n isStable: lts !== false,\n })),\n );\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${datasource}`,\n // TODO: types (#22198)\n key: `${config.registryUrl}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;AASA,IAAa,wBAAb,cAA2C,WAAW;CACpD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,sBAAwC,CAAC,kBAAkB;CAE3D,oBAAsCA;CAEtC,UAA4B;CAE5B,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aAAa,EACzB,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAET,MAAM,SAAwB;GAC5B,UAAU;GACV,WAAW;GACX;GACA,UAAU,CAAC;EACb;EACA,IAAI;GACF,MAAM,QACJ,MAAM,KAAK,KAAK,iBACd,aAAa,aAAa,YAAY,CACxC,GACA;GACF,OAAO,SAAS,KACd,GAAG,KAAK,KAAK,EAAE,SAAS,MAAM,WAAW;IACvC;IACA,kBAAkB,YAAY,IAAI;IAClC,UAAU,QAAQ;GACpB,EAAE,CACJ;EACF,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc;GAEzB,KAAK,GAAG,OAAO;GACf,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["versioning"],"sources":["../../../../lib/modules/datasource/node-version/index.ts"],"sourcesContent":["import { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as versioning } from '../../versioning/node/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport { NodeReleases } from './schema.ts';\n\nexport class NodeVersionDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n override readonly defaultVersioning = versioning;\n\n override readonly caching = true;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL: https://github.com/nodejs/node';\n\n private async _getReleases({\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n const result: ReleaseResult = {\n homepage: 'https://nodejs.org',\n sourceUrl: 'https://github.com/nodejs/node',\n registryUrl,\n releases: [],\n };\n try {\n const resp = await this.http.getJson(\n joinUrlParts(registryUrl, 'index.json'),\n NodeReleases,\n );\n result.releases.push(\n ...resp.body.map(({ version, date, lts }) => ({\n version,\n releaseTimestamp: asTimestamp(date),\n isStable: lts !== false,\n })),\n );\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${datasource}`,\n // TODO: types (#22198)\n key: `${config.registryUrl}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;AASA,IAAa,wBAAb,cAA2C,WAAW;CACpD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,sBAAwC,CAAC,kBAAkB;CAE3D,oBAAsCA;CAEtC,UAA4B;CAE5B,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aAAa,EACzB,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAET,MAAM,SAAwB;GAC5B,UAAU;GACV,WAAW;GACX;GACA,UAAU,CAAC;EACb;EACA,IAAI;GACF,MAAM,OAAO,MAAM,KAAK,KAAK,QAC3B,aAAa,aAAa,YAAY,GACtC,YACF;GACA,OAAO,SAAS,KACd,GAAG,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,WAAW;IAC5C;IACA,kBAAkB,YAAY,IAAI;IAClC,UAAU,QAAQ;GACpB,EAAE,CACJ;EACF,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc;GAEzB,KAAK,GAAG,OAAO;GACf,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
@@ -0,0 +1,14 @@
1
+ import { LooseArray } from "../../../util/schema-utils/index.js";
2
+ import { z } from "zod/v4";
3
+ const NodeReleases = LooseArray(z.object({
4
+ /** node version */
5
+ version: z.string(),
6
+ /** release date */
7
+ date: z.string().optional(),
8
+ /** Is LTS release */
9
+ lts: z.union([z.literal(false), z.string()])
10
+ }));
11
+ //#endregion
12
+ export { NodeReleases };
13
+
14
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/node-version/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\n\nexport const NodeRelease = z.object({\n /** node version */\n version: z.string(),\n /** release date */\n date: z.string().optional(),\n /** Is LTS release */\n lts: z.union([z.literal(false), z.string()]),\n});\n\nexport type NodeRelease = z.infer<typeof NodeRelease>;\n\nexport const NodeReleases = LooseArray(NodeRelease);\n"],"mappings":";;AAcA,MAAa,eAAe,WAXD,EAAE,OAAO;;CAElC,SAAS,EAAE,OAAO;;CAElB,MAAM,EAAE,OAAO,EAAE,SAAS;;CAE1B,KAAK,EAAE,MAAM,CAAC,EAAE,QAAQ,KAAK,GAAG,EAAE,OAAO,CAAC,CAAC;AAC7C,CAIuC,CAAW"}
@@ -7,7 +7,7 @@ import { ExternalHostError } from "../../../types/errors/external-host-error.js"
7
7
  import { asTimestamp } from "../../../util/timestamp.js";
8
8
  import { PackageHttpCacheProvider } from "../../../util/http/cache/package-http-cache-provider.js";
9
9
  import { defaultRegistryUrl } from "./common.js";
10
- import { CachedPackument } from "./schema.js";
10
+ import { CachedPackument, NpmResponse } from "./schema.js";
11
11
  import { isNonEmptyString, isString } from "@sindresorhus/is";
12
12
  import { z } from "zod/v4";
13
13
  //#region lib/modules/datasource/npm/get.ts
@@ -64,7 +64,7 @@ async function getDependency(http, registryUrl, packageName) {
64
64
  abortOnError: true
65
65
  });
66
66
  }
67
- const resp = await http.getJsonUnchecked(packageUrl, options);
67
+ const resp = await http.getJson(packageUrl, options, NpmResponse);
68
68
  const { body: res } = resp;
69
69
  if (!res.versions || !Object.keys(res.versions).length) {
70
70
  logger.debug(`No versions returned for npm dependency ${packageName}`);
@@ -1 +1 @@
1
- {"version":3,"file":"get.js","names":["hostRules.find"],"sources":["../../../../lib/modules/datasource/npm/get.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { HOST_DISABLED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { PackageHttpCacheProvider } from '../../../util/http/cache/package-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrl } from './common.ts';\nimport { CachedPackument } from './schema.ts';\nimport type { NpmResponse } from './types.ts';\n\nconst SHORT_REPO_REGEX = regEx(\n /^((?<platform>bitbucket|github|gitlab):)?(?<shortRepo>[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+)$/,\n);\n\nconst platformMapping: Record<string, string> = {\n bitbucket: 'https://bitbucket.org/',\n github: 'https://github.com/',\n gitlab: 'https://gitlab.com/',\n};\n\ninterface PackageSource {\n sourceUrl: string | null;\n sourceDirectory: string | null;\n}\n\nconst PackageSource = z\n .union([\n z\n .string()\n .nonempty()\n .transform((repository): PackageSource => {\n let sourceUrl: string | null = null;\n const sourceDirectory = null;\n const shortMatch = repository.match(SHORT_REPO_REGEX);\n if (shortMatch?.groups) {\n const { platform = 'github', shortRepo } = shortMatch.groups;\n sourceUrl = platformMapping[platform] + shortRepo;\n } else {\n sourceUrl = repository;\n }\n return { sourceUrl, sourceDirectory };\n }),\n z\n .object({\n url: z.string().nonempty().nullish(),\n directory: z.string().nonempty().nullish(),\n })\n .transform(({ url, directory }) => {\n const res: PackageSource = { sourceUrl: null, sourceDirectory: null };\n\n if (url) {\n res.sourceUrl = url;\n }\n\n if (directory) {\n res.sourceDirectory = directory;\n }\n\n return res;\n }),\n ])\n .catch({ sourceUrl: null, sourceDirectory: null });\n\nexport async function getDependency(\n http: Http,\n registryUrl: string,\n packageName: string,\n): Promise<ReleaseResult | null> {\n logger.trace(`npm.getDependency(${packageName})`);\n\n const packageUrl = joinUrlParts(registryUrl, packageName.replace('/', '%2F'));\n\n try {\n const cacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-npm:cache-provider',\n checkAuthorizationHeader: false, // We don't rely on whether user token is provided or not\n checkCacheControlHeader: true,\n writeSchema: CachedPackument,\n });\n const options: HttpOptions = { cacheProvider };\n\n // set abortOnError for registry.npmjs.org if no hostRule with explicit abortOnError exists\n if (\n registryUrl === defaultRegistryUrl &&\n hostRules.find({ url: defaultRegistryUrl })?.abortOnError === undefined\n ) {\n logger.trace(\n { packageName, registry: defaultRegistryUrl },\n 'setting abortOnError hostRule for well known host',\n );\n hostRules.add({\n matchHost: defaultRegistryUrl,\n abortOnError: true,\n });\n }\n\n const resp = await http.getJsonUnchecked<NpmResponse>(packageUrl, options);\n const { body: res } = resp;\n if (!res.versions || !Object.keys(res.versions).length) {\n // Registry returned a 200 OK but with no versions\n logger.debug(`No versions returned for npm dependency ${packageName}`);\n return null;\n }\n\n const latestVersion = res.versions[res['dist-tags']?.latest ?? ''];\n res.repository ??= latestVersion?.repository;\n res.homepage ??= latestVersion?.homepage;\n\n const { sourceUrl, sourceDirectory } = PackageSource.parse(res.repository);\n\n // Simplify response before caching and returning\n const dep: ReleaseResult = {\n homepage: res.homepage,\n releases: [],\n tags: res['dist-tags'],\n registryUrl,\n };\n\n if (sourceUrl) {\n dep.sourceUrl = sourceUrl;\n }\n\n if (sourceDirectory) {\n dep.sourceDirectory = sourceDirectory;\n }\n\n if (latestVersion?.deprecated) {\n dep.deprecationMessage = `On registry \\`${registryUrl}\\`, the \"latest\" version of dependency \\`${packageName}\\` has the following deprecation notice:\\n\\n\\`${latestVersion.deprecated}\\`\\n\\nMarking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.`;\n }\n dep.releases = Object.keys(res.versions).map((version) => {\n const release: Release = {\n version,\n gitRef: res.versions?.[version].gitHead,\n dependencies: res.versions?.[version].dependencies,\n devDependencies: res.versions?.[version].devDependencies,\n attestation: isString(res.versions?.[version].dist?.attestations?.url),\n };\n const releaseTimestamp = asTimestamp(res.time?.[version]);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n if (res.versions?.[version].deprecated) {\n release.isDeprecated = true;\n }\n const nodeConstraint = res.versions?.[version].engines?.node;\n if (isNonEmptyString(nodeConstraint)) {\n release.constraints = { node: [nodeConstraint] };\n }\n const source = PackageSource.parse(res.versions?.[version].repository);\n if (source.sourceUrl && source.sourceUrl !== dep.sourceUrl) {\n release.sourceUrl = source.sourceUrl;\n }\n if (\n source.sourceDirectory &&\n source.sourceDirectory !== dep.sourceDirectory\n ) {\n release.sourceDirectory = source.sourceDirectory;\n }\n if (dep.deprecationMessage) {\n release.isDeprecated = true;\n }\n return release;\n });\n\n const isPublic = resp.headers?.['cache-control']\n ?.toLocaleLowerCase()\n ?.split(regEx(/\\s*,\\s*/))\n ?.includes('public');\n if (!isPublic) {\n dep.isPrivate = true;\n }\n\n logger.trace({ dep }, 'dep');\n return dep;\n } catch (err) {\n const actualError = err instanceof ExternalHostError ? err.err : err;\n const ignoredStatusCodes = [401, 402, 403, 404];\n const ignoredResponseCodes = ['ENOTFOUND'];\n if (\n actualError.message === HOST_DISABLED ||\n ignoredStatusCodes.includes(actualError.statusCode) ||\n ignoredResponseCodes.includes(actualError.code)\n ) {\n return null;\n }\n\n if (err instanceof ExternalHostError) {\n if (actualError.name === 'ParseError' && actualError.body) {\n actualError.body = 'err.body deleted by Renovate';\n err.err = actualError;\n }\n throw err;\n }\n logger.debug({ err }, 'Unknown npm lookup error');\n return null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"get.js","names":["hostRules.find"],"sources":["../../../../lib/modules/datasource/npm/get.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { HOST_DISABLED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { PackageHttpCacheProvider } from '../../../util/http/cache/package-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrl } from './common.ts';\nimport { CachedPackument, NpmResponse } from './schema.ts';\n\nconst SHORT_REPO_REGEX = regEx(\n /^((?<platform>bitbucket|github|gitlab):)?(?<shortRepo>[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+)$/,\n);\n\nconst platformMapping: Record<string, string> = {\n bitbucket: 'https://bitbucket.org/',\n github: 'https://github.com/',\n gitlab: 'https://gitlab.com/',\n};\n\ninterface PackageSource {\n sourceUrl: string | null;\n sourceDirectory: string | null;\n}\n\nconst PackageSource = z\n .union([\n z\n .string()\n .nonempty()\n .transform((repository): PackageSource => {\n let sourceUrl: string | null = null;\n const sourceDirectory = null;\n const shortMatch = repository.match(SHORT_REPO_REGEX);\n if (shortMatch?.groups) {\n const { platform = 'github', shortRepo } = shortMatch.groups;\n sourceUrl = platformMapping[platform] + shortRepo;\n } else {\n sourceUrl = repository;\n }\n return { sourceUrl, sourceDirectory };\n }),\n z\n .object({\n url: z.string().nonempty().nullish(),\n directory: z.string().nonempty().nullish(),\n })\n .transform(({ url, directory }) => {\n const res: PackageSource = { sourceUrl: null, sourceDirectory: null };\n\n if (url) {\n res.sourceUrl = url;\n }\n\n if (directory) {\n res.sourceDirectory = directory;\n }\n\n return res;\n }),\n ])\n .catch({ sourceUrl: null, sourceDirectory: null });\n\nexport async function getDependency(\n http: Http,\n registryUrl: string,\n packageName: string,\n): Promise<ReleaseResult | null> {\n logger.trace(`npm.getDependency(${packageName})`);\n\n const packageUrl = joinUrlParts(registryUrl, packageName.replace('/', '%2F'));\n\n try {\n const cacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-npm:cache-provider',\n checkAuthorizationHeader: false, // We don't rely on whether user token is provided or not\n checkCacheControlHeader: true,\n writeSchema: CachedPackument,\n });\n const options: HttpOptions = { cacheProvider };\n\n // set abortOnError for registry.npmjs.org if no hostRule with explicit abortOnError exists\n if (\n registryUrl === defaultRegistryUrl &&\n hostRules.find({ url: defaultRegistryUrl })?.abortOnError === undefined\n ) {\n logger.trace(\n { packageName, registry: defaultRegistryUrl },\n 'setting abortOnError hostRule for well known host',\n );\n hostRules.add({\n matchHost: defaultRegistryUrl,\n abortOnError: true,\n });\n }\n\n const resp = await http.getJson(packageUrl, options, NpmResponse);\n const { body: res } = resp;\n if (!res.versions || !Object.keys(res.versions).length) {\n // Registry returned a 200 OK but with no versions\n logger.debug(`No versions returned for npm dependency ${packageName}`);\n return null;\n }\n\n const latestVersion = res.versions[res['dist-tags']?.latest ?? ''];\n res.repository ??= latestVersion?.repository;\n res.homepage ??= latestVersion?.homepage;\n\n const { sourceUrl, sourceDirectory } = PackageSource.parse(res.repository);\n\n // Simplify response before caching and returning\n const dep: ReleaseResult = {\n homepage: res.homepage,\n releases: [],\n tags: res['dist-tags'],\n registryUrl,\n };\n\n if (sourceUrl) {\n dep.sourceUrl = sourceUrl;\n }\n\n if (sourceDirectory) {\n dep.sourceDirectory = sourceDirectory;\n }\n\n if (latestVersion?.deprecated) {\n dep.deprecationMessage = `On registry \\`${registryUrl}\\`, the \"latest\" version of dependency \\`${packageName}\\` has the following deprecation notice:\\n\\n\\`${latestVersion.deprecated}\\`\\n\\nMarking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.`;\n }\n dep.releases = Object.keys(res.versions).map((version) => {\n const release: Release = {\n version,\n gitRef: res.versions?.[version].gitHead,\n dependencies: res.versions?.[version].dependencies,\n devDependencies: res.versions?.[version].devDependencies,\n attestation: isString(res.versions?.[version].dist?.attestations?.url),\n };\n const releaseTimestamp = asTimestamp(res.time?.[version]);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n if (res.versions?.[version].deprecated) {\n release.isDeprecated = true;\n }\n const nodeConstraint = res.versions?.[version].engines?.node;\n if (isNonEmptyString(nodeConstraint)) {\n release.constraints = { node: [nodeConstraint] };\n }\n const source = PackageSource.parse(res.versions?.[version].repository);\n if (source.sourceUrl && source.sourceUrl !== dep.sourceUrl) {\n release.sourceUrl = source.sourceUrl;\n }\n if (\n source.sourceDirectory &&\n source.sourceDirectory !== dep.sourceDirectory\n ) {\n release.sourceDirectory = source.sourceDirectory;\n }\n if (dep.deprecationMessage) {\n release.isDeprecated = true;\n }\n return release;\n });\n\n const isPublic = resp.headers?.['cache-control']\n ?.toLocaleLowerCase()\n ?.split(regEx(/\\s*,\\s*/))\n ?.includes('public');\n if (!isPublic) {\n dep.isPrivate = true;\n }\n\n logger.trace({ dep }, 'dep');\n return dep;\n } catch (err) {\n const actualError = err instanceof ExternalHostError ? err.err : err;\n const ignoredStatusCodes = [401, 402, 403, 404];\n const ignoredResponseCodes = ['ENOTFOUND'];\n if (\n actualError.message === HOST_DISABLED ||\n ignoredStatusCodes.includes(actualError.statusCode) ||\n ignoredResponseCodes.includes(actualError.code)\n ) {\n return null;\n }\n\n if (err instanceof ExternalHostError) {\n if (actualError.name === 'ParseError' && actualError.body) {\n actualError.body = 'err.body deleted by Renovate';\n err.err = actualError;\n }\n throw err;\n }\n logger.debug({ err }, 'Unknown npm lookup error');\n return null;\n }\n}\n"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import { z } from "zod/v4";
2
2
  //#region lib/modules/datasource/npm/schema.ts
3
3
  const Repository = z.union([z.string(), z.object({
4
- url: z.string().optional(),
5
- directory: z.string().optional()
4
+ url: z.string().nullish(),
5
+ directory: z.string().nullish()
6
6
  })]);
7
7
  const Attestations = z.object({ url: z.string().optional() });
8
8
  const Distribution = z.object({ attestations: Attestations.optional() });
9
- const Version = z.object({
9
+ const NpmResponseVersion = z.object({
10
10
  repository: Repository.optional(),
11
11
  homepage: z.string().optional().catch(void 0),
12
12
  deprecated: z.union([z.string(), z.boolean()]).optional(),
@@ -17,13 +17,29 @@ const Version = z.object({
17
17
  dist: Distribution.optional()
18
18
  });
19
19
  const CachedPackument = z.object({
20
- versions: z.record(z.string(), Version).optional(),
20
+ versions: z.record(z.string(), NpmResponseVersion).optional(),
21
+ repository: Repository.optional(),
22
+ homepage: z.string().optional(),
23
+ time: z.record(z.string(), z.string()).optional(),
24
+ "dist-tags": z.record(z.string(), z.string()).optional()
25
+ });
26
+ /**
27
+ * Full NpmResponse schema — used when fetching from the npm registry.
28
+ * Lenient: only validates fields Renovate actually reads.
29
+ * Uses loose() on the version objects to preserve extra fields
30
+ * (e.g. 'renovate-config' used by config/presets/npm/index.ts).
31
+ */
32
+ const NpmResponseVersionLoose = NpmResponseVersion.loose();
33
+ const NpmResponse = z.object({
34
+ _id: z.string().optional(),
35
+ name: z.string().optional(),
36
+ versions: z.record(z.string(), NpmResponseVersionLoose).optional(),
21
37
  repository: Repository.optional(),
22
38
  homepage: z.string().optional(),
23
39
  time: z.record(z.string(), z.string()).optional(),
24
40
  "dist-tags": z.record(z.string(), z.string()).optional()
25
41
  });
26
42
  //#endregion
27
- export { CachedPackument };
43
+ export { CachedPackument, NpmResponse };
28
44
 
29
45
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/npm/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\n\nconst Repository = z.union([\n z.string(),\n z.object({\n url: z.string().optional(),\n directory: z.string().optional(),\n }),\n]);\n\nconst Attestations = z.object({\n url: z.string().optional(),\n});\n\nconst Distribution = z.object({\n attestations: Attestations.optional(),\n});\n\nconst Version = z.object({\n repository: Repository.optional(),\n homepage: z.string().optional().catch(undefined),\n deprecated: z.union([z.string(), z.boolean()]).optional(),\n gitHead: z.string().optional(),\n dependencies: z.record(z.string(), z.string()).optional(),\n devDependencies: z.record(z.string(), z.string()).optional(),\n engines: z\n .object({ node: z.string().optional() })\n .optional()\n .catch(undefined),\n dist: Distribution.optional(),\n});\n\nexport const CachedPackument = z.object({\n versions: z.record(z.string(), Version).optional(),\n repository: Repository.optional(),\n homepage: z.string().optional(),\n time: z.record(z.string(), z.string()).optional(),\n 'dist-tags': z.record(z.string(), z.string()).optional(),\n});\n"],"mappings":";;AAEA,MAAM,aAAa,EAAE,MAAM,CACzB,EAAE,OAAO,GACT,EAAE,OAAO;CACP,KAAK,EAAE,OAAO,EAAE,SAAS;CACzB,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC,CACH,CAAC;AAED,MAAM,eAAe,EAAE,OAAO,EAC5B,KAAK,EAAE,OAAO,EAAE,SAAS,EAC3B,CAAC;AAED,MAAM,eAAe,EAAE,OAAO,EAC5B,cAAc,aAAa,SAAS,EACtC,CAAC;AAED,MAAM,UAAU,EAAE,OAAO;CACvB,YAAY,WAAW,SAAS;CAChC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAA,CAAS;CAC/C,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS;CACxD,SAAS,EAAE,OAAO,EAAE,SAAS;CAC7B,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;CACxD,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;CAC3D,SAAS,EACN,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACtC,SAAS,EACT,MAAM,KAAA,CAAS;CAClB,MAAM,aAAa,SAAS;AAC9B,CAAC;AAED,MAAa,kBAAkB,EAAE,OAAO;CACtC,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,SAAS;CACjD,YAAY,WAAW,SAAS;CAChC,UAAU,EAAE,OAAO,EAAE,SAAS;CAC9B,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;CAChD,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AACzD,CAAC"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/npm/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\n\nconst Repository = z.union([\n z.string(),\n z.object({\n url: z.string().nullish(),\n directory: z.string().nullish(),\n }),\n]);\n\nconst Attestations = z.object({\n url: z.string().optional(),\n});\n\nconst Distribution = z.object({\n attestations: Attestations.optional(),\n});\n\nexport const NpmResponseVersion = z.object({\n repository: Repository.optional(),\n homepage: z.string().optional().catch(undefined),\n deprecated: z.union([z.string(), z.boolean()]).optional(),\n gitHead: z.string().optional(),\n dependencies: z.record(z.string(), z.string()).optional(),\n devDependencies: z.record(z.string(), z.string()).optional(),\n engines: z\n .object({ node: z.string().optional() })\n .optional()\n .catch(undefined),\n dist: Distribution.optional(),\n});\nexport type NpmResponseVersion = z.infer<typeof NpmResponseVersion>;\n\nexport const CachedPackument = z.object({\n versions: z.record(z.string(), NpmResponseVersion).optional(),\n repository: Repository.optional(),\n homepage: z.string().optional(),\n time: z.record(z.string(), z.string()).optional(),\n 'dist-tags': z.record(z.string(), z.string()).optional(),\n});\n\n/**\n * Full NpmResponse schema — used when fetching from the npm registry.\n * Lenient: only validates fields Renovate actually reads.\n * Uses loose() on the version objects to preserve extra fields\n * (e.g. 'renovate-config' used by config/presets/npm/index.ts).\n */\nconst NpmResponseVersionLoose = NpmResponseVersion.loose();\n\nexport const NpmResponse = z.object({\n _id: z.string().optional(),\n name: z.string().optional(),\n versions: z.record(z.string(), NpmResponseVersionLoose).optional(),\n repository: Repository.optional(),\n homepage: z.string().optional(),\n time: z.record(z.string(), z.string()).optional(),\n 'dist-tags': z.record(z.string(), z.string()).optional(),\n});\n\nexport type NpmResponse = z.infer<typeof NpmResponse>;\n"],"mappings":";;AAEA,MAAM,aAAa,EAAE,MAAM,CACzB,EAAE,OAAO,GACT,EAAE,OAAO;CACP,KAAK,EAAE,OAAO,EAAE,QAAQ;CACxB,WAAW,EAAE,OAAO,EAAE,QAAQ;AAChC,CAAC,CACH,CAAC;AAED,MAAM,eAAe,EAAE,OAAO,EAC5B,KAAK,EAAE,OAAO,EAAE,SAAS,EAC3B,CAAC;AAED,MAAM,eAAe,EAAE,OAAO,EAC5B,cAAc,aAAa,SAAS,EACtC,CAAC;AAED,MAAa,qBAAqB,EAAE,OAAO;CACzC,YAAY,WAAW,SAAS;CAChC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAA,CAAS;CAC/C,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS;CACxD,SAAS,EAAE,OAAO,EAAE,SAAS;CAC7B,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;CACxD,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;CAC3D,SAAS,EACN,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACtC,SAAS,EACT,MAAM,KAAA,CAAS;CAClB,MAAM,aAAa,SAAS;AAC9B,CAAC;AAGD,MAAa,kBAAkB,EAAE,OAAO;CACtC,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,kBAAkB,EAAE,SAAS;CAC5D,YAAY,WAAW,SAAS;CAChC,UAAU,EAAE,OAAO,EAAE,SAAS;CAC9B,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;CAChD,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AACzD,CAAC;;;;;;;AAQD,MAAM,0BAA0B,mBAAmB,MAAM;AAEzD,MAAa,cAAc,EAAE,OAAO;CAClC,KAAK,EAAE,OAAO,EAAE,SAAS;CACzB,MAAM,EAAE,OAAO,EAAE,SAAS;CAC1B,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,uBAAuB,EAAE,SAAS;CACjE,YAAY,WAAW,SAAS;CAChC,UAAU,EAAE,OAAO,EAAE,SAAS;CAC9B,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;CAChD,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AACzD,CAAC"}
@@ -6,38 +6,6 @@ interface NpmrcRules {
6
6
  hostRules: HostRule[];
7
7
  packageRules: PackageRule[];
8
8
  }
9
- interface NpmAttestations {
10
- url?: string;
11
- }
12
- interface NpmDistribution {
13
- attestations?: NpmAttestations;
14
- }
15
- interface NpmResponseVersion {
16
- repository?: {
17
- url: string;
18
- directory: string;
19
- };
20
- homepage?: string;
21
- deprecated?: boolean;
22
- gitHead?: string;
23
- dependencies?: Record<string, string>;
24
- devDependencies?: Record<string, string>;
25
- engines?: Record<string, string>;
26
- dist?: NpmDistribution;
27
- }
28
- interface NpmResponse {
29
- _id: string;
30
- name: string;
31
- versions?: Record<string, NpmResponseVersion>;
32
- repository?: {
33
- url?: string;
34
- directory?: string;
35
- };
36
- homepage?: string;
37
- time?: Record<string, string>;
38
- 'dist-tags'?: Record<string, string>;
39
- }
40
- type Npmrc = Record<string, any>;
41
9
  //#endregion
42
- export { NpmAttestations, NpmDistribution, NpmResponse, NpmResponseVersion, Npmrc, NpmrcRules };
10
+ export { NpmrcRules };
43
11
  //# sourceMappingURL=types.d.ts.map
@@ -9,6 +9,7 @@ import { asTimestamp } from "../../../util/timestamp.js";
9
9
  import { Datasource } from "../datasource.js";
10
10
  import { getGoogleAuthToken } from "../util.js";
11
11
  import { isGitHubRepo, normalizePythonDepName } from "./common.js";
12
+ import { PypiResponse } from "./schema.js";
12
13
  import { isString } from "@sindresorhus/is";
13
14
  import changelogFilenameRegex from "changelog-filename-regex";
14
15
  //#region lib/modules/datasource/pypi/index.ts
@@ -96,12 +97,8 @@ var PypiDatasource = class PypiDatasource extends Datasource {
96
97
  const dependency = { releases: [] };
97
98
  logger.trace({ lookupUrl }, "Pypi api got lookup");
98
99
  const { headers, lookupUrl: sanitizedUrl } = await this.getAuthHeaders(lookupUrl);
99
- const rep = await this.http.getJsonUnchecked(sanitizedUrl, { headers });
100
+ const rep = await this.http.getJson(sanitizedUrl, { headers }, PypiResponse);
100
101
  const dep = rep?.body;
101
- if (!dep) {
102
- logger.trace({ dependency: packageName }, "pip package not found");
103
- return null;
104
- }
105
102
  if (rep.authorization) dependency.isPrivate = true;
106
103
  logger.trace({ lookupUrl }, "Got pypi api result");
107
104
  if (dep.info?.home_page) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["pep440.id"],"sources":["../../../../lib/modules/datasource/pypi/index.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport changelogFilenameRegex from 'changelog-filename-regex';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { parse } from '../../../util/html.ts';\nimport type { OutgoingHttpHeaders } from '../../../util/http/types.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash, parseUrl } from '../../../util/url.ts';\nimport * as pep440 from '../../versioning/pep440/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { getGoogleAuthToken } from '../util.ts';\nimport { isGitHubRepo, normalizePythonDepName } from './common.ts';\nimport type { PypiJSON, PypiJSONRelease, Releases } from './types.ts';\n\nexport class PypiDatasource extends Datasource {\n static readonly id = 'pypi';\n\n constructor() {\n super(PypiDatasource.id);\n }\n\n override readonly caching = true;\n\n override readonly customRegistrySupport = true;\n\n static readonly defaultURL =\n getEnv().PIP_INDEX_URL ?? 'https://pypi.org/pypi/';\n override readonly defaultRegistryUrls = [PypiDatasource.defaultURL];\n\n override readonly defaultVersioning = pep440.id;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The relase timestamp is determined from the `upload_time` field in the results. This field is not available when using the simple API.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `homepage` field if it is a github repository, else we use the `project_urls` field.';\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n let dependency: ReleaseResult | null = null;\n // TODO: null check (#22198)\n const hostUrl = ensureTrailingSlash(\n registryUrl!.replace('https://pypi.org/simple', 'https://pypi.org/pypi'),\n );\n const normalizedLookupName = normalizePythonDepName(packageName);\n\n // not all simple indexes use this identifier, but most do\n if (hostUrl.endsWith('/simple/') || hostUrl.endsWith('/+simple/')) {\n logger.trace(\n { packageName, hostUrl },\n 'Looking up pypi simple dependency',\n );\n dependency = await this.getSimpleDependency(\n normalizedLookupName,\n hostUrl,\n );\n } else {\n logger.trace({ packageName, hostUrl }, 'Looking up pypi api dependency');\n try {\n // we need to resolve early here so we can catch any 404s and fallback to a simple lookup\n dependency = await this.getDependency(normalizedLookupName, hostUrl);\n } catch (err) {\n // error contacting json-style api -- attempt to fallback to a simple-style api\n logger.trace(\n { packageName, hostUrl, err },\n 'Looking up pypi simple dependency via fallback',\n );\n dependency = await this.getSimpleDependency(\n normalizedLookupName,\n hostUrl,\n );\n }\n }\n return dependency;\n }\n\n private sanitizeLookupUrl(lookupUrl: string, parsedUrl: URL): string {\n if (!parsedUrl.username && !parsedUrl.password) {\n return lookupUrl;\n }\n\n parsedUrl.username = '';\n parsedUrl.password = '';\n return parsedUrl.toString();\n }\n\n private async getAuthHeaders(\n lookupUrl: string,\n ): Promise<{ headers: OutgoingHttpHeaders; lookupUrl: string }> {\n const parsedUrl = parseUrl(lookupUrl);\n // v8 ignore if -- TODO: refactor to cover this branch through public behavior again\n if (!parsedUrl) {\n logger.once.debug({ lookupUrl }, 'Failed to parse URL');\n return { headers: {}, lookupUrl };\n }\n if (parsedUrl.hostname.endsWith('.pkg.dev')) {\n const auth = await getGoogleAuthToken();\n if (auth) {\n const sanitizedLookupUrl = this.sanitizeLookupUrl(lookupUrl, parsedUrl);\n return {\n headers: { authorization: `Basic ${auth}` },\n lookupUrl: sanitizedLookupUrl,\n };\n }\n logger.once.debug({ lookupUrl }, 'Could not get Google access token');\n return { headers: {}, lookupUrl };\n }\n return { headers: {}, lookupUrl };\n }\n\n private async getDependency(\n packageName: string,\n hostUrl: string,\n ): Promise<ReleaseResult | null> {\n const lookupUrl = new URL(\n `${normalizePythonDepName(packageName)}/json`,\n hostUrl,\n ).href;\n const dependency: ReleaseResult = { releases: [] };\n logger.trace({ lookupUrl }, 'Pypi api got lookup');\n const { headers, lookupUrl: sanitizedUrl } =\n await this.getAuthHeaders(lookupUrl);\n const rep = await this.http.getJsonUnchecked<PypiJSON>(sanitizedUrl, {\n headers,\n });\n const dep = rep?.body;\n if (!dep) {\n logger.trace({ dependency: packageName }, 'pip package not found');\n return null;\n }\n if (rep.authorization) {\n dependency.isPrivate = true;\n }\n logger.trace({ lookupUrl }, 'Got pypi api result');\n\n if (dep.info?.home_page) {\n dependency.homepage = dep.info.home_page;\n if (isGitHubRepo(dep.info.home_page)) {\n dependency.sourceUrl = dep.info.home_page.replace(\n 'http://',\n 'https://',\n );\n }\n }\n\n if (dep.info?.project_urls) {\n for (const [name, projectUrl] of Object.entries(dep.info.project_urls)) {\n const lower = name.toLowerCase();\n\n if (\n !dependency.sourceUrl &&\n (lower.startsWith('repo') ||\n lower === 'code' ||\n lower === 'source' ||\n isGitHubRepo(projectUrl))\n ) {\n dependency.sourceUrl = projectUrl;\n }\n\n if (\n !dependency.changelogUrl &&\n ([\n 'changelog',\n 'change log',\n 'changes',\n 'release notes',\n 'news',\n \"what's new\",\n ].includes(lower) ||\n changelogFilenameRegex.exec(lower))\n ) {\n // from https://github.com/pypa/warehouse/blob/418c7511dc367fb410c71be139545d0134ccb0df/warehouse/templates/packaging/detail.html#L24\n dependency.changelogUrl = projectUrl;\n }\n }\n }\n\n if (dep.releases) {\n const versions = Object.keys(dep.releases);\n dependency.releases = versions.map((version) => {\n const releases = coerceArray(dep.releases?.[version]);\n const { upload_time: releaseTimestamp } = releases[0] || {};\n const isDeprecated = releases.some(({ yanked }) => yanked);\n const result: Release = {\n version,\n releaseTimestamp: asTimestamp(releaseTimestamp),\n };\n if (isDeprecated) {\n result.isDeprecated = isDeprecated;\n }\n // There may be multiple releases with different requires_python, so we return all in an array\n const pythonConstraints = releases\n .map(({ requires_python }) => requires_python)\n .filter(isString);\n result.constraints = {\n python: Array.from(new Set(pythonConstraints)),\n };\n return result;\n });\n }\n return dependency;\n }\n\n private static extractVersionFromLinkText(\n text: string,\n packageName: string,\n ): string | null {\n // source packages\n const lcText = text.toLowerCase();\n const normalizedSrcText = normalizePythonDepName(text);\n const srcPrefix = `${packageName}-`;\n\n // source distribution format: `{name}-{version}.tar.gz` (https://packaging.python.org/en/latest/specifications/source-distribution-format/#source-distribution-file-name)\n // binary distribution: `{distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl` (https://packaging.python.org/en/latest/specifications/binary-distribution-format/#file-name-convention)\n // officially both `name` and `distribution` should be normalized and then the - replaced with _, but in reality this is not the case\n // We therefore normalize the name we have (replacing `_-.` with -) and then check if the text starts with the normalized name\n\n if (!normalizedSrcText.startsWith(srcPrefix)) {\n return null;\n }\n\n // strip off the prefix using the prefix length as we may have normalized the srcPrefix/packageName\n // We assume that neither the version nor the suffix contains multiple `-` like `0.1.2---rc1.tar.gz`\n // and use the difference in length to strip off the prefix in case the name contains double `--` characters\n const normalizedLengthDiff = lcText.length - normalizedSrcText.length;\n const res = lcText.slice(srcPrefix.length + normalizedLengthDiff);\n\n // source distribution\n const srcSuffixes = ['.tar.gz', '.tar.bz2', '.tar.xz', '.zip', '.tgz'];\n const srcSuffix = srcSuffixes.find((suffix) => lcText.endsWith(suffix));\n if (srcSuffix) {\n // strip off the suffix using character length\n return res.slice(0, -srcSuffix.length);\n }\n\n // binary distribution\n // for binary distributions the version is the first part after the removed distribution name\n const wheelSuffix = '.whl';\n if (lcText.endsWith(wheelSuffix) && lcText.split('-').length > 2) {\n return res.split('-')[0];\n }\n return null;\n }\n\n private static cleanSimpleHtml(html: string): string {\n return (\n html\n .replace(regEx(/<\\/?pre>/), '')\n // Certain simple repositories like artifactory don't escape > and <\n .replace(\n regEx(/data-requires-python=\"([^\"]*?)>([^\"]*?)\"/g),\n 'data-requires-python=\"$1&gt;$2\"',\n )\n .replace(\n regEx(/data-requires-python=\"([^\"]*?)<([^\"]*?)\"/g),\n 'data-requires-python=\"$1&lt;$2\"',\n )\n );\n }\n\n private async getSimpleDependency(\n packageName: string,\n hostUrl: string,\n ): Promise<ReleaseResult | null> {\n const lookupUrl = new URL(\n ensureTrailingSlash(normalizePythonDepName(packageName)),\n hostUrl,\n ).href;\n const dependency: ReleaseResult = { releases: [] };\n const { headers, lookupUrl: sanitizedUrl } =\n await this.getAuthHeaders(lookupUrl);\n const response = await this.http.getText(sanitizedUrl, { headers });\n const dep = response?.body;\n if (!dep) {\n logger.trace({ dependency: packageName }, 'pip package not found');\n return null;\n }\n if (response.authorization) {\n dependency.isPrivate = true;\n }\n const root = parse(PypiDatasource.cleanSimpleHtml(dep));\n const links = root.querySelectorAll('a');\n const releases: Releases = {};\n for (const link of Array.from(links)) {\n const version = PypiDatasource.extractVersionFromLinkText(\n link.text?.trim(),\n packageName,\n );\n if (version) {\n const release: PypiJSONRelease = {\n yanked: link.hasAttribute('data-yanked'),\n };\n const requiresPython = link.getAttribute('data-requires-python');\n if (requiresPython) {\n release.requires_python = requiresPython;\n }\n if (!releases[version]) {\n releases[version] = [];\n }\n releases[version].push(release);\n }\n }\n const versions = Object.keys(releases);\n dependency.releases = versions.map((version) => {\n const versionReleases = coerceArray(releases[version]);\n const isDeprecated = versionReleases.some(({ yanked }) => yanked);\n const result: Release = { version };\n if (isDeprecated) {\n result.isDeprecated = isDeprecated;\n }\n // There may be multiple releases with different requires_python, so we return all in an array\n result.constraints = {\n // TODO: string[] isn't allowed here\n python: versionReleases.map(\n ({ requires_python }) => requires_python,\n ) as any,\n };\n return result;\n });\n return dependency;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["pep440.id"],"sources":["../../../../lib/modules/datasource/pypi/index.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport changelogFilenameRegex from 'changelog-filename-regex';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { parse } from '../../../util/html.ts';\nimport type { OutgoingHttpHeaders } from '../../../util/http/types.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash, parseUrl } from '../../../util/url.ts';\nimport * as pep440 from '../../versioning/pep440/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { getGoogleAuthToken } from '../util.ts';\nimport { isGitHubRepo, normalizePythonDepName } from './common.ts';\nimport type { PypiRelease } from './schema.ts';\nimport { PypiResponse } from './schema.ts';\nimport type { Releases } from './types.ts';\n\nexport class PypiDatasource extends Datasource {\n static readonly id = 'pypi';\n\n constructor() {\n super(PypiDatasource.id);\n }\n\n override readonly caching = true;\n\n override readonly customRegistrySupport = true;\n\n static readonly defaultURL =\n getEnv().PIP_INDEX_URL ?? 'https://pypi.org/pypi/';\n override readonly defaultRegistryUrls = [PypiDatasource.defaultURL];\n\n override readonly defaultVersioning = pep440.id;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The relase timestamp is determined from the `upload_time` field in the results. This field is not available when using the simple API.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `homepage` field if it is a github repository, else we use the `project_urls` field.';\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n let dependency: ReleaseResult | null = null;\n // TODO: null check (#22198)\n const hostUrl = ensureTrailingSlash(\n registryUrl!.replace('https://pypi.org/simple', 'https://pypi.org/pypi'),\n );\n const normalizedLookupName = normalizePythonDepName(packageName);\n\n // not all simple indexes use this identifier, but most do\n if (hostUrl.endsWith('/simple/') || hostUrl.endsWith('/+simple/')) {\n logger.trace(\n { packageName, hostUrl },\n 'Looking up pypi simple dependency',\n );\n dependency = await this.getSimpleDependency(\n normalizedLookupName,\n hostUrl,\n );\n } else {\n logger.trace({ packageName, hostUrl }, 'Looking up pypi api dependency');\n try {\n // we need to resolve early here so we can catch any 404s and fallback to a simple lookup\n dependency = await this.getDependency(normalizedLookupName, hostUrl);\n } catch (err) {\n // error contacting json-style api -- attempt to fallback to a simple-style api\n logger.trace(\n { packageName, hostUrl, err },\n 'Looking up pypi simple dependency via fallback',\n );\n dependency = await this.getSimpleDependency(\n normalizedLookupName,\n hostUrl,\n );\n }\n }\n return dependency;\n }\n\n private sanitizeLookupUrl(lookupUrl: string, parsedUrl: URL): string {\n if (!parsedUrl.username && !parsedUrl.password) {\n return lookupUrl;\n }\n\n parsedUrl.username = '';\n parsedUrl.password = '';\n return parsedUrl.toString();\n }\n\n private async getAuthHeaders(\n lookupUrl: string,\n ): Promise<{ headers: OutgoingHttpHeaders; lookupUrl: string }> {\n const parsedUrl = parseUrl(lookupUrl);\n // v8 ignore if -- TODO: refactor to cover this branch through public behavior again\n if (!parsedUrl) {\n logger.once.debug({ lookupUrl }, 'Failed to parse URL');\n return { headers: {}, lookupUrl };\n }\n if (parsedUrl.hostname.endsWith('.pkg.dev')) {\n const auth = await getGoogleAuthToken();\n if (auth) {\n const sanitizedLookupUrl = this.sanitizeLookupUrl(lookupUrl, parsedUrl);\n return {\n headers: { authorization: `Basic ${auth}` },\n lookupUrl: sanitizedLookupUrl,\n };\n }\n logger.once.debug({ lookupUrl }, 'Could not get Google access token');\n return { headers: {}, lookupUrl };\n }\n return { headers: {}, lookupUrl };\n }\n\n private async getDependency(\n packageName: string,\n hostUrl: string,\n ): Promise<ReleaseResult | null> {\n const lookupUrl = new URL(\n `${normalizePythonDepName(packageName)}/json`,\n hostUrl,\n ).href;\n const dependency: ReleaseResult = { releases: [] };\n logger.trace({ lookupUrl }, 'Pypi api got lookup');\n const { headers, lookupUrl: sanitizedUrl } =\n await this.getAuthHeaders(lookupUrl);\n const rep = await this.http.getJson(\n sanitizedUrl,\n { headers },\n PypiResponse,\n );\n const dep = rep?.body;\n if (rep.authorization) {\n dependency.isPrivate = true;\n }\n logger.trace({ lookupUrl }, 'Got pypi api result');\n\n if (dep.info?.home_page) {\n dependency.homepage = dep.info.home_page;\n if (isGitHubRepo(dep.info.home_page)) {\n dependency.sourceUrl = dep.info.home_page.replace(\n 'http://',\n 'https://',\n );\n }\n }\n\n if (dep.info?.project_urls) {\n for (const [name, projectUrl] of Object.entries(dep.info.project_urls)) {\n const lower = name.toLowerCase();\n\n if (\n !dependency.sourceUrl &&\n (lower.startsWith('repo') ||\n lower === 'code' ||\n lower === 'source' ||\n isGitHubRepo(projectUrl))\n ) {\n dependency.sourceUrl = projectUrl;\n }\n\n if (\n !dependency.changelogUrl &&\n ([\n 'changelog',\n 'change log',\n 'changes',\n 'release notes',\n 'news',\n \"what's new\",\n ].includes(lower) ||\n changelogFilenameRegex.exec(lower))\n ) {\n // from https://github.com/pypa/warehouse/blob/418c7511dc367fb410c71be139545d0134ccb0df/warehouse/templates/packaging/detail.html#L24\n dependency.changelogUrl = projectUrl;\n }\n }\n }\n\n if (dep.releases) {\n const versions = Object.keys(dep.releases);\n dependency.releases = versions.map((version) => {\n const releases = coerceArray(dep.releases?.[version]);\n const { upload_time: releaseTimestamp } = releases[0] || {};\n const isDeprecated = releases.some(({ yanked }) => yanked);\n const result: Release = {\n version,\n releaseTimestamp: asTimestamp(releaseTimestamp),\n };\n if (isDeprecated) {\n result.isDeprecated = isDeprecated;\n }\n // There may be multiple releases with different requires_python, so we return all in an array\n const pythonConstraints = releases\n .map(({ requires_python }) => requires_python)\n .filter(isString);\n result.constraints = {\n python: Array.from(new Set(pythonConstraints)),\n };\n return result;\n });\n }\n return dependency;\n }\n\n private static extractVersionFromLinkText(\n text: string,\n packageName: string,\n ): string | null {\n // source packages\n const lcText = text.toLowerCase();\n const normalizedSrcText = normalizePythonDepName(text);\n const srcPrefix = `${packageName}-`;\n\n // source distribution format: `{name}-{version}.tar.gz` (https://packaging.python.org/en/latest/specifications/source-distribution-format/#source-distribution-file-name)\n // binary distribution: `{distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl` (https://packaging.python.org/en/latest/specifications/binary-distribution-format/#file-name-convention)\n // officially both `name` and `distribution` should be normalized and then the - replaced with _, but in reality this is not the case\n // We therefore normalize the name we have (replacing `_-.` with -) and then check if the text starts with the normalized name\n\n if (!normalizedSrcText.startsWith(srcPrefix)) {\n return null;\n }\n\n // strip off the prefix using the prefix length as we may have normalized the srcPrefix/packageName\n // We assume that neither the version nor the suffix contains multiple `-` like `0.1.2---rc1.tar.gz`\n // and use the difference in length to strip off the prefix in case the name contains double `--` characters\n const normalizedLengthDiff = lcText.length - normalizedSrcText.length;\n const res = lcText.slice(srcPrefix.length + normalizedLengthDiff);\n\n // source distribution\n const srcSuffixes = ['.tar.gz', '.tar.bz2', '.tar.xz', '.zip', '.tgz'];\n const srcSuffix = srcSuffixes.find((suffix) => lcText.endsWith(suffix));\n if (srcSuffix) {\n // strip off the suffix using character length\n return res.slice(0, -srcSuffix.length);\n }\n\n // binary distribution\n // for binary distributions the version is the first part after the removed distribution name\n const wheelSuffix = '.whl';\n if (lcText.endsWith(wheelSuffix) && lcText.split('-').length > 2) {\n return res.split('-')[0];\n }\n return null;\n }\n\n private static cleanSimpleHtml(html: string): string {\n return (\n html\n .replace(regEx(/<\\/?pre>/), '')\n // Certain simple repositories like artifactory don't escape > and <\n .replace(\n regEx(/data-requires-python=\"([^\"]*?)>([^\"]*?)\"/g),\n 'data-requires-python=\"$1&gt;$2\"',\n )\n .replace(\n regEx(/data-requires-python=\"([^\"]*?)<([^\"]*?)\"/g),\n 'data-requires-python=\"$1&lt;$2\"',\n )\n );\n }\n\n private async getSimpleDependency(\n packageName: string,\n hostUrl: string,\n ): Promise<ReleaseResult | null> {\n const lookupUrl = new URL(\n ensureTrailingSlash(normalizePythonDepName(packageName)),\n hostUrl,\n ).href;\n const dependency: ReleaseResult = { releases: [] };\n const { headers, lookupUrl: sanitizedUrl } =\n await this.getAuthHeaders(lookupUrl);\n const response = await this.http.getText(sanitizedUrl, { headers });\n const dep = response?.body;\n if (!dep) {\n logger.trace({ dependency: packageName }, 'pip package not found');\n return null;\n }\n if (response.authorization) {\n dependency.isPrivate = true;\n }\n const root = parse(PypiDatasource.cleanSimpleHtml(dep));\n const links = root.querySelectorAll('a');\n const releases: Releases = {};\n for (const link of Array.from(links)) {\n const version = PypiDatasource.extractVersionFromLinkText(\n link.text?.trim(),\n packageName,\n );\n if (version) {\n const release: PypiRelease = {\n yanked: link.hasAttribute('data-yanked'),\n };\n const requiresPython = link.getAttribute('data-requires-python');\n if (requiresPython) {\n release.requires_python = requiresPython;\n }\n if (!releases[version]) {\n releases[version] = [];\n }\n releases[version].push(release);\n }\n }\n const versions = Object.keys(releases);\n dependency.releases = versions.map((version) => {\n const versionReleases = coerceArray(releases[version]);\n const isDeprecated = versionReleases.some(({ yanked }) => yanked);\n const result: Release = { version };\n if (isDeprecated) {\n result.isDeprecated = isDeprecated;\n }\n // There may be multiple releases with different requires_python, so we return all in an array\n result.constraints = {\n // TODO: string[] isn't allowed here\n python: versionReleases.map(\n ({ requires_python }) => requires_python,\n ) as any,\n };\n return result;\n });\n return dependency;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { z } from "zod/v4";
2
+ //#region lib/modules/datasource/pypi/schema.ts
3
+ const PypiRelease = z.object({
4
+ requires_python: z.string().nullish(),
5
+ upload_time: z.string().optional(),
6
+ yanked: z.boolean().optional()
7
+ });
8
+ const PypiResponse = z.object({
9
+ info: z.object({
10
+ name: z.string().optional(),
11
+ home_page: z.string().optional(),
12
+ project_urls: z.record(z.string(), z.string()).optional()
13
+ }).optional(),
14
+ releases: z.record(z.string(), z.array(PypiRelease)).optional()
15
+ });
16
+ //#endregion
17
+ export { PypiResponse };
18
+
19
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/pypi/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\n\nexport const PypiRelease = z.object({\n requires_python: z.string().nullish(),\n upload_time: z.string().optional(),\n yanked: z.boolean().optional(),\n});\n\nexport type PypiRelease = z.infer<typeof PypiRelease>;\n\nexport const PypiResponse = z.object({\n info: z\n .object({\n name: z.string().optional(),\n home_page: z.string().optional(),\n project_urls: z.record(z.string(), z.string()).optional(),\n })\n .optional(),\n releases: z.record(z.string(), z.array(PypiRelease)).optional(),\n});\n\nexport type PypiResponse = z.infer<typeof PypiResponse>;\n"],"mappings":";;AAEA,MAAa,cAAc,EAAE,OAAO;CAClC,iBAAiB,EAAE,OAAO,EAAE,QAAQ;CACpC,aAAa,EAAE,OAAO,EAAE,SAAS;CACjC,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAC/B,CAAC;AAID,MAAa,eAAe,EAAE,OAAO;CACnC,MAAM,EACH,OAAO;EACN,MAAM,EAAE,OAAO,EAAE,SAAS;EAC1B,WAAW,EAAE,OAAO,EAAE,SAAS;EAC/B,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;CAC1D,CAAC,EACA,SAAS;CACZ,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,WAAW,CAAC,EAAE,SAAS;AAChE,CAAC"}
@@ -27,7 +27,7 @@ declare const GithubVulnerabilityAlerts: z.ZodPipe<z.ZodType<{
27
27
  };
28
28
  security_vulnerability: {
29
29
  package: {
30
- ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "nuget" | "actions" | "pip";
30
+ ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "actions" | "nuget" | "pip";
31
31
  name: string;
32
32
  };
33
33
  severity: "low" | "medium" | "high" | "critical";
@@ -66,7 +66,7 @@ declare const GithubVulnerabilityAlerts: z.ZodPipe<z.ZodType<{
66
66
  };
67
67
  security_vulnerability: {
68
68
  package: {
69
- ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "nuget" | "actions" | "pip";
69
+ ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "actions" | "nuget" | "pip";
70
70
  name: string;
71
71
  };
72
72
  severity: "low" | "medium" | "high" | "critical";
@@ -105,7 +105,7 @@ declare const GithubVulnerabilityAlerts: z.ZodPipe<z.ZodType<{
105
105
  };
106
106
  security_vulnerability: {
107
107
  package: {
108
- ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "nuget" | "actions" | "pip";
108
+ ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "actions" | "nuget" | "pip";
109
109
  name: string;
110
110
  };
111
111
  severity: "low" | "medium" | "high" | "critical";
@@ -144,7 +144,7 @@ declare const GithubVulnerabilityAlerts: z.ZodPipe<z.ZodType<{
144
144
  };
145
145
  security_vulnerability: {
146
146
  package: {
147
- ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "nuget" | "actions" | "pip";
147
+ ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "rubygems" | "actions" | "nuget" | "pip";
148
148
  name: string;
149
149
  };
150
150
  severity: "low" | "medium" | "high" | "critical";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "43.210.1",
4
+ "version": "43.210.2",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -218,7 +218,7 @@
218
218
  "@ls-lint/ls-lint": "2.3.1",
219
219
  "@openpgp/web-stream-tools": "0.3.1",
220
220
  "@semantic-release/exec": "7.1.0",
221
- "@smithy/util-stream": "4.6.4",
221
+ "@smithy/util-stream": "4.6.5",
222
222
  "@types/adm-zip": "0.5.8",
223
223
  "@types/aws4": "1.11.6",
224
224
  "@types/breejs__later": "4.1.5",