renovate 44.86.0 → 44.87.1

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.
Files changed (47) hide show
  1. package/dist/config/options/index.js +1 -1
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/data/replacements.js +11 -0
  4. package/dist/global-config-option-defaults.generated.js +1 -1
  5. package/dist/global-config-option-defaults.generated.js.map +1 -1
  6. package/dist/modules/datasource/conan/index.js +2 -0
  7. package/dist/modules/datasource/conan/index.js.map +1 -1
  8. package/dist/modules/datasource/cpan/index.js +1 -0
  9. package/dist/modules/datasource/cpan/index.js.map +1 -1
  10. package/dist/modules/datasource/dart/index.js +1 -0
  11. package/dist/modules/datasource/dart/index.js.map +1 -1
  12. package/dist/modules/datasource/deb/index.js +3 -0
  13. package/dist/modules/datasource/deb/index.js.map +1 -1
  14. package/dist/modules/datasource/deno/index.js +1 -0
  15. package/dist/modules/datasource/deno/index.js.map +1 -1
  16. package/dist/modules/datasource/docker/dockerhub-cache.js +1 -0
  17. package/dist/modules/datasource/docker/dockerhub-cache.js.map +1 -1
  18. package/dist/modules/datasource/docker/index.js +5 -0
  19. package/dist/modules/datasource/docker/index.js.map +1 -1
  20. package/dist/modules/datasource/go/releases-goproxy.js +4 -2
  21. package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
  22. package/dist/modules/datasource/index.js +3 -0
  23. package/dist/modules/datasource/index.js.map +1 -1
  24. package/dist/modules/datasource/npm/npmrc.js.map +1 -1
  25. package/dist/modules/datasource/nuget/v3.js +1 -0
  26. package/dist/modules/datasource/nuget/v3.js.map +1 -1
  27. package/dist/modules/datasource/pod/index.js +1 -0
  28. package/dist/modules/datasource/pod/index.js.map +1 -1
  29. package/dist/modules/datasource/repology/index.js +1 -0
  30. package/dist/modules/datasource/repology/index.js.map +1 -1
  31. package/dist/modules/datasource/rubygems/metadata-cache.js +2 -0
  32. package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
  33. package/dist/modules/datasource/rubygems/versions-endpoint-cache.js +6 -1
  34. package/dist/modules/datasource/rubygems/versions-endpoint-cache.js.map +1 -1
  35. package/dist/modules/datasource/sbt-package/index.js +3 -0
  36. package/dist/modules/datasource/sbt-package/index.js.map +1 -1
  37. package/dist/modules/datasource/sbt-plugin/index.js +3 -0
  38. package/dist/modules/datasource/sbt-plugin/index.js.map +1 -1
  39. package/dist/workers/repository/process/lookup/filter.js +1 -1
  40. package/dist/workers/repository/process/lookup/filter.js.map +1 -1
  41. package/dist/workers/repository/process/lookup/generate.js +1 -7
  42. package/dist/workers/repository/process/lookup/generate.js.map +1 -1
  43. package/dist/workers/repository/process/lookup/index.js +2 -2
  44. package/dist/workers/repository/process/lookup/index.js.map +1 -1
  45. package/dist/workers/repository/process/lookup/rollback.js.map +1 -1
  46. package/package.json +1 -1
  47. package/renovate-schema.json +2 -2
@@ -65,6 +65,7 @@ var replacements_default = {
65
65
  "replacements:vso-task-lib-to-azure-pipelines-task-lib",
66
66
  "replacements:vsts-task-lib-to-azure-pipelines-task-lib",
67
67
  "replacements:wuchale-vite-plugin-to-wuchale",
68
+ "replacements:xlsx-to-scoped",
68
69
  "replacements:xmldom-to-scoped",
69
70
  "replacements:zap"
70
71
  ],
@@ -1198,6 +1199,16 @@ var replacements_default = {
1198
1199
  "replacementVersion": "0.22.0"
1199
1200
  }]
1200
1201
  },
1202
+ "xlsx-to-scoped": {
1203
+ "description": "The `xlsx` package is now published as `@e965/xlsx`.",
1204
+ "packageRules": [{
1205
+ "matchCurrentVersion": "0.18.5",
1206
+ "matchDatasources": ["npm"],
1207
+ "matchPackageNames": ["xlsx"],
1208
+ "replacementName": "@e965/xlsx",
1209
+ "replacementVersion": "0.20.3"
1210
+ }]
1211
+ },
1201
1212
  "xmldom-to-scoped": {
1202
1213
  "description": "The `xmldom` package is now published as `@xmldom/xmldom`.",
1203
1214
  "packageRules": [{
@@ -23,7 +23,7 @@ const globalConfigOptionDefaults = {
23
23
  "detectHostRulesFromEnv": false,
24
24
  "dockerChildPrefix": "renovate_",
25
25
  "dockerMaxPages": 20,
26
- "dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.97.12",
26
+ "dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.97.13",
27
27
  "dockerUser": "12021",
28
28
  "executionTimeout": 15,
29
29
  "exitCodeForErrors": false,
@@ -1 +1 @@
1
- {"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.97.12\",\n \"dockerUser\": \"12021\",\n \"executionTimeout\": 15,\n \"exitCodeForErrors\": false,\n \"exposeAllEnv\": false,\n \"forceCli\": true,\n \"forkCreation\": true,\n \"githubTokenWarn\": true,\n \"gitNoVerify\": [\n \"commit\",\n \"push\"\n ],\n \"gitTimeout\": 0,\n \"gitUrl\": \"default\",\n \"httpCacheTtlDays\": 90,\n \"ignorePrAuthor\": false,\n \"includeMirrors\": false,\n \"inheritConfig\": false,\n \"inheritConfigFileName\": \"org-inherited-config.json\",\n \"inheritConfigRepoName\": \"{{parentOrg}}/renovate-config\",\n \"inheritConfigStrict\": false,\n \"inheritConfigTrusted\": false,\n \"internalHostAccess\": \"warn\",\n \"mergeConfidenceDatasources\": [\n \"go\",\n \"maven\",\n \"npm\",\n \"nuget\",\n \"packagist\",\n \"pypi\",\n \"rubygems\"\n ],\n \"mergeConfidenceEndpoint\": \"https://developer.mend.io/\",\n \"migratePresets\": {},\n \"onboardingBranch\": \"renovate/configure\",\n \"onboardingConfig\": {\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\"\n },\n \"onboardingConfigFileName\": \"renovate.json\",\n \"onboardingNoDeps\": \"auto\",\n \"onboardingPrTitle\": \"Configure Renovate\",\n \"onboardingRebaseCheckbox\": false,\n \"optimizeForDisabled\": false,\n \"persistRepoData\": false,\n \"platform\": \"github\",\n \"prCacheSyncMaxPages\": 100,\n \"prCommitsPerRunLimit\": 0,\n \"presetCachePersistence\": false,\n \"processEnv\": {},\n \"productLinks\": {\n \"documentation\": \"https://docs.renovatebot.com/\",\n \"help\": \"https://github.com/renovatebot/renovate/discussions\",\n \"homepage\": \"https://github.com/renovatebot/renovate\"\n },\n \"rebaseAllOpenBranches\": false,\n \"reportFormatting\": false,\n \"repositoryCache\": \"disabled\",\n \"repositoryCacheForceLocal\": false,\n \"repositoryCacheType\": \"local\",\n \"requireConfig\": \"required\",\n \"s3PathStyle\": false,\n \"secrets\": {},\n \"unicodeEmoji\": true,\n \"useCloudMetadataServices\": true,\n \"userAgent\": \"Renovate/{{renovateVersion}} (https://github.com/renovatebot/renovate)\",\n \"variables\": {}\n};\n"],"mappings":";AACA,MAAa,6BAAsD;CACjE,8BAA8B;CAC9B,mBAAmB,CAAC;CACpB,cAAc,CAAC;CACf,kBAAkB,CAChB,KACF;CACA,2BAA2B,CAAC;CAC5B,gBAAgB;CAChB,gBAAgB;CAChB,4CAA4C;CAC5C,gBAAgB;CAChB,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,wBAAwB;CACxB,oBAAoB,CAAC;CACrB,mBAAmB,CAAC;CACpB,yBAAyB;CACzB,sBAAsB,CAAC;CACvB,8BAA8B;CAC9B,oBAAoB;CACpB,6BAA6B;CAC7B,0BAA0B;CAC1B,qBAAqB;CACrB,kBAAkB;CAClB,sBAAsB;CACtB,cAAc;CACd,oBAAoB;CACpB,qBAAqB;CACrB,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,eAAe,CACb,UACA,MACF;CACA,cAAc;CACd,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;CACvB,wBAAwB;CACxB,sBAAsB;CACtB,8BAA8B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,2BAA2B;CAC3B,kBAAkB,CAAC;CACnB,oBAAoB;CACpB,oBAAoB,EAClB,WAAW,oDACb;CACA,4BAA4B;CAC5B,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,uBAAuB;CACvB,mBAAmB;CACnB,YAAY;CACZ,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,cAAc,CAAC;CACf,gBAAgB;EACd,iBAAiB;EACjB,QAAQ;EACR,YAAY;CACd;CACA,yBAAyB;CACzB,oBAAoB;CACpB,mBAAmB;CACnB,6BAA6B;CAC7B,uBAAuB;CACvB,iBAAiB;CACjB,eAAe;CACf,WAAW,CAAC;CACZ,gBAAgB;CAChB,4BAA4B;CAC5B,aAAa;CACb,aAAa,CAAC;AAChB"}
1
+ {"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.97.13\",\n \"dockerUser\": \"12021\",\n \"executionTimeout\": 15,\n \"exitCodeForErrors\": false,\n \"exposeAllEnv\": false,\n \"forceCli\": true,\n \"forkCreation\": true,\n \"githubTokenWarn\": true,\n \"gitNoVerify\": [\n \"commit\",\n \"push\"\n ],\n \"gitTimeout\": 0,\n \"gitUrl\": \"default\",\n \"httpCacheTtlDays\": 90,\n \"ignorePrAuthor\": false,\n \"includeMirrors\": false,\n \"inheritConfig\": false,\n \"inheritConfigFileName\": \"org-inherited-config.json\",\n \"inheritConfigRepoName\": \"{{parentOrg}}/renovate-config\",\n \"inheritConfigStrict\": false,\n \"inheritConfigTrusted\": false,\n \"internalHostAccess\": \"warn\",\n \"mergeConfidenceDatasources\": [\n \"go\",\n \"maven\",\n \"npm\",\n \"nuget\",\n \"packagist\",\n \"pypi\",\n \"rubygems\"\n ],\n \"mergeConfidenceEndpoint\": \"https://developer.mend.io/\",\n \"migratePresets\": {},\n \"onboardingBranch\": \"renovate/configure\",\n \"onboardingConfig\": {\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\"\n },\n \"onboardingConfigFileName\": \"renovate.json\",\n \"onboardingNoDeps\": \"auto\",\n \"onboardingPrTitle\": \"Configure Renovate\",\n \"onboardingRebaseCheckbox\": false,\n \"optimizeForDisabled\": false,\n \"persistRepoData\": false,\n \"platform\": \"github\",\n \"prCacheSyncMaxPages\": 100,\n \"prCommitsPerRunLimit\": 0,\n \"presetCachePersistence\": false,\n \"processEnv\": {},\n \"productLinks\": {\n \"documentation\": \"https://docs.renovatebot.com/\",\n \"help\": \"https://github.com/renovatebot/renovate/discussions\",\n \"homepage\": \"https://github.com/renovatebot/renovate\"\n },\n \"rebaseAllOpenBranches\": false,\n \"reportFormatting\": false,\n \"repositoryCache\": \"disabled\",\n \"repositoryCacheForceLocal\": false,\n \"repositoryCacheType\": \"local\",\n \"requireConfig\": \"required\",\n \"s3PathStyle\": false,\n \"secrets\": {},\n \"unicodeEmoji\": true,\n \"useCloudMetadataServices\": true,\n \"userAgent\": \"Renovate/{{renovateVersion}} (https://github.com/renovatebot/renovate)\",\n \"variables\": {}\n};\n"],"mappings":";AACA,MAAa,6BAAsD;CACjE,8BAA8B;CAC9B,mBAAmB,CAAC;CACpB,cAAc,CAAC;CACf,kBAAkB,CAChB,KACF;CACA,2BAA2B,CAAC;CAC5B,gBAAgB;CAChB,gBAAgB;CAChB,4CAA4C;CAC5C,gBAAgB;CAChB,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,wBAAwB;CACxB,oBAAoB,CAAC;CACrB,mBAAmB,CAAC;CACpB,yBAAyB;CACzB,sBAAsB,CAAC;CACvB,8BAA8B;CAC9B,oBAAoB;CACpB,6BAA6B;CAC7B,0BAA0B;CAC1B,qBAAqB;CACrB,kBAAkB;CAClB,sBAAsB;CACtB,cAAc;CACd,oBAAoB;CACpB,qBAAqB;CACrB,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,eAAe,CACb,UACA,MACF;CACA,cAAc;CACd,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;CACvB,wBAAwB;CACxB,sBAAsB;CACtB,8BAA8B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,2BAA2B;CAC3B,kBAAkB,CAAC;CACnB,oBAAoB;CACpB,oBAAoB,EAClB,WAAW,oDACb;CACA,4BAA4B;CAC5B,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,uBAAuB;CACvB,mBAAmB;CACnB,YAAY;CACZ,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,cAAc,CAAC;CACf,gBAAgB;EACd,iBAAiB;EACjB,QAAQ;EACR,YAAY;CACd;CACA,yBAAyB;CACzB,oBAAoB;CACpB,mBAAmB;CACnB,6BAA6B;CAC7B,uBAAuB;CACvB,iBAAiB;CACjB,eAAe;CACf,WAAW,CAAC;CACZ,gBAAgB;CAChB,4BAA4B;CAC5B,aAAa;CACb,aAAa,CAAC;AAChB"}
@@ -57,6 +57,7 @@ var ConanDatasource = class ConanDatasource extends Datasource {
57
57
  packageName,
58
58
  registryUrl
59
59
  }, "Looking up conan api dependency");
60
+ // v8 ignore else -- the datasource layer always supplies a registry url
60
61
  if (registryUrl) {
61
62
  const url = ensureTrailingSlash(registryUrl);
62
63
  const lookupUrl = joinUrlParts(url, `v2/conans/search?q=${conanPackage.conanName}`);
@@ -82,6 +83,7 @@ var ConanDatasource = class ConanDatasource extends Datasource {
82
83
  const packageUrl = joinUrlParts(`${groups.host}/artifactory/api/storage/${groups.repo}`, `${user}/${conanPackage.conanName}/${latestVersion}/${channel}/${packageRev}/export/conanfile.py?properties=conan.package.url`);
83
84
  const { body: conanProperties } = await this.http.getJson(packageUrl, ConanProperties);
84
85
  const { sourceUrl } = conanProperties;
86
+ // v8 ignore else -- needs a full artifactory properties fixture
85
87
  if (sourceUrl) dep.sourceUrl = sourceUrl;
86
88
  }
87
89
  } catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["allVersioning.get"],"sources":["../../../../lib/modules/datasource/conan/index.ts"],"sourcesContent":["import { isString, isUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash, joinUrlParts } from '../../../util/url.ts';\nimport * as allVersioning from '../../versioning/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { isArtifactoryServer } from '../util.ts';\nimport { datasource, defaultRegistryUrl, getConanPackage } from './common.ts';\nimport {\n ConanCenterReleases,\n ConanJSON,\n ConanLatestRevision,\n ConanProperties,\n ConanRevisionJSON,\n} from './schema.ts';\n\nexport class ConanDatasource extends Datasource {\n static readonly id = datasource;\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n override readonly caching = true;\n\n override readonly registryStrategy = 'merge';\n\n githubHttp: GithubHttp;\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is supported only if the package is served from the Artifactory servers. In which case we determine it from the `properties[conan.package.url]` field in the results.';\n\n constructor(id = ConanDatasource.id) {\n super(id);\n this.githubHttp = new GithubHttp(id);\n }\n\n async getConanCenterReleases(\n conanName: string,\n userAndChannel: string,\n ): Promise<ReleaseResult | null> {\n if (userAndChannel && userAndChannel !== '@_/_') {\n logger.debug(\n { conanName, userAndChannel },\n 'User/channel not supported for Conan Center lookups',\n );\n return null;\n }\n const url = `https://api.github.com/repos/conan-io/conan-center-index/contents/recipes/${conanName}/config.yml`;\n const { body: result } = await this.githubHttp.getYaml(\n url,\n { headers: { accept: 'application/vnd.github.v3.raw' } },\n ConanCenterReleases,\n );\n return result;\n }\n\n private async _getDigest(\n { registryUrl, packageName }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n if (isUndefined(newValue) || isUndefined(registryUrl)) {\n return null;\n }\n const url = ensureTrailingSlash(registryUrl);\n const conanPackage = getConanPackage(packageName);\n const revisionLookUp = joinUrlParts(\n url,\n 'v2/conans/',\n conanPackage.conanName,\n newValue,\n conanPackage.userAndChannel,\n '/revisions',\n );\n const { body: digest } = await this.http.getJson(\n revisionLookUp,\n ConanLatestRevision,\n );\n return digest;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${datasource}`,\n // TODO: types (#22198)\n key: `getDigest:${config.registryUrl!}:${config.packageName}:${newValue!}`,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const conanPackage = getConanPackage(packageName);\n const userAndChannel = `@${conanPackage.userAndChannel}`;\n if (\n isString(registryUrl) &&\n ensureTrailingSlash(registryUrl) === defaultRegistryUrl\n ) {\n return this.getConanCenterReleases(\n conanPackage.conanName,\n userAndChannel,\n );\n }\n\n logger.trace(\n { packageName, registryUrl },\n 'Looking up conan api dependency',\n );\n\n if (registryUrl) {\n const url = ensureTrailingSlash(registryUrl);\n const lookupUrl = joinUrlParts(\n url,\n `v2/conans/search?q=${conanPackage.conanName}`,\n );\n\n try {\n const rep = await this.http.getJson(lookupUrl, ConanJSON);\n const conanJson = rep.body;\n if (conanJson) {\n logger.trace({ lookupUrl }, 'Got conan api result');\n const dep: ReleaseResult = { releases: [] };\n\n const conanJsonReleases: Release[] = conanJson\n .filter(({ userChannel }) => userChannel === userAndChannel)\n .map(({ version }) => ({ version }));\n dep.releases.push(...conanJsonReleases);\n\n try {\n if (isArtifactoryServer(rep)) {\n const conanApiRegexp = regEx(\n /(?<host>.*)\\/artifactory\\/api\\/conan\\/(?<repo>[^/]+)/,\n );\n const groups = conanApiRegexp.exec(url)?.groups;\n if (!groups) {\n return dep;\n }\n const semver = allVersioning.get('semver');\n\n const sortedReleases = dep.releases\n .filter((release) => semver.isVersion(release.version))\n .sort((a, b) => semver.sortVersions(a.version, b.version));\n\n const latestVersion = sortedReleases.at(-1)?.version;\n\n if (!latestVersion) {\n return dep;\n }\n logger.debug(\n `Conan package ${packageName} has latest version ${latestVersion}`,\n );\n\n const latestRevisionUrl = joinUrlParts(\n url,\n `v2/conans/${conanPackage.conanName}/${latestVersion}/${conanPackage.userAndChannel}/latest`,\n );\n const {\n body: { revision: packageRev },\n } = await this.http.getJson(latestRevisionUrl, ConanRevisionJSON);\n\n const [user, channel] = conanPackage.userAndChannel.split('/');\n const packageUrl = joinUrlParts(\n `${groups.host}/artifactory/api/storage/${groups.repo}`,\n `${user}/${conanPackage.conanName}/${latestVersion}/${channel}/${packageRev}/export/conanfile.py?properties=conan.package.url`,\n );\n const { body: conanProperties } = await this.http.getJson(\n packageUrl,\n ConanProperties,\n );\n const { sourceUrl } = conanProperties;\n if (sourceUrl) {\n dep.sourceUrl = sourceUrl;\n }\n }\n } catch (err) {\n logger.debug({ err }, \"Couldn't determine Conan package url\");\n }\n return dep;\n }\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n\n return null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${datasource}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["allVersioning.get"],"sources":["../../../../lib/modules/datasource/conan/index.ts"],"sourcesContent":["import { isString, isUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash, joinUrlParts } from '../../../util/url.ts';\nimport * as allVersioning from '../../versioning/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { isArtifactoryServer } from '../util.ts';\nimport { datasource, defaultRegistryUrl, getConanPackage } from './common.ts';\nimport {\n ConanCenterReleases,\n ConanJSON,\n ConanLatestRevision,\n ConanProperties,\n ConanRevisionJSON,\n} from './schema.ts';\n\nexport class ConanDatasource extends Datasource {\n static readonly id = datasource;\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n override readonly caching = true;\n\n override readonly registryStrategy = 'merge';\n\n githubHttp: GithubHttp;\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is supported only if the package is served from the Artifactory servers. In which case we determine it from the `properties[conan.package.url]` field in the results.';\n\n constructor(id = ConanDatasource.id) {\n super(id);\n this.githubHttp = new GithubHttp(id);\n }\n\n async getConanCenterReleases(\n conanName: string,\n userAndChannel: string,\n ): Promise<ReleaseResult | null> {\n if (userAndChannel && userAndChannel !== '@_/_') {\n logger.debug(\n { conanName, userAndChannel },\n 'User/channel not supported for Conan Center lookups',\n );\n return null;\n }\n const url = `https://api.github.com/repos/conan-io/conan-center-index/contents/recipes/${conanName}/config.yml`;\n const { body: result } = await this.githubHttp.getYaml(\n url,\n { headers: { accept: 'application/vnd.github.v3.raw' } },\n ConanCenterReleases,\n );\n return result;\n }\n\n private async _getDigest(\n { registryUrl, packageName }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n if (isUndefined(newValue) || isUndefined(registryUrl)) {\n return null;\n }\n const url = ensureTrailingSlash(registryUrl);\n const conanPackage = getConanPackage(packageName);\n const revisionLookUp = joinUrlParts(\n url,\n 'v2/conans/',\n conanPackage.conanName,\n newValue,\n conanPackage.userAndChannel,\n '/revisions',\n );\n const { body: digest } = await this.http.getJson(\n revisionLookUp,\n ConanLatestRevision,\n );\n return digest;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${datasource}`,\n // TODO: types (#22198)\n key: `getDigest:${config.registryUrl!}:${config.packageName}:${newValue!}`,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const conanPackage = getConanPackage(packageName);\n const userAndChannel = `@${conanPackage.userAndChannel}`;\n if (\n isString(registryUrl) &&\n ensureTrailingSlash(registryUrl) === defaultRegistryUrl\n ) {\n return this.getConanCenterReleases(\n conanPackage.conanName,\n userAndChannel,\n );\n }\n\n logger.trace(\n { packageName, registryUrl },\n 'Looking up conan api dependency',\n );\n\n // v8 ignore else -- the datasource layer always supplies a registry url\n if (registryUrl) {\n const url = ensureTrailingSlash(registryUrl);\n const lookupUrl = joinUrlParts(\n url,\n `v2/conans/search?q=${conanPackage.conanName}`,\n );\n\n try {\n const rep = await this.http.getJson(lookupUrl, ConanJSON);\n const conanJson = rep.body;\n if (conanJson) {\n logger.trace({ lookupUrl }, 'Got conan api result');\n const dep: ReleaseResult = { releases: [] };\n\n const conanJsonReleases: Release[] = conanJson\n .filter(({ userChannel }) => userChannel === userAndChannel)\n .map(({ version }) => ({ version }));\n dep.releases.push(...conanJsonReleases);\n\n try {\n if (isArtifactoryServer(rep)) {\n const conanApiRegexp = regEx(\n /(?<host>.*)\\/artifactory\\/api\\/conan\\/(?<repo>[^/]+)/,\n );\n const groups = conanApiRegexp.exec(url)?.groups;\n if (!groups) {\n return dep;\n }\n const semver = allVersioning.get('semver');\n\n const sortedReleases = dep.releases\n .filter((release) => semver.isVersion(release.version))\n .sort((a, b) => semver.sortVersions(a.version, b.version));\n\n const latestVersion = sortedReleases.at(-1)?.version;\n\n if (!latestVersion) {\n return dep;\n }\n logger.debug(\n `Conan package ${packageName} has latest version ${latestVersion}`,\n );\n\n const latestRevisionUrl = joinUrlParts(\n url,\n `v2/conans/${conanPackage.conanName}/${latestVersion}/${conanPackage.userAndChannel}/latest`,\n );\n const {\n body: { revision: packageRev },\n } = await this.http.getJson(latestRevisionUrl, ConanRevisionJSON);\n\n const [user, channel] = conanPackage.userAndChannel.split('/');\n const packageUrl = joinUrlParts(\n `${groups.host}/artifactory/api/storage/${groups.repo}`,\n `${user}/${conanPackage.conanName}/${latestVersion}/${channel}/${packageRev}/export/conanfile.py?properties=conan.package.url`,\n );\n const { body: conanProperties } = await this.http.getJson(\n packageUrl,\n ConanProperties,\n );\n const { sourceUrl } = conanProperties;\n // v8 ignore else -- needs a full artifactory properties fixture\n if (sourceUrl) {\n dep.sourceUrl = sourceUrl;\n }\n }\n } catch (err) {\n logger.debug({ err }, \"Couldn't determine Conan package url\");\n }\n return dep;\n }\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n\n return null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${datasource}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":"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"}
@@ -44,6 +44,7 @@ var CpanDatasource = class CpanDatasource extends Datasource {
44
44
  }
45
45
  let latestDistribution = null;
46
46
  let latestVersion = null;
47
+ // v8 ignore else -- unreachable
47
48
  if (releases) for (const release of releases) {
48
49
  latestDistribution ??= release.distribution;
49
50
  if (!latestVersion && release.isLatest) latestVersion = release.version;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["perlVersioning.id"],"sources":["../../../../lib/modules/datasource/cpan/index.ts"],"sourcesContent":["import { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as perlVersioning from '../../versioning/perl/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { MetaCpanApiFileSearchResponse } from './schema.ts';\nimport type { CpanRelease } from './types.ts';\n\nexport class CpanDatasource extends Datasource {\n static readonly id = 'cpan';\n\n constructor() {\n super(CpanDatasource.id);\n }\n\n override readonly customRegistrySupport = false;\n\n override readonly defaultRegistryUrls = ['https://fastapi.metacpan.org/'];\n\n override readonly defaultVersioning = perlVersioning.id;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n let result: ReleaseResult | null = null;\n const searchUrl = joinUrlParts(registryUrl, 'v1/file/_search');\n\n let releases: CpanRelease[] | null = null;\n try {\n const body = {\n query: {\n bool: {\n filter: [\n { term: { 'module.name': packageName } },\n { term: { 'module.authorized': true } },\n { exists: { field: 'module.associated_pod' } },\n ],\n },\n },\n _source: [\n 'module.name',\n 'module.version',\n 'distribution',\n 'date',\n 'deprecated',\n 'maturity',\n 'status',\n ],\n sort: [{ date: 'desc' }],\n };\n\n releases = (\n await this.http.postJson(\n searchUrl,\n { body },\n MetaCpanApiFileSearchResponse,\n )\n ).body;\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n let latestDistribution: string | null = null;\n let latestVersion: string | null = null;\n if (releases) {\n for (const release of releases) {\n latestDistribution ??= release.distribution;\n if (!latestVersion && release.isLatest) {\n latestVersion = release.version;\n }\n }\n }\n if (releases.length > 0 && latestDistribution) {\n result = {\n releases,\n changelogUrl: `https://metacpan.org/dist/${latestDistribution}/changes`,\n homepage: `https://metacpan.org/pod/${packageName}`,\n };\n\n if (latestVersion) {\n result.tags ??= {};\n result.tags.latest = latestVersion;\n }\n }\n\n return result;\n }\n\n override getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${CpanDatasource.id}`,\n key: `${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,+BAA+B;CAExE,oBAAsCA;CAEtC,0BAA4C;CAC5C,uBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,IAAI,SAA+B;EACnC,MAAM,YAAY,aAAa,aAAa,iBAAiB;EAE7D,IAAI,WAAiC;EACrC,IAAI;GACF,MAAM,OAAO;IACX,OAAO,EACL,MAAM,EACJ,QAAQ;KACN,EAAE,MAAM,EAAE,eAAe,YAAY,EAAE;KACvC,EAAE,MAAM,EAAE,qBAAqB,KAAK,EAAE;KACtC,EAAE,QAAQ,EAAE,OAAO,wBAAwB,EAAE;IAC/C,EACF,EACF;IACA,SAAS;KACP;KACA;KACA;KACA;KACA;KACA;KACA;IACF;IACA,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC;GACzB;GAEA,YACE,MAAM,KAAK,KAAK,SACd,WACA,EAAE,KAAK,GACP,6BACF,EAAA,CACA;EACJ,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;EAEA,IAAI,qBAAoC;EACxC,IAAI,gBAA+B;EACnC,IAAI,UACF,KAAK,MAAM,WAAW,UAAU;GAC9B,uBAAuB,QAAQ;GAC/B,IAAI,CAAC,iBAAiB,QAAQ,UAC5B,gBAAgB,QAAQ;EAE5B;EAEF,IAAI,SAAS,SAAS,KAAK,oBAAoB;GAC7C,SAAS;IACP;IACA,cAAc,6BAA6B,mBAAmB;IAC9D,UAAU,4BAA4B;GACxC;GAEA,IAAI,eAAe;IACjB,OAAO,SAAS,CAAC;IACjB,OAAO,KAAK,SAAS;GACvB;EACF;EAEA,OAAO;CACT;CAEA,YACE,QAC+B;EAC/B,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GACxC,KAAK,GAAG,OAAO;GACf,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["perlVersioning.id"],"sources":["../../../../lib/modules/datasource/cpan/index.ts"],"sourcesContent":["import { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as perlVersioning from '../../versioning/perl/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { MetaCpanApiFileSearchResponse } from './schema.ts';\nimport type { CpanRelease } from './types.ts';\n\nexport class CpanDatasource extends Datasource {\n static readonly id = 'cpan';\n\n constructor() {\n super(CpanDatasource.id);\n }\n\n override readonly customRegistrySupport = false;\n\n override readonly defaultRegistryUrls = ['https://fastapi.metacpan.org/'];\n\n override readonly defaultVersioning = perlVersioning.id;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n let result: ReleaseResult | null = null;\n const searchUrl = joinUrlParts(registryUrl, 'v1/file/_search');\n\n let releases: CpanRelease[] | null = null;\n try {\n const body = {\n query: {\n bool: {\n filter: [\n { term: { 'module.name': packageName } },\n { term: { 'module.authorized': true } },\n { exists: { field: 'module.associated_pod' } },\n ],\n },\n },\n _source: [\n 'module.name',\n 'module.version',\n 'distribution',\n 'date',\n 'deprecated',\n 'maturity',\n 'status',\n ],\n sort: [{ date: 'desc' }],\n };\n\n releases = (\n await this.http.postJson(\n searchUrl,\n { body },\n MetaCpanApiFileSearchResponse,\n )\n ).body;\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n let latestDistribution: string | null = null;\n let latestVersion: string | null = null;\n // `releases` is only still null if the request above threw, and\n // `handleGenericErrors()` always rethrows - the `releases.length` below\n // would dereference null if the else were ever taken\n // v8 ignore else -- unreachable\n if (releases) {\n for (const release of releases) {\n latestDistribution ??= release.distribution;\n if (!latestVersion && release.isLatest) {\n latestVersion = release.version;\n }\n }\n }\n if (releases.length > 0 && latestDistribution) {\n result = {\n releases,\n changelogUrl: `https://metacpan.org/dist/${latestDistribution}/changes`,\n homepage: `https://metacpan.org/pod/${packageName}`,\n };\n\n if (latestVersion) {\n result.tags ??= {};\n result.tags.latest = latestVersion;\n }\n }\n\n return result;\n }\n\n override getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${CpanDatasource.id}`,\n key: `${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,+BAA+B;CAExE,oBAAsCA;CAEtC,0BAA4C;CAC5C,uBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,IAAI,SAA+B;EACnC,MAAM,YAAY,aAAa,aAAa,iBAAiB;EAE7D,IAAI,WAAiC;EACrC,IAAI;GACF,MAAM,OAAO;IACX,OAAO,EACL,MAAM,EACJ,QAAQ;KACN,EAAE,MAAM,EAAE,eAAe,YAAY,EAAE;KACvC,EAAE,MAAM,EAAE,qBAAqB,KAAK,EAAE;KACtC,EAAE,QAAQ,EAAE,OAAO,wBAAwB,EAAE;IAC/C,EACF,EACF;IACA,SAAS;KACP;KACA;KACA;KACA;KACA;KACA;KACA;IACF;IACA,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC;GACzB;GAEA,YACE,MAAM,KAAK,KAAK,SACd,WACA,EAAE,KAAK,GACP,6BACF,EAAA,CACA;EACJ,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;EAEA,IAAI,qBAAoC;EACxC,IAAI,gBAA+B;;EAKnC,IAAI,UACF,KAAK,MAAM,WAAW,UAAU;GAC9B,uBAAuB,QAAQ;GAC/B,IAAI,CAAC,iBAAiB,QAAQ,UAC5B,gBAAgB,QAAQ;EAE5B;EAEF,IAAI,SAAS,SAAS,KAAK,oBAAoB;GAC7C,SAAS;IACP;IACA,cAAc,6BAA6B,mBAAmB;IAC9D,UAAU,4BAA4B;GACxC;GAEA,IAAI,eAAe;IACjB,OAAO,SAAS,CAAC;IACjB,OAAO,KAAK,SAAS;GACvB;EACF;EAEA,OAAO;CACT;CAEA,YACE,QAC+B;EAC/B,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GACxC,KAAK,GAAG,OAAO;GACf,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
@@ -28,6 +28,7 @@ var DartDatasource = class DartDatasource extends Datasource {
28
28
  } catch (err) {
29
29
  this.handleGenericErrors(err);
30
30
  }
31
+ // v8 ignore else -- unreachable
31
32
  if (body) {
32
33
  const { versions, latest } = body;
33
34
  const releases = versions?.filter(({ retracted }) => !retracted)?.map(({ version, published, pubspec }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/dart/index.ts"],"sourcesContent":["import { isEmptyObject, isNonEmptyString } from '@sindresorhus/is';\nimport type { ConstraintName } from '../../../util/exec/types.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { id as npmId } from '../../versioning/npm/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { DartResult } from './schema.ts';\n\nexport class DartDatasource extends Datasource {\n static readonly id = 'dart';\n\n constructor() {\n super(DartDatasource.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = ['https://pub.dartlang.org/'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field of the latest release object in the results.';\n override readonly defaultVersioning = npmId;\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n let result: ReleaseResult | null = null;\n const pkgUrl = `${ensureTrailingSlash(\n registryUrl,\n )}api/packages/${packageName}`;\n\n let body: DartResult | null = null;\n try {\n const raw = await this.http.getJson(pkgUrl, DartResult);\n body = raw.body;\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n if (body) {\n const { versions, latest } = body;\n const releases = versions\n ?.filter(({ retracted }) => !retracted)\n ?.map(({ version, published, pubspec }) => {\n const release: Release = {\n version,\n releaseTimestamp: asTimestamp(published),\n };\n\n const constraints: Partial<Record<ConstraintName, string[]>> = {};\n if (isNonEmptyString(pubspec?.environment?.sdk)) {\n constraints.dart = [pubspec.environment.sdk];\n }\n if (isNonEmptyString(pubspec?.environment?.flutter)) {\n constraints.flutter = [pubspec.environment.flutter];\n }\n if (!isEmptyObject(constraints)) {\n release.constraints = constraints;\n }\n\n return release;\n });\n if (releases && latest) {\n result = { releases };\n\n const pubspec = latest.pubspec;\n if (pubspec) {\n if (pubspec.homepage) {\n result.homepage = pubspec.homepage;\n }\n\n if (pubspec.repository) {\n result.sourceUrl = pubspec.repository;\n }\n }\n }\n }\n return result;\n }\n}\n"],"mappings":";;;;;;;AASA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,2BAA2B;CAEpE,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CACF,oBAAkB;CAElB,MAAM,YAAY,EAChB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAET,IAAI,SAA+B;EACnC,MAAM,SAAS,GAAG,oBAChB,WACF,EAAE,eAAe;EAEjB,IAAI,OAA0B;EAC9B,IAAI;GAEF,QAAO,MADW,KAAK,KAAK,QAAQ,QAAQ,UAAU,EAAA,CAC3C;EACb,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;EAEA,IAAI,MAAM;GACR,MAAM,EAAE,UAAU,WAAW;GAC7B,MAAM,WAAW,UACb,QAAQ,EAAE,gBAAgB,CAAC,SAAS,CAAC,EACrC,KAAK,EAAE,SAAS,WAAW,cAAc;IACzC,MAAM,UAAmB;KACvB;KACA,kBAAkB,YAAY,SAAS;IACzC;IAEA,MAAM,cAAyD,CAAC;IAChE,IAAI,iBAAiB,SAAS,aAAa,GAAG,GAC5C,YAAY,OAAO,CAAC,QAAQ,YAAY,GAAG;IAE7C,IAAI,iBAAiB,SAAS,aAAa,OAAO,GAChD,YAAY,UAAU,CAAC,QAAQ,YAAY,OAAO;IAEpD,IAAI,CAAC,cAAc,WAAW,GAC5B,QAAQ,cAAc;IAGxB,OAAO;GACT,CAAC;GACH,IAAI,YAAY,QAAQ;IACtB,SAAS,EAAE,SAAS;IAEpB,MAAM,UAAU,OAAO;IACvB,IAAI,SAAS;KACX,IAAI,QAAQ,UACV,OAAO,WAAW,QAAQ;KAG5B,IAAI,QAAQ,YACV,OAAO,YAAY,QAAQ;IAE/B;GACF;EACF;EACA,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/dart/index.ts"],"sourcesContent":["import { isEmptyObject, isNonEmptyString } from '@sindresorhus/is';\nimport type { ConstraintName } from '../../../util/exec/types.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { id as npmId } from '../../versioning/npm/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { DartResult } from './schema.ts';\n\nexport class DartDatasource extends Datasource {\n static readonly id = 'dart';\n\n constructor() {\n super(DartDatasource.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = ['https://pub.dartlang.org/'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field of the latest release object in the results.';\n override readonly defaultVersioning = npmId;\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n let result: ReleaseResult | null = null;\n const pkgUrl = `${ensureTrailingSlash(\n registryUrl,\n )}api/packages/${packageName}`;\n\n let body: DartResult | null = null;\n try {\n const raw = await this.http.getJson(pkgUrl, DartResult);\n body = raw.body;\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n // `body` is only still null if the request above threw, and\n // `handleGenericErrors()` always rethrows\n // v8 ignore else -- unreachable\n if (body) {\n const { versions, latest } = body;\n const releases = versions\n ?.filter(({ retracted }) => !retracted)\n ?.map(({ version, published, pubspec }) => {\n const release: Release = {\n version,\n releaseTimestamp: asTimestamp(published),\n };\n\n const constraints: Partial<Record<ConstraintName, string[]>> = {};\n if (isNonEmptyString(pubspec?.environment?.sdk)) {\n constraints.dart = [pubspec.environment.sdk];\n }\n if (isNonEmptyString(pubspec?.environment?.flutter)) {\n constraints.flutter = [pubspec.environment.flutter];\n }\n if (!isEmptyObject(constraints)) {\n release.constraints = constraints;\n }\n\n return release;\n });\n if (releases && latest) {\n result = { releases };\n\n const pubspec = latest.pubspec;\n if (pubspec) {\n if (pubspec.homepage) {\n result.homepage = pubspec.homepage;\n }\n\n if (pubspec.repository) {\n result.sourceUrl = pubspec.repository;\n }\n }\n }\n }\n return result;\n }\n}\n"],"mappings":";;;;;;;AASA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,2BAA2B;CAEpE,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CACF,oBAAkB;CAElB,MAAM,YAAY,EAChB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAET,IAAI,SAA+B;EACnC,MAAM,SAAS,GAAG,oBAChB,WACF,EAAE,eAAe;EAEjB,IAAI,OAA0B;EAC9B,IAAI;GAEF,QAAO,MADW,KAAK,KAAK,QAAQ,QAAQ,UAAU,EAAA,CAC3C;EACb,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;;EAKA,IAAI,MAAM;GACR,MAAM,EAAE,UAAU,WAAW;GAC7B,MAAM,WAAW,UACb,QAAQ,EAAE,gBAAgB,CAAC,SAAS,CAAC,EACrC,KAAK,EAAE,SAAS,WAAW,cAAc;IACzC,MAAM,UAAmB;KACvB;KACA,kBAAkB,YAAY,SAAS;IACzC;IAEA,MAAM,cAAyD,CAAC;IAChE,IAAI,iBAAiB,SAAS,aAAa,GAAG,GAC5C,YAAY,OAAO,CAAC,QAAQ,YAAY,GAAG;IAE7C,IAAI,iBAAiB,SAAS,aAAa,OAAO,GAChD,YAAY,UAAU,CAAC,QAAQ,YAAY,OAAO;IAEpD,IAAI,CAAC,cAAc,WAAW,GAC5B,QAAQ,cAAc;IAGxB,OAAO;GACT,CAAC;GACH,IAAI,YAAY,QAAQ;IACtB,SAAS,EAAE,SAAS;IAEpB,MAAM,UAAU,OAAO;IACvB,IAAI,SAAS;KACX,IAAI,QAAQ,UACV,OAAO,WAAW,QAAQ;KAG5B,IAAI,QAAQ,YACV,OAAO,YAAY,QAAQ;IAE/B;GACF;EACF;EACA,OAAO;CACT;AACF"}
@@ -55,6 +55,7 @@ var DebDatasource = class DebDatasource extends Datasource {
55
55
  let currentPackage = {};
56
56
  const allPackages = {};
57
57
  for await (const line of rl) if (line === "") {
58
+ // v8 ignore else -- needs a package index block missing a required key
58
59
  if (requiredPackageKeys.every((key) => key in currentPackage)) {
59
60
  if (!allPackages[currentPackage.Package]) allPackages[currentPackage.Package] = [];
60
61
  allPackages[currentPackage.Package].push(currentPackage);
@@ -65,6 +66,7 @@ var DebDatasource = class DebDatasource extends Datasource {
65
66
  break;
66
67
  }
67
68
  if (requiredPackageKeys.every((key) => key in currentPackage)) {
69
+ // v8 ignore else -- needs the final block to repeat an earlier package
68
70
  if (!allPackages[currentPackage.Package]) allPackages[currentPackage.Package] = [];
69
71
  allPackages[currentPackage.Package].push(currentPackage);
70
72
  }
@@ -104,6 +106,7 @@ var DebDatasource = class DebDatasource extends Datasource {
104
106
  const newRelease = formatReleaseResult(parsedPackages);
105
107
  if (aggregatedRelease === null) aggregatedRelease = newRelease;
106
108
  else {
109
+ // v8 ignore else -- needs two component indexes with matching meta
107
110
  if (!releaseMetaInformationMatches(aggregatedRelease, newRelease)) logger.warn({ packageName }, "Package occurred in more than one repository with different meta information. Aggregating releases anyway.");
108
111
  aggregatedRelease.releases.push(...newRelease.releases);
109
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["fs.createCacheReadStream"],"sources":["../../../../lib/modules/datasource/deb/index.ts"],"sourcesContent":["import readline from 'node:readline';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { packageKeys, requiredPackageKeys } from './common.ts';\nimport { downloadAndExtractPackage } from './packages.ts';\nimport {\n formatReleaseResult,\n releaseMetaInformationMatches,\n} from './release.ts';\nimport type { PackageDescription } from './types.ts';\nimport { constructComponentUrls } from './url.ts';\n\nexport class DebDatasource extends Datasource {\n static readonly id = 'deb';\n\n constructor() {\n super(DebDatasource.id);\n }\n\n /**\n * Users are able to specify custom Debian repositories as long as they follow\n * the Debian package repository format as specified here\n * @see{https://wiki.debian.org/DebianRepository/Format}\n */\n override readonly customRegistrySupport = true;\n\n /**\n * Users can specify multiple upstream repositories and the datasource will aggregate the release\n * @example\n * When specifying multiple dependencies both internal and external dependencies from internal/external artifactory\n */\n override readonly registryStrategy = 'merge';\n\n /**\n * The original apt source list file format is\n * deb uri distribution [component1] [component2] [...]\n * @see{https://wiki.debian.org/DebianRepository/Format}\n *\n * However, for Renovate, we require the registry URLs to be\n * valid URLs which is why the parameters are encoded in the URL.\n *\n * The following query parameters are required:\n * - components: comma separated list of components\n * - suite: stable, oldstable or other alias for a release, either this or release must be given like buster\n * - binaryArch: e.g. amd64 resolves to http://deb.debian.org/debian/dists/stable/non-free/binary-amd64/\n */\n override readonly defaultRegistryUrls = [\n 'https://deb.debian.org/debian?suite=stable&components=main,contrib,non-free&binaryArch=amd64',\n ];\n\n override readonly defaultVersioning = 'deb';\n\n /**\n * Parses the extracted package index file.\n *\n * @param extractedFile - The path to the extracted package file.\n * @param lastTimestamp - The timestamp of the last modification.\n * @returns a list of packages with minimal Metadata.\n */\n private async _parseExtractedPackageIndex(\n extractedFile: string,\n _lastTimestamp: Date,\n ): Promise<Record<string, PackageDescription[]>> {\n // read line by line to avoid high memory consumption as the extracted Packages\n // files can be multiple MBs in size\n const rl = readline.createInterface({\n input: fs.createCacheReadStream(extractedFile),\n terminal: false,\n });\n\n let currentPackage: PackageDescription = {};\n // A Package Index can contain multiple Versions of the package on private Artifactory (e.g. Jfrog)\n const allPackages: Record<string, PackageDescription[]> = {};\n\n for await (const line of rl) {\n if (line === '') {\n // All information of the package are available, add to the list of packages\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n currentPackage = {};\n }\n } else {\n for (const key of packageKeys) {\n if (line.startsWith(`${key}:`)) {\n currentPackage[key] = line.substring(key.length + 1).trim();\n break;\n }\n }\n }\n }\n\n // Check the last package after file reading is complete\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n }\n\n return allPackages;\n }\n\n parseExtractedPackageIndex(\n extractedFile: string,\n lastTimestamp: Date,\n ): Promise<Record<string, PackageDescription[]>> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: `${extractedFile}:${lastTimestamp.getTime()}`,\n ttlMinutes: 24 * 60,\n },\n () => this._parseExtractedPackageIndex(extractedFile, lastTimestamp),\n );\n }\n\n private async _getPackageIndex(\n componentUrl: string,\n ): Promise<Record<string, PackageDescription[]>> {\n const { extractedFile, lastTimestamp } = await downloadAndExtractPackage(\n componentUrl,\n this.http,\n );\n return await this.parseExtractedPackageIndex(extractedFile, lastTimestamp);\n }\n\n getPackageIndex(\n componentUrl: string,\n ): Promise<Record<string, PackageDescription[]>> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: componentUrl,\n },\n () => this._getPackageIndex(componentUrl),\n );\n }\n\n /**\n * Fetches the release information for a given package from the registry URL.\n *\n * @param config - Configuration for fetching releases.\n * @returns The release result if the package is found, otherwise null.\n */\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const componentUrls = constructComponentUrls(registryUrl);\n let aggregatedRelease: ReleaseResult | null = null;\n\n for (const componentUrl of componentUrls) {\n try {\n const packageIndex = await this.getPackageIndex(componentUrl);\n const parsedPackages = packageIndex[packageName];\n\n if (parsedPackages) {\n const newRelease = formatReleaseResult(parsedPackages);\n if (aggregatedRelease === null) {\n aggregatedRelease = newRelease;\n } else {\n if (!releaseMetaInformationMatches(aggregatedRelease, newRelease)) {\n logger.warn(\n { packageName },\n 'Package occurred in more than one repository with different meta information. Aggregating releases anyway.',\n );\n }\n aggregatedRelease.releases.push(...newRelease.releases);\n }\n }\n } catch (error) {\n logger.debug(\n { componentUrl, err: error },\n 'Skipping component due to an error',\n );\n }\n }\n\n return aggregatedRelease;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAeA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;;;;;;CAOA,wBAA0C;;;;;;CAO1C,mBAAqC;;;;;;;;;;;;;;CAerC,sBAAwC,CACtC,8FACF;CAEA,oBAAsC;;;;;;;;CAStC,MAAc,4BACZ,eACA,gBAC+C;EAG/C,MAAM,KAAK,SAAS,gBAAgB;GAClC,OAAOA,sBAAyB,aAAa;GAC7C,UAAU;EACZ,CAAC;EAED,IAAI,iBAAqC,CAAC;EAE1C,MAAM,cAAoD,CAAC;EAE3D,WAAW,MAAM,QAAQ,IACvB,IAAI,SAAS,IAEP;OAAA,oBAAoB,OAAO,QAAQ,OAAO,cAAc,GAAG;IAC7D,IAAI,CAAC,YAAY,eAAe,UAC9B,YAAY,eAAe,WAAY,CAAC;IAE1C,YAAY,eAAe,QAAS,CAAC,KAAK,cAAc;IACxD,iBAAiB,CAAC;GACpB;SAEA,KAAK,MAAM,OAAO,aAChB,IAAI,KAAK,WAAW,GAAG,IAAI,EAAE,GAAG;GAC9B,eAAe,OAAO,KAAK,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK;GAC1D;EACF;EAMN,IAAI,oBAAoB,OAAO,QAAQ,OAAO,cAAc,GAAG;GAC7D,IAAI,CAAC,YAAY,eAAe,UAC9B,YAAY,eAAe,WAAY,CAAC;GAE1C,YAAY,eAAe,QAAS,CAAC,KAAK,cAAc;EAC1D;EAEA,OAAO;CACT;CAEA,2BACE,eACA,eAC+C;EAC/C,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK,GAAG,cAAc,GAAG,cAAc,QAAQ;GAC/C,YAAY;EACd,SACM,KAAK,4BAA4B,eAAe,aAAa,CACrE;CACF;CAEA,MAAc,iBACZ,cAC+C;EAC/C,MAAM,EAAE,eAAe,kBAAkB,MAAM,0BAC7C,cACA,KAAK,IACP;EACA,OAAO,MAAM,KAAK,2BAA2B,eAAe,aAAa;CAC3E;CAEA,gBACE,cAC+C;EAC/C,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK;EACP,SACM,KAAK,iBAAiB,YAAY,CAC1C;CACF;;;;;;;CAQA,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,gBAAgB,uBAAuB,WAAW;EACxD,IAAI,oBAA0C;EAE9C,KAAK,MAAM,gBAAgB,eACzB,IAAI;GAEF,MAAM,kBAAiB,MADI,KAAK,gBAAgB,YAAY,EAAA,CACxB;GAEpC,IAAI,gBAAgB;IAClB,MAAM,aAAa,oBAAoB,cAAc;IACrD,IAAI,sBAAsB,MACxB,oBAAoB;SACf;KACL,IAAI,CAAC,8BAA8B,mBAAmB,UAAU,GAC9D,OAAO,KACL,EAAE,YAAY,GACd,4GACF;KAEF,kBAAkB,SAAS,KAAK,GAAG,WAAW,QAAQ;IACxD;GACF;EACF,SAAS,OAAO;GACd,OAAO,MACL;IAAE;IAAc,KAAK;GAAM,GAC3B,oCACF;EACF;EAGF,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["fs.createCacheReadStream"],"sources":["../../../../lib/modules/datasource/deb/index.ts"],"sourcesContent":["import readline from 'node:readline';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { packageKeys, requiredPackageKeys } from './common.ts';\nimport { downloadAndExtractPackage } from './packages.ts';\nimport {\n formatReleaseResult,\n releaseMetaInformationMatches,\n} from './release.ts';\nimport type { PackageDescription } from './types.ts';\nimport { constructComponentUrls } from './url.ts';\n\nexport class DebDatasource extends Datasource {\n static readonly id = 'deb';\n\n constructor() {\n super(DebDatasource.id);\n }\n\n /**\n * Users are able to specify custom Debian repositories as long as they follow\n * the Debian package repository format as specified here\n * @see{https://wiki.debian.org/DebianRepository/Format}\n */\n override readonly customRegistrySupport = true;\n\n /**\n * Users can specify multiple upstream repositories and the datasource will aggregate the release\n * @example\n * When specifying multiple dependencies both internal and external dependencies from internal/external artifactory\n */\n override readonly registryStrategy = 'merge';\n\n /**\n * The original apt source list file format is\n * deb uri distribution [component1] [component2] [...]\n * @see{https://wiki.debian.org/DebianRepository/Format}\n *\n * However, for Renovate, we require the registry URLs to be\n * valid URLs which is why the parameters are encoded in the URL.\n *\n * The following query parameters are required:\n * - components: comma separated list of components\n * - suite: stable, oldstable or other alias for a release, either this or release must be given like buster\n * - binaryArch: e.g. amd64 resolves to http://deb.debian.org/debian/dists/stable/non-free/binary-amd64/\n */\n override readonly defaultRegistryUrls = [\n 'https://deb.debian.org/debian?suite=stable&components=main,contrib,non-free&binaryArch=amd64',\n ];\n\n override readonly defaultVersioning = 'deb';\n\n /**\n * Parses the extracted package index file.\n *\n * @param extractedFile - The path to the extracted package file.\n * @param lastTimestamp - The timestamp of the last modification.\n * @returns a list of packages with minimal Metadata.\n */\n private async _parseExtractedPackageIndex(\n extractedFile: string,\n _lastTimestamp: Date,\n ): Promise<Record<string, PackageDescription[]>> {\n // read line by line to avoid high memory consumption as the extracted Packages\n // files can be multiple MBs in size\n const rl = readline.createInterface({\n input: fs.createCacheReadStream(extractedFile),\n terminal: false,\n });\n\n let currentPackage: PackageDescription = {};\n // A Package Index can contain multiple Versions of the package on private Artifactory (e.g. Jfrog)\n const allPackages: Record<string, PackageDescription[]> = {};\n\n for await (const line of rl) {\n if (line === '') {\n // All information of the package are available, add to the list of packages\n // v8 ignore else -- needs a package index block missing a required key\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n currentPackage = {};\n }\n } else {\n for (const key of packageKeys) {\n if (line.startsWith(`${key}:`)) {\n currentPackage[key] = line.substring(key.length + 1).trim();\n break;\n }\n }\n }\n }\n\n // Check the last package after file reading is complete\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n // v8 ignore else -- needs the final block to repeat an earlier package\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n }\n\n return allPackages;\n }\n\n parseExtractedPackageIndex(\n extractedFile: string,\n lastTimestamp: Date,\n ): Promise<Record<string, PackageDescription[]>> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: `${extractedFile}:${lastTimestamp.getTime()}`,\n ttlMinutes: 24 * 60,\n },\n () => this._parseExtractedPackageIndex(extractedFile, lastTimestamp),\n );\n }\n\n private async _getPackageIndex(\n componentUrl: string,\n ): Promise<Record<string, PackageDescription[]>> {\n const { extractedFile, lastTimestamp } = await downloadAndExtractPackage(\n componentUrl,\n this.http,\n );\n return await this.parseExtractedPackageIndex(extractedFile, lastTimestamp);\n }\n\n getPackageIndex(\n componentUrl: string,\n ): Promise<Record<string, PackageDescription[]>> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: componentUrl,\n },\n () => this._getPackageIndex(componentUrl),\n );\n }\n\n /**\n * Fetches the release information for a given package from the registry URL.\n *\n * @param config - Configuration for fetching releases.\n * @returns The release result if the package is found, otherwise null.\n */\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const componentUrls = constructComponentUrls(registryUrl);\n let aggregatedRelease: ReleaseResult | null = null;\n\n for (const componentUrl of componentUrls) {\n try {\n const packageIndex = await this.getPackageIndex(componentUrl);\n const parsedPackages = packageIndex[packageName];\n\n if (parsedPackages) {\n const newRelease = formatReleaseResult(parsedPackages);\n if (aggregatedRelease === null) {\n aggregatedRelease = newRelease;\n } else {\n // v8 ignore else -- needs two component indexes with matching meta\n if (!releaseMetaInformationMatches(aggregatedRelease, newRelease)) {\n logger.warn(\n { packageName },\n 'Package occurred in more than one repository with different meta information. Aggregating releases anyway.',\n );\n }\n aggregatedRelease.releases.push(...newRelease.releases);\n }\n }\n } catch (error) {\n logger.debug(\n { componentUrl, err: error },\n 'Skipping component due to an error',\n );\n }\n }\n\n return aggregatedRelease;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAeA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;;;;;;CAOA,wBAA0C;;;;;;CAO1C,mBAAqC;;;;;;;;;;;;;;CAerC,sBAAwC,CACtC,8FACF;CAEA,oBAAsC;;;;;;;;CAStC,MAAc,4BACZ,eACA,gBAC+C;EAG/C,MAAM,KAAK,SAAS,gBAAgB;GAClC,OAAOA,sBAAyB,aAAa;GAC7C,UAAU;EACZ,CAAC;EAED,IAAI,iBAAqC,CAAC;EAE1C,MAAM,cAAoD,CAAC;EAE3D,WAAW,MAAM,QAAQ,IACvB,IAAI,SAAS,IAGP;;OAAA,oBAAoB,OAAO,QAAQ,OAAO,cAAc,GAAG;IAC7D,IAAI,CAAC,YAAY,eAAe,UAC9B,YAAY,eAAe,WAAY,CAAC;IAE1C,YAAY,eAAe,QAAS,CAAC,KAAK,cAAc;IACxD,iBAAiB,CAAC;GACpB;SAEA,KAAK,MAAM,OAAO,aAChB,IAAI,KAAK,WAAW,GAAG,IAAI,EAAE,GAAG;GAC9B,eAAe,OAAO,KAAK,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK;GAC1D;EACF;EAMN,IAAI,oBAAoB,OAAO,QAAQ,OAAO,cAAc,GAAG;;GAE7D,IAAI,CAAC,YAAY,eAAe,UAC9B,YAAY,eAAe,WAAY,CAAC;GAE1C,YAAY,eAAe,QAAS,CAAC,KAAK,cAAc;EAC1D;EAEA,OAAO;CACT;CAEA,2BACE,eACA,eAC+C;EAC/C,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK,GAAG,cAAc,GAAG,cAAc,QAAQ;GAC/C,YAAY;EACd,SACM,KAAK,4BAA4B,eAAe,aAAa,CACrE;CACF;CAEA,MAAc,iBACZ,cAC+C;EAC/C,MAAM,EAAE,eAAe,kBAAkB,MAAM,0BAC7C,cACA,KAAK,IACP;EACA,OAAO,MAAM,KAAK,2BAA2B,eAAe,aAAa;CAC3E;CAEA,gBACE,cAC+C;EAC/C,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK;EACP,SACM,KAAK,iBAAiB,YAAY,CAC1C;CACF;;;;;;;CAQA,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,gBAAgB,uBAAuB,WAAW;EACxD,IAAI,oBAA0C;EAE9C,KAAK,MAAM,gBAAgB,eACzB,IAAI;GAEF,MAAM,kBAAiB,MADI,KAAK,gBAAgB,YAAY,EAAA,CACxB;GAEpC,IAAI,gBAAgB;IAClB,MAAM,aAAa,oBAAoB,cAAc;IACrD,IAAI,sBAAsB,MACxB,oBAAoB;SACf;;KAEL,IAAI,CAAC,8BAA8B,mBAAmB,UAAU,GAC9D,OAAO,KACL,EAAE,YAAY,GACd,4GACF;KAEF,kBAAkB,SAAS,KAAK,GAAG,WAAW,QAAQ;IACxD;GACF;EACF,SAAS,OAAO;GACd,OAAO,MACL;IAAE;IAAc,KAAK;GAAM,GAC3B,oCACF;EACF;EAGF,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
@@ -62,6 +62,7 @@ var DenoDatasource = class DenoDatasource extends Datasource {
62
62
  cacheModified = true;
63
63
  return release;
64
64
  }, { concurrency: 5 });
65
+ // v8 ignore else -- needs every release already present in the cache
65
66
  if (cacheModified) await set(`datasource-${DenoDatasource.id}`, detailsCacheKey, releasesCache, 10080);
66
67
  return {
67
68
  releases,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["semanticVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/deno/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as semanticVersioning from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { Release } from '../index.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n DenoAPIModuleResponse,\n DenoAPIModuleVersionResponse,\n} from './schema.ts';\n\nexport class DenoDatasource extends Datasource {\n static readonly id = 'deno';\n\n override readonly customRegistrySupport = true;\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = semanticVersioning.id;\n\n override readonly defaultRegistryUrls = ['https://apiland.deno.dev'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `uploaded_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(DenoDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const massagedRegistryUrl = registryUrl!;\n\n const extractResult = regEx(\n /^(?:https:\\/\\/deno.land\\/)(?<rawPackageName>[^@\\s]+)/,\n ).exec(packageName);\n const rawPackageName = extractResult?.groups?.rawPackageName;\n if (isNullOrUndefined(rawPackageName)) {\n logger.debug(\n `Could not extract rawPackageName from packageName: \"${packageName}\"`,\n );\n return null;\n }\n\n // remove third-party prefix if defined. The only internal library is `std` and is available under the same API\n const massagedPackageName = rawPackageName.replace('x/', '');\n\n // https://apiland.deno.dev/v2/modules/postgres\n const moduleAPIURL = joinUrlParts(\n massagedRegistryUrl,\n 'v2/modules',\n massagedPackageName,\n );\n\n return await this.getReleaseResult(moduleAPIURL);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getReleaseResult(\n moduleAPIURL: string,\n ): Promise<ReleaseResult> {\n const detailsCacheKey = `details:${moduleAPIURL}`;\n const releasesCache: Record<string, Release> = coerceObject(\n await packageCache.get(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n ),\n );\n let cacheModified = false;\n\n const {\n body: { versions, tags },\n } = await this.http.getJson(moduleAPIURL, DenoAPIModuleResponse);\n\n // get details for the versions\n const releases = await pMap(\n versions,\n async (version) => {\n const cacheRelease = releasesCache[version];\n /* v8 ignore next: hard to test */\n if (cacheRelease) {\n return cacheRelease;\n }\n\n // https://apiland.deno.dev/v2/modules/postgres/v0.17.0\n const url = joinUrlParts(moduleAPIURL, version);\n const { body: release } = await this.http.getJson(\n url,\n DenoAPIModuleVersionResponse.catch(({ error: err }) => {\n logger.warn(\n { err, version },\n 'Deno: failed to get version details',\n );\n return { version };\n }),\n );\n\n releasesCache[release.version] = release;\n cacheModified = true;\n\n return release;\n },\n { concurrency: 5 },\n );\n\n if (cacheModified) {\n // 1 week. Releases at Deno are immutable, therefore we can use a long term cache here.\n await packageCache.set(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n releasesCache,\n 10080,\n );\n }\n\n return { releases, tags };\n }\n\n getReleaseResult(moduleAPIURL: string): Promise<ReleaseResult> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n key: `getReleaseResult:${moduleAPIURL}`,\n },\n () => this._getReleaseResult(moduleAPIURL),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,wBAA0C;CAE1C,mBAAqC;CAErC,oBAAsCA;CAEtC,sBAAwC,CAAC,0BAA0B;CAEnE,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,sBAAsB;EAK5B,MAAM,iBAHgB,MACpB,sDACF,CAAC,CAAC,KAAK,WAC4B,CAAC,EAAE,QAAQ;EAC9C,IAAI,kBAAkB,cAAc,GAAG;GACrC,OAAO,MACL,uDAAuD,YAAY,EACrE;GACA,OAAO;EACT;EAGA,MAAM,sBAAsB,eAAe,QAAQ,MAAM,EAAE;EAG3D,MAAM,eAAe,aACnB,qBACA,cACA,mBACF;EAEA,OAAO,MAAM,KAAK,iBAAiB,YAAY;CACjD;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GAExC,KAAK,eAAe,OAAO,YAAY,GAAG,OAAO;GACjD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,kBACZ,cACwB;EACxB,MAAM,kBAAkB,WAAW;EACnC,MAAM,gBAAyC,aAC7C,MAAMC,IACJ,cAAc,eAAe,MAC7B,eACF,CACF;EACA,IAAI,gBAAgB;EAEpB,MAAM,EACJ,MAAM,EAAE,UAAU,WAChB,MAAM,KAAK,KAAK,QAAQ,cAAc,qBAAqB;EAG/D,MAAM,WAAW,MAAM,KACrB,UACA,OAAO,YAAY;GACjB,MAAM,eAAe,cAAc;;GAEnC,IAAI,cACF,OAAO;GAIT,MAAM,MAAM,aAAa,cAAc,OAAO;GAC9C,MAAM,EAAE,MAAM,YAAY,MAAM,KAAK,KAAK,QACxC,KACA,6BAA6B,OAAO,EAAE,OAAO,UAAU;IACrD,OAAO,KACL;KAAE;KAAK;IAAQ,GACf,qCACF;IACA,OAAO,EAAE,QAAQ;GACnB,CAAC,CACH;GAEA,cAAc,QAAQ,WAAW;GACjC,gBAAgB;GAEhB,OAAO;EACT,GACA,EAAE,aAAa,EAAE,CACnB;EAEA,IAAI,eAEF,MAAMC,IACJ,cAAc,eAAe,MAC7B,iBACA,eACA,KACF;EAGF,OAAO;GAAE;GAAU;EAAK;CAC1B;CAEA,iBAAiB,cAA8C;EAC7D,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GACxC,KAAK,oBAAoB;EAC3B,SACM,KAAK,kBAAkB,YAAY,CAC3C;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["semanticVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/deno/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as semanticVersioning from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { Release } from '../index.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n DenoAPIModuleResponse,\n DenoAPIModuleVersionResponse,\n} from './schema.ts';\n\nexport class DenoDatasource extends Datasource {\n static readonly id = 'deno';\n\n override readonly customRegistrySupport = true;\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = semanticVersioning.id;\n\n override readonly defaultRegistryUrls = ['https://apiland.deno.dev'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `uploaded_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(DenoDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const massagedRegistryUrl = registryUrl!;\n\n const extractResult = regEx(\n /^(?:https:\\/\\/deno.land\\/)(?<rawPackageName>[^@\\s]+)/,\n ).exec(packageName);\n const rawPackageName = extractResult?.groups?.rawPackageName;\n if (isNullOrUndefined(rawPackageName)) {\n logger.debug(\n `Could not extract rawPackageName from packageName: \"${packageName}\"`,\n );\n return null;\n }\n\n // remove third-party prefix if defined. The only internal library is `std` and is available under the same API\n const massagedPackageName = rawPackageName.replace('x/', '');\n\n // https://apiland.deno.dev/v2/modules/postgres\n const moduleAPIURL = joinUrlParts(\n massagedRegistryUrl,\n 'v2/modules',\n massagedPackageName,\n );\n\n return await this.getReleaseResult(moduleAPIURL);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getReleaseResult(\n moduleAPIURL: string,\n ): Promise<ReleaseResult> {\n const detailsCacheKey = `details:${moduleAPIURL}`;\n const releasesCache: Record<string, Release> = coerceObject(\n await packageCache.get(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n ),\n );\n let cacheModified = false;\n\n const {\n body: { versions, tags },\n } = await this.http.getJson(moduleAPIURL, DenoAPIModuleResponse);\n\n // get details for the versions\n const releases = await pMap(\n versions,\n async (version) => {\n const cacheRelease = releasesCache[version];\n /* v8 ignore next: hard to test */\n if (cacheRelease) {\n return cacheRelease;\n }\n\n // https://apiland.deno.dev/v2/modules/postgres/v0.17.0\n const url = joinUrlParts(moduleAPIURL, version);\n const { body: release } = await this.http.getJson(\n url,\n DenoAPIModuleVersionResponse.catch(({ error: err }) => {\n logger.warn(\n { err, version },\n 'Deno: failed to get version details',\n );\n return { version };\n }),\n );\n\n releasesCache[release.version] = release;\n cacheModified = true;\n\n return release;\n },\n { concurrency: 5 },\n );\n\n // v8 ignore else -- needs every release already present in the cache\n if (cacheModified) {\n // 1 week. Releases at Deno are immutable, therefore we can use a long term cache here.\n await packageCache.set(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n releasesCache,\n 10080,\n );\n }\n\n return { releases, tags };\n }\n\n getReleaseResult(moduleAPIURL: string): Promise<ReleaseResult> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n key: `getReleaseResult:${moduleAPIURL}`,\n },\n () => this._getReleaseResult(moduleAPIURL),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,wBAA0C;CAE1C,mBAAqC;CAErC,oBAAsCA;CAEtC,sBAAwC,CAAC,0BAA0B;CAEnE,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,sBAAsB;EAK5B,MAAM,iBAHgB,MACpB,sDACF,CAAC,CAAC,KAAK,WAC4B,CAAC,EAAE,QAAQ;EAC9C,IAAI,kBAAkB,cAAc,GAAG;GACrC,OAAO,MACL,uDAAuD,YAAY,EACrE;GACA,OAAO;EACT;EAGA,MAAM,sBAAsB,eAAe,QAAQ,MAAM,EAAE;EAG3D,MAAM,eAAe,aACnB,qBACA,cACA,mBACF;EAEA,OAAO,MAAM,KAAK,iBAAiB,YAAY;CACjD;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GAExC,KAAK,eAAe,OAAO,YAAY,GAAG,OAAO;GACjD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,kBACZ,cACwB;EACxB,MAAM,kBAAkB,WAAW;EACnC,MAAM,gBAAyC,aAC7C,MAAMC,IACJ,cAAc,eAAe,MAC7B,eACF,CACF;EACA,IAAI,gBAAgB;EAEpB,MAAM,EACJ,MAAM,EAAE,UAAU,WAChB,MAAM,KAAK,KAAK,QAAQ,cAAc,qBAAqB;EAG/D,MAAM,WAAW,MAAM,KACrB,UACA,OAAO,YAAY;GACjB,MAAM,eAAe,cAAc;;GAEnC,IAAI,cACF,OAAO;GAIT,MAAM,MAAM,aAAa,cAAc,OAAO;GAC9C,MAAM,EAAE,MAAM,YAAY,MAAM,KAAK,KAAK,QACxC,KACA,6BAA6B,OAAO,EAAE,OAAO,UAAU;IACrD,OAAO,KACL;KAAE;KAAK;IAAQ,GACf,qCACF;IACA,OAAO,EAAE,QAAQ;GACnB,CAAC,CACH;GAEA,cAAc,QAAQ,WAAW;GACjC,gBAAgB;GAEhB,OAAO;EACT,GACA,EAAE,aAAa,EAAE,CACnB;;EAGA,IAAI,eAEF,MAAMC,IACJ,cAAc,eAAe,MAC7B,iBACA,eACA,KACF;EAGF,OAAO;GAAE;GAAU;EAAK;CAC1B;CAEA,iBAAiB,cAA8C;EAC7D,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GACxC,KAAK,oBAAoB;EAC3B,SACM,KAAK,kBAAkB,YAAY,CAC3C;CACF;AACF"}
@@ -43,6 +43,7 @@ var DockerHubCache = class DockerHubCache {
43
43
  this.isChanged = true;
44
44
  }
45
45
  this.cache.updatedAt = updatedAt;
46
+ // v8 ignore else -- needs a cache populated across two sync runs
46
47
  if (earliestDate && latestDate) {
47
48
  for (const [key, item] of Object.entries(this.cache.items)) {
48
49
  const id = parseInt(key, 10);
@@ -1 +1 @@
1
- {"version":3,"file":"dockerhub-cache.js","names":["packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/docker/dockerhub-cache.ts"],"sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport type { DockerHubTag } from './schema.ts';\nimport type { DockerHubCacheData } from './types.ts';\n\nconst cacheNamespace = 'datasource-docker-hub-cache';\n\nexport class DockerHubCache {\n private isChanged = false;\n private reconciledIds = new Set<number>();\n private dockerRepository: string;\n private cache: DockerHubCacheData;\n\n private constructor(dockerRepository: string, cache: DockerHubCacheData) {\n this.dockerRepository = dockerRepository;\n this.cache = cache;\n }\n\n static async init(dockerRepository: string): Promise<DockerHubCache> {\n let repoCache = await packageCache.get<DockerHubCacheData>(\n cacheNamespace,\n dockerRepository,\n );\n\n repoCache ??= {\n items: {},\n updatedAt: null,\n };\n\n return new DockerHubCache(dockerRepository, repoCache);\n }\n\n reconcile(items: DockerHubTag[], expectedCount: number): boolean {\n let needNextPage = true;\n\n let earliestDate = null;\n\n let { updatedAt } = this.cache;\n let latestDate = updatedAt ? DateTime.fromISO(updatedAt) : null;\n\n for (const newItem of items) {\n const id = newItem.id;\n this.reconciledIds.add(id);\n\n const oldItem = this.cache.items[id];\n\n const itemDate = DateTime.fromISO(newItem.last_updated);\n\n if (!earliestDate || earliestDate > itemDate) {\n earliestDate = itemDate;\n }\n\n if (!latestDate || latestDate < itemDate) {\n latestDate = itemDate;\n updatedAt = newItem.last_updated;\n }\n\n if (dequal(oldItem, newItem)) {\n needNextPage = false;\n continue;\n }\n\n this.cache.items[newItem.id] = newItem;\n this.isChanged = true;\n }\n\n this.cache.updatedAt = updatedAt;\n\n if (earliestDate && latestDate) {\n for (const [key, item] of Object.entries(this.cache.items)) {\n const id = parseInt(key, 10);\n\n const itemDate = DateTime.fromISO(item.last_updated);\n\n if (\n itemDate < earliestDate ||\n itemDate > latestDate ||\n this.reconciledIds.has(id)\n ) {\n continue;\n }\n\n delete this.cache.items[id];\n this.isChanged = true;\n }\n\n if (Object.keys(this.cache.items).length > expectedCount) {\n return true;\n }\n }\n\n return needNextPage;\n }\n\n async save(): Promise<void> {\n if (this.isChanged) {\n await packageCache.set(\n cacheNamespace,\n this.dockerRepository,\n this.cache,\n 3 * 60 * 24 * 30,\n );\n }\n }\n\n getItems(): DockerHubTag[] {\n return Object.values(this.cache.items);\n }\n\n getDigestForTag(tagName: string): string | null {\n return (\n this.getItems().find((item) => item.name === tagName)?.digest ?? null\n );\n }\n\n getArchDigestForTag(tagName: string, architecture: string): string | null {\n const tag = this.getItems().find((item) => item.name === tagName);\n return (\n tag?.images.find((img) => img.architecture === architecture)?.digest ??\n null\n );\n }\n}\n"],"mappings":";;;;AAMA,MAAM,iBAAiB;AAEvB,IAAa,iBAAb,MAAa,eAAe;CAC1B,YAAoB;CACpB,gCAAwB,IAAI,IAAY;CACxC;CACA;CAEA,YAAoB,kBAA0B,OAA2B;EACvE,KAAK,mBAAmB;EACxB,KAAK,QAAQ;CACf;CAEA,aAAa,KAAK,kBAAmD;EACnE,IAAI,YAAY,MAAMA,IACpB,gBACA,gBACF;EAEA,cAAc;GACZ,OAAO,CAAC;GACR,WAAW;EACb;EAEA,OAAO,IAAI,eAAe,kBAAkB,SAAS;CACvD;CAEA,UAAU,OAAuB,eAAgC;EAC/D,IAAI,eAAe;EAEnB,IAAI,eAAe;EAEnB,IAAI,EAAE,cAAc,KAAK;EACzB,IAAI,aAAa,YAAY,SAAS,QAAQ,SAAS,IAAI;EAE3D,KAAK,MAAM,WAAW,OAAO;GAC3B,MAAM,KAAK,QAAQ;GACnB,KAAK,cAAc,IAAI,EAAE;GAEzB,MAAM,UAAU,KAAK,MAAM,MAAM;GAEjC,MAAM,WAAW,SAAS,QAAQ,QAAQ,YAAY;GAEtD,IAAI,CAAC,gBAAgB,eAAe,UAClC,eAAe;GAGjB,IAAI,CAAC,cAAc,aAAa,UAAU;IACxC,aAAa;IACb,YAAY,QAAQ;GACtB;GAEA,IAAI,OAAO,SAAS,OAAO,GAAG;IAC5B,eAAe;IACf;GACF;GAEA,KAAK,MAAM,MAAM,QAAQ,MAAM;GAC/B,KAAK,YAAY;EACnB;EAEA,KAAK,MAAM,YAAY;EAEvB,IAAI,gBAAgB,YAAY;GAC9B,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,MAAM,KAAK,GAAG;IAC1D,MAAM,KAAK,SAAS,KAAK,EAAE;IAE3B,MAAM,WAAW,SAAS,QAAQ,KAAK,YAAY;IAEnD,IACE,WAAW,gBACX,WAAW,cACX,KAAK,cAAc,IAAI,EAAE,GAEzB;IAGF,OAAO,KAAK,MAAM,MAAM;IACxB,KAAK,YAAY;GACnB;GAEA,IAAI,OAAO,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,SAAS,eACzC,OAAO;EAEX;EAEA,OAAO;CACT;CAEA,MAAM,OAAsB;EAC1B,IAAI,KAAK,WACP,MAAMC,IACJ,gBACA,KAAK,kBACL,KAAK,OACL,MACF;CAEJ;CAEA,WAA2B;EACzB,OAAO,OAAO,OAAO,KAAK,MAAM,KAAK;CACvC;CAEA,gBAAgB,SAAgC;EAC9C,OACE,KAAK,SAAS,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,OAAO,CAAC,EAAE,UAAU;CAErE;CAEA,oBAAoB,SAAiB,cAAqC;EAExE,OADY,KAAK,SAAS,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,OAErD,CAAC,EAAE,OAAO,MAAM,QAAQ,IAAI,iBAAiB,YAAY,CAAC,EAAE,UAC9D;CAEJ;AACF"}
1
+ {"version":3,"file":"dockerhub-cache.js","names":["packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/docker/dockerhub-cache.ts"],"sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport type { DockerHubTag } from './schema.ts';\nimport type { DockerHubCacheData } from './types.ts';\n\nconst cacheNamespace = 'datasource-docker-hub-cache';\n\nexport class DockerHubCache {\n private isChanged = false;\n private reconciledIds = new Set<number>();\n private dockerRepository: string;\n private cache: DockerHubCacheData;\n\n private constructor(dockerRepository: string, cache: DockerHubCacheData) {\n this.dockerRepository = dockerRepository;\n this.cache = cache;\n }\n\n static async init(dockerRepository: string): Promise<DockerHubCache> {\n let repoCache = await packageCache.get<DockerHubCacheData>(\n cacheNamespace,\n dockerRepository,\n );\n\n repoCache ??= {\n items: {},\n updatedAt: null,\n };\n\n return new DockerHubCache(dockerRepository, repoCache);\n }\n\n reconcile(items: DockerHubTag[], expectedCount: number): boolean {\n let needNextPage = true;\n\n let earliestDate = null;\n\n let { updatedAt } = this.cache;\n let latestDate = updatedAt ? DateTime.fromISO(updatedAt) : null;\n\n for (const newItem of items) {\n const id = newItem.id;\n this.reconciledIds.add(id);\n\n const oldItem = this.cache.items[id];\n\n const itemDate = DateTime.fromISO(newItem.last_updated);\n\n if (!earliestDate || earliestDate > itemDate) {\n earliestDate = itemDate;\n }\n\n if (!latestDate || latestDate < itemDate) {\n latestDate = itemDate;\n updatedAt = newItem.last_updated;\n }\n\n if (dequal(oldItem, newItem)) {\n needNextPage = false;\n continue;\n }\n\n this.cache.items[newItem.id] = newItem;\n this.isChanged = true;\n }\n\n this.cache.updatedAt = updatedAt;\n\n // v8 ignore else -- needs a cache populated across two sync runs\n if (earliestDate && latestDate) {\n for (const [key, item] of Object.entries(this.cache.items)) {\n const id = parseInt(key, 10);\n\n const itemDate = DateTime.fromISO(item.last_updated);\n\n if (\n itemDate < earliestDate ||\n itemDate > latestDate ||\n this.reconciledIds.has(id)\n ) {\n continue;\n }\n\n delete this.cache.items[id];\n this.isChanged = true;\n }\n\n if (Object.keys(this.cache.items).length > expectedCount) {\n return true;\n }\n }\n\n return needNextPage;\n }\n\n async save(): Promise<void> {\n if (this.isChanged) {\n await packageCache.set(\n cacheNamespace,\n this.dockerRepository,\n this.cache,\n 3 * 60 * 24 * 30,\n );\n }\n }\n\n getItems(): DockerHubTag[] {\n return Object.values(this.cache.items);\n }\n\n getDigestForTag(tagName: string): string | null {\n return (\n this.getItems().find((item) => item.name === tagName)?.digest ?? null\n );\n }\n\n getArchDigestForTag(tagName: string, architecture: string): string | null {\n const tag = this.getItems().find((item) => item.name === tagName);\n return (\n tag?.images.find((img) => img.architecture === architecture)?.digest ??\n null\n );\n }\n}\n"],"mappings":";;;;AAMA,MAAM,iBAAiB;AAEvB,IAAa,iBAAb,MAAa,eAAe;CAC1B,YAAoB;CACpB,gCAAwB,IAAI,IAAY;CACxC;CACA;CAEA,YAAoB,kBAA0B,OAA2B;EACvE,KAAK,mBAAmB;EACxB,KAAK,QAAQ;CACf;CAEA,aAAa,KAAK,kBAAmD;EACnE,IAAI,YAAY,MAAMA,IACpB,gBACA,gBACF;EAEA,cAAc;GACZ,OAAO,CAAC;GACR,WAAW;EACb;EAEA,OAAO,IAAI,eAAe,kBAAkB,SAAS;CACvD;CAEA,UAAU,OAAuB,eAAgC;EAC/D,IAAI,eAAe;EAEnB,IAAI,eAAe;EAEnB,IAAI,EAAE,cAAc,KAAK;EACzB,IAAI,aAAa,YAAY,SAAS,QAAQ,SAAS,IAAI;EAE3D,KAAK,MAAM,WAAW,OAAO;GAC3B,MAAM,KAAK,QAAQ;GACnB,KAAK,cAAc,IAAI,EAAE;GAEzB,MAAM,UAAU,KAAK,MAAM,MAAM;GAEjC,MAAM,WAAW,SAAS,QAAQ,QAAQ,YAAY;GAEtD,IAAI,CAAC,gBAAgB,eAAe,UAClC,eAAe;GAGjB,IAAI,CAAC,cAAc,aAAa,UAAU;IACxC,aAAa;IACb,YAAY,QAAQ;GACtB;GAEA,IAAI,OAAO,SAAS,OAAO,GAAG;IAC5B,eAAe;IACf;GACF;GAEA,KAAK,MAAM,MAAM,QAAQ,MAAM;GAC/B,KAAK,YAAY;EACnB;EAEA,KAAK,MAAM,YAAY;;EAGvB,IAAI,gBAAgB,YAAY;GAC9B,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,MAAM,KAAK,GAAG;IAC1D,MAAM,KAAK,SAAS,KAAK,EAAE;IAE3B,MAAM,WAAW,SAAS,QAAQ,KAAK,YAAY;IAEnD,IACE,WAAW,gBACX,WAAW,cACX,KAAK,cAAc,IAAI,EAAE,GAEzB;IAGF,OAAO,KAAK,MAAM,MAAM;IACxB,KAAK,YAAY;GACnB;GAEA,IAAI,OAAO,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,SAAS,eACzC,OAAO;EAEX;EAEA,OAAO;CACT;CAEA,MAAM,OAAsB;EAC1B,IAAI,KAAK,WACP,MAAMC,IACJ,gBACA,KAAK,kBACL,KAAK,OACL,MACF;CAEJ;CAEA,WAA2B;EACzB,OAAO,OAAO,OAAO,KAAK,MAAM,KAAK;CACvC;CAEA,gBAAgB,SAAgC;EAC9C,OACE,KAAK,SAAS,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,OAAO,CAAC,EAAE,UAAU;CAErE;CAEA,oBAAoB,SAAiB,cAAqC;EAExE,OADY,KAAK,SAAS,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,OAErD,CAAC,EAAE,OAAO,MAAM,QAAQ,IAAI,iBAAiB,YAAY,CAAC,EAAE,UAC9D;CAEJ;AACF"}
@@ -204,6 +204,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
204
204
  manifestResponse = await this.getManifestResponse(registryHost, dockerRepository, currentDigest, "head");
205
205
  } catch (_err) {
206
206
  const err = _err instanceof ExternalHostError ? _err.err : /* istanbul ignore next: can never happen */ _err;
207
+ // v8 ignore else -- needs a non-5xx failure from the manifest request
207
208
  if (typeof err.statusCode === "number" && err.statusCode >= 500 && err.statusCode < 600) return null;
208
209
  /* istanbul ignore next */
209
210
  throw _err;
@@ -212,6 +213,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
212
213
  const configDigest = await this.getConfigDigest(registryHost, dockerRepository, currentDigest);
213
214
  if (!configDigest) return null;
214
215
  const configResponse = await this.getImageConfig(registryHost, dockerRepository, configDigest);
216
+ // v8 ignore else -- needs a config blob with neither key
215
217
  if (configResponse && ("config" in configResponse.body || "architecture" in configResponse.body)) {
216
218
  const architecture = configResponse.body.architecture ?? null;
217
219
  logger.debug(`Current digest ${currentDigest} relates to architecture ${architecture ?? "null"}`);
@@ -271,8 +273,10 @@ var DockerDatasource = class DockerDatasource extends Datasource {
271
273
  case "application/vnd.cncf.helm.config.v1+json": {
272
274
  if (labels["org.opencontainers.image.source"]) return labels;
273
275
  const configResponse = await this.getHelmConfig(registryHost, dockerRepository, manifest.config.digest);
276
+ // v8 ignore else -- needs the helm config blob request to come back empty
274
277
  if (configResponse) {
275
278
  const url = findHelmSourceUrl(configResponse.body);
279
+ // v8 ignore else -- needs a helm chart with no source url
276
280
  if (url) labels[sourceLabel] = url;
277
281
  }
278
282
  break;
@@ -295,6 +299,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
295
299
  break;
296
300
  }
297
301
  }
302
+ // v8 ignore else -- labels are always set by the branches above
298
303
  if (labels) logger.debug({ labels }, "found labels in manifest");
299
304
  return labels;
300
305
  } catch (err) /* istanbul ignore next: should be tested in future */ {