renovate 44.107.2 → 44.107.3

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 (70) hide show
  1. package/dist/modules/datasource/artifactory/index.js +3 -5
  2. package/dist/modules/datasource/artifactory/index.js.map +1 -1
  3. package/dist/modules/datasource/aws-eks-addon/index.js +3 -5
  4. package/dist/modules/datasource/aws-eks-addon/index.js.map +1 -1
  5. package/dist/modules/datasource/aws-machine-image/index.js +8 -14
  6. package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
  7. package/dist/modules/datasource/aws-rds/index.js +3 -5
  8. package/dist/modules/datasource/aws-rds/index.js.map +1 -1
  9. package/dist/modules/datasource/azure-bicep-resource/index.js +6 -9
  10. package/dist/modules/datasource/azure-bicep-resource/index.js.map +1 -1
  11. package/dist/modules/datasource/bazel/index.js +3 -5
  12. package/dist/modules/datasource/bazel/index.js.map +1 -1
  13. package/dist/modules/datasource/bitbucket-server-tags/index.js +2 -2
  14. package/dist/modules/datasource/bitbucket-server-tags/index.js.map +1 -1
  15. package/dist/modules/datasource/bitbucket-tags/index.js +5 -6
  16. package/dist/modules/datasource/bitbucket-tags/index.js.map +1 -1
  17. package/dist/modules/datasource/bitrise/index.js +3 -5
  18. package/dist/modules/datasource/bitrise/index.js.map +1 -1
  19. package/dist/modules/datasource/conan/index.js +6 -9
  20. package/dist/modules/datasource/conan/index.js.map +1 -1
  21. package/dist/modules/datasource/conda/index.js +3 -5
  22. package/dist/modules/datasource/conda/index.js.map +1 -1
  23. package/dist/modules/datasource/datasource.js +20 -0
  24. package/dist/modules/datasource/datasource.js.map +1 -1
  25. package/dist/modules/datasource/deb/index.js +8 -14
  26. package/dist/modules/datasource/deb/index.js.map +1 -1
  27. package/dist/modules/datasource/dotnet-version/index.js +6 -9
  28. package/dist/modules/datasource/dotnet-version/index.js.map +1 -1
  29. package/dist/modules/datasource/endoflife-date/index.js +3 -5
  30. package/dist/modules/datasource/endoflife-date/index.js.map +1 -1
  31. package/dist/modules/datasource/galaxy-collection/index.js +6 -9
  32. package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
  33. package/dist/modules/datasource/gitea-tags/base.js.map +1 -1
  34. package/dist/modules/datasource/github-digest/index.js +2 -10
  35. package/dist/modules/datasource/github-digest/index.js.map +1 -1
  36. package/dist/modules/datasource/gitlab-packages/index.js +3 -5
  37. package/dist/modules/datasource/gitlab-packages/index.js.map +1 -1
  38. package/dist/modules/datasource/gitlab-releases/index.js +0 -1
  39. package/dist/modules/datasource/gitlab-releases/index.js.map +1 -1
  40. package/dist/modules/datasource/gitlab-tags/index.js +6 -9
  41. package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
  42. package/dist/modules/datasource/golang-version/index.js +4 -6
  43. package/dist/modules/datasource/golang-version/index.js.map +1 -1
  44. package/dist/modules/datasource/hexpm-bob/index.js +3 -5
  45. package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
  46. package/dist/modules/datasource/java-version/index.js +3 -5
  47. package/dist/modules/datasource/java-version/index.js.map +1 -1
  48. package/dist/modules/datasource/nextcloud/index.js +3 -5
  49. package/dist/modules/datasource/nextcloud/index.js.map +1 -1
  50. package/dist/modules/datasource/node-version/index.js +3 -5
  51. package/dist/modules/datasource/node-version/index.js.map +1 -1
  52. package/dist/modules/datasource/python-version/index.js +3 -5
  53. package/dist/modules/datasource/python-version/index.js.map +1 -1
  54. package/dist/modules/datasource/rpm/index.js +4 -7
  55. package/dist/modules/datasource/rpm/index.js.map +1 -1
  56. package/dist/modules/datasource/ruby-version/index.js +3 -5
  57. package/dist/modules/datasource/ruby-version/index.js.map +1 -1
  58. package/dist/modules/datasource/rubygems/index.js +3 -5
  59. package/dist/modules/datasource/rubygems/index.js.map +1 -1
  60. package/dist/modules/datasource/rust-version/index.js +3 -5
  61. package/dist/modules/datasource/rust-version/index.js.map +1 -1
  62. package/dist/modules/datasource/terraform-module/index.js +3 -5
  63. package/dist/modules/datasource/terraform-module/index.js.map +1 -1
  64. package/dist/modules/datasource/terraform-provider/index.js +13 -27
  65. package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
  66. package/dist/modules/datasource/unity3d/index.js +3 -5
  67. package/dist/modules/datasource/unity3d/index.js.map +1 -1
  68. package/dist/util/cache/package/with-cache.js.map +1 -1
  69. package/package.json +1 -1
  70. package/renovate-schema.json +2 -2
@@ -1,7 +1,6 @@
1
1
  import { regEx } from "../../../util/regex.js";
2
2
  import { logger } from "../../../logger/index.js";
3
3
  import { joinUrlParts } from "../../../util/url.js";
4
- import { withCache } from "../../../util/cache/package/with-cache.js";
5
4
  import { RequestError } from "../../../util/http/got.js";
6
5
  import "../../../util/http/index.js";
7
6
  import { asTimestamp } from "../../../util/timestamp.js";
@@ -19,7 +18,7 @@ var ArtifactoryDatasource = class extends Datasource {
19
18
  registryStrategy = "merge";
20
19
  releaseTimestampSupport = true;
21
20
  releaseTimestampNote = "The release timestamp is determined from the date-like text, next to the version hyperlink tag in the results.";
22
- async _getReleases({ packageName, registryUrl }) {
21
+ async fetchReleases({ packageName, registryUrl }) {
23
22
  if (!registryUrl) {
24
23
  logger.warn({ packageName }, "artifactory datasource requires custom registryUrl. Skipping datasource");
25
24
  return null;
@@ -61,11 +60,10 @@ var ArtifactoryDatasource = class extends Datasource {
61
60
  return result.releases.length ? result : null;
62
61
  }
63
62
  getReleases(config) {
64
- return withCache({
65
- namespace: `datasource-${datasource}`,
63
+ return this.cached({
66
64
  key: `${config.registryUrl}:${config.packageName}`,
67
65
  fallback: true
68
- }, () => this._getReleases(config));
66
+ }, () => this.fetchReleases(config));
69
67
  }
70
68
  };
71
69
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["HttpError"],"sources":["../../../../lib/modules/datasource/artifactory/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { parse } from '../../../util/html.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { datasource } from './common.ts';\n\nexport class ArtifactoryDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly caching = true;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the date-like text, next to the version hyperlink tag in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n if (!registryUrl) {\n logger.warn(\n { packageName },\n 'artifactory datasource requires custom registryUrl. Skipping datasource',\n );\n return null;\n }\n\n const url = joinUrlParts(registryUrl, packageName);\n\n const result: ReleaseResult = {\n releases: [],\n };\n try {\n const response = await this.http.getText(url);\n const body = parse(response.body, {\n blockTextElements: {\n script: true,\n noscript: true,\n style: true,\n },\n });\n const nodes = body.querySelectorAll('a');\n\n nodes\n .filter(\n // filter out hyperlink to navigate to parent folder\n (node) => node.innerHTML !== '../' && node.innerHTML !== '..',\n )\n .forEach(\n // extract version and published time for each node\n (node) => {\n const version: string = node.innerHTML.endsWith('/')\n ? node.innerHTML.slice(0, -1)\n : node.innerHTML;\n\n const releaseTimestamp = asTimestamp(\n node.nextSibling?.text?.trimStart()?.split(regEx(/\\s{2,}/))?.[0],\n );\n\n const thisRelease: Release = {\n version,\n releaseTimestamp,\n };\n\n result.releases.push(thisRelease);\n },\n );\n\n if (result.releases.length) {\n logger.trace(\n { registryUrl, packageName, versions: result.releases.length },\n 'artifactory: Found versions',\n );\n } else {\n logger.trace(\n { registryUrl, packageName },\n 'artifactory: No versions found',\n );\n }\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n logger.warn(\n { registryUrl, packageName },\n 'artifactory: `Not Found` error',\n );\n return null;\n }\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 key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,wBAAb,cAA2C,WAAW;CACpD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,wBAA0C;CAE1C,UAA4B;CAE5B,mBAAqC;CAErC,0BAA4C;CAC5C,uBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,IAAI,CAAC,aAAa;GAChB,OAAO,KACL,EAAE,YAAY,GACd,yEACF;GACA,OAAO;EACT;EAEA,MAAM,MAAM,aAAa,aAAa,WAAW;EAEjD,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EACA,IAAI;GACF,MAAM,WAAW,MAAM,KAAK,KAAK,QAAQ,GAAG;GAU5C,MATmB,SAAS,MAAM,EAChC,mBAAmB;IACjB,QAAQ;IACR,UAAU;IACV,OAAO;GACT,EACF,CACiB,CAAC,CAAC,iBAAiB,GAEhC,CAAC,CACF,QAEE,SAAS,KAAK,cAAc,SAAS,KAAK,cAAc,IAC3D,CAAC,CACA,SAEE,SAAS;IASR,MAAM,cAAuB;KAC3B,SATsB,KAAK,UAAU,SAAS,GAAG,IAC/C,KAAK,UAAU,MAAM,GAAG,EAAE,IAC1B,KAAK;KAQP,kBANuB,YACvB,KAAK,aAAa,MAAM,UAAU,CAAC,EAAE,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,EAK/C;IACjB;IAEA,OAAO,SAAS,KAAK,WAAW;GAClC,CACF;GAEF,IAAI,OAAO,SAAS,QAClB,OAAO,MACL;IAAE;IAAa;IAAa,UAAU,OAAO,SAAS;GAAO,GAC7D,6BACF;QAEA,OAAO,MACL;IAAE;IAAa;GAAY,GAC3B,gCACF;EAEJ,SAAS,KAAK;GACZ,IAAI,eAAeA,gBAAa,IAAI,UAAU,eAAe,KAAK;IAChE,OAAO,KACL;KAAE;KAAa;IAAY,GAC3B,gCACF;IACA,OAAO;GACT;GACA,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc;GACzB,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["HttpError"],"sources":["../../../../lib/modules/datasource/artifactory/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { parse } from '../../../util/html.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { datasource } from './common.ts';\n\nexport class ArtifactoryDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly caching = true;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the date-like text, next to the version hyperlink tag in the results.';\n\n private async fetchReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n if (!registryUrl) {\n logger.warn(\n { packageName },\n 'artifactory datasource requires custom registryUrl. Skipping datasource',\n );\n return null;\n }\n\n const url = joinUrlParts(registryUrl, packageName);\n\n const result: ReleaseResult = {\n releases: [],\n };\n try {\n const response = await this.http.getText(url);\n const body = parse(response.body, {\n blockTextElements: {\n script: true,\n noscript: true,\n style: true,\n },\n });\n const nodes = body.querySelectorAll('a');\n\n nodes\n .filter(\n // filter out hyperlink to navigate to parent folder\n (node) => node.innerHTML !== '../' && node.innerHTML !== '..',\n )\n .forEach(\n // extract version and published time for each node\n (node) => {\n const version: string = node.innerHTML.endsWith('/')\n ? node.innerHTML.slice(0, -1)\n : node.innerHTML;\n\n const releaseTimestamp = asTimestamp(\n node.nextSibling?.text?.trimStart()?.split(regEx(/\\s{2,}/))?.[0],\n );\n\n const thisRelease: Release = {\n version,\n releaseTimestamp,\n };\n\n result.releases.push(thisRelease);\n },\n );\n\n if (result.releases.length) {\n logger.trace(\n { registryUrl, packageName, versions: result.releases.length },\n 'artifactory: Found versions',\n );\n } else {\n logger.trace(\n { registryUrl, packageName },\n 'artifactory: No versions found',\n );\n }\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n logger.warn(\n { registryUrl, packageName },\n 'artifactory: `Not Found` error',\n );\n return null;\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAa,wBAAb,cAA2C,WAAW;CACpD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,wBAA0C;CAE1C,UAA4B;CAE5B,mBAAqC;CAErC,0BAA4C;CAC5C,uBACE;CAEF,MAAc,cAAc,EAC1B,aACA,eACmD;EACnD,IAAI,CAAC,aAAa;GAChB,OAAO,KACL,EAAE,YAAY,GACd,yEACF;GACA,OAAO;EACT;EAEA,MAAM,MAAM,aAAa,aAAa,WAAW;EAEjD,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EACA,IAAI;GACF,MAAM,WAAW,MAAM,KAAK,KAAK,QAAQ,GAAG;GAU5C,MATmB,SAAS,MAAM,EAChC,mBAAmB;IACjB,QAAQ;IACR,UAAU;IACV,OAAO;GACT,EACF,CACiB,CAAC,CAAC,iBAAiB,GAEhC,CAAC,CACF,QAEE,SAAS,KAAK,cAAc,SAAS,KAAK,cAAc,IAC3D,CAAC,CACA,SAEE,SAAS;IASR,MAAM,cAAuB;KAC3B,SATsB,KAAK,UAAU,SAAS,GAAG,IAC/C,KAAK,UAAU,MAAM,GAAG,EAAE,IAC1B,KAAK;KAQP,kBANuB,YACvB,KAAK,aAAa,MAAM,UAAU,CAAC,EAAE,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,EAK/C;IACjB;IAEA,OAAO,SAAS,KAAK,WAAW;GAClC,CACF;GAEF,IAAI,OAAO,SAAS,QAClB,OAAO,MACL;IAAE;IAAa;IAAa,UAAU,OAAO,SAAS;GAAO,GAC7D,6BACF;QAEA,OAAO,MACL;IAAE;IAAa;GAAY,GAC3B,gCACF;EAEJ,SAAS,KAAK;GACZ,IAAI,eAAeA,gBAAa,IAAI,UAAU,eAAe,KAAK;IAChE,OAAO,KACL;KAAE;KAAa;IAAY,GAC3B,gCACF;IACA,OAAO;GACT;GACA,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
@@ -2,7 +2,6 @@ import { coerceArray } from "../../../util/array.js";
2
2
  import { logger } from "../../../logger/index.js";
3
3
  import { find } from "../../../util/host-rules.js";
4
4
  import { id } from "../../versioning/aws-eks-addon/index.js";
5
- import { withCache } from "../../../util/cache/package/with-cache.js";
6
5
  import { Datasource } from "../datasource.js";
7
6
  import { EksAddonsFilter } from "./schema.js";
8
7
  import { isTruthy } from "@sindresorhus/is";
@@ -17,7 +16,7 @@ var AwsEKSAddonDataSource = class AwsEKSAddonDataSource extends Datasource {
17
16
  constructor() {
18
17
  super(AwsEKSAddonDataSource.id);
19
18
  }
20
- async _getReleases({ packageName: serializedFilter }) {
19
+ async fetchReleases({ packageName: serializedFilter }) {
21
20
  const res = EksAddonsFilter.safeParse(serializedFilter);
22
21
  if (!res.success) {
23
22
  logger.warn({
@@ -45,11 +44,10 @@ var AwsEKSAddonDataSource = class AwsEKSAddonDataSource extends Datasource {
45
44
  }) };
46
45
  }
47
46
  getReleases(config) {
48
- return withCache({
49
- namespace: `datasource-${AwsEKSAddonDataSource.id}`,
47
+ return this.cached({
50
48
  key: `getReleases:${config.packageName}`,
51
49
  fallback: true
52
- }, () => this._getReleases(config));
50
+ }, () => this.fetchReleases(config));
53
51
  }
54
52
  getClient({ region, profile }) {
55
53
  const cacheKey = `${region ?? "default"}#${profile ?? "default"}`;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["awsEksAddonVersioning.id","hostRules.find"],"sources":["../../../../lib/modules/datasource/aws-eks-addon/index.ts"],"sourcesContent":["import { DescribeAddonVersionsCommand, EKSClient } from '@aws-sdk/client-eks';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport * as awsEksAddonVersioning from '../../versioning/aws-eks-addon/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { EksAddonsFilter } from './schema.ts';\n\nexport class AwsEKSAddonDataSource extends Datasource {\n static readonly id = 'aws-eks-addon';\n\n override readonly defaultVersioning = awsEksAddonVersioning.id;\n override readonly caching = true;\n private readonly clients: Record<string, EKSClient> = {};\n\n constructor() {\n super(AwsEKSAddonDataSource.id);\n }\n\n private async _getReleases({\n packageName: serializedFilter,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const res = EksAddonsFilter.safeParse(serializedFilter);\n if (!res.success) {\n logger.warn(\n { err: res.error, serializedFilter },\n 'Error parsing eks-addons config.',\n );\n return null;\n }\n\n const filter = res.data;\n\n const cmd = new DescribeAddonVersionsCommand({\n kubernetesVersion: filter.kubernetesVersion,\n addonName: filter.addonName,\n maxResults: 1,\n });\n const response = await this.getClient(filter).send(cmd);\n const addons = coerceArray(response.addons);\n return {\n releases: addons\n .flatMap((addon) => {\n return addon.addonVersions;\n })\n .filter(isTruthy)\n .map((versionInfo) => ({\n version: versionInfo.addonVersion ?? '',\n default:\n versionInfo.compatibilities?.some((comp) => comp.defaultVersion) ??\n false,\n compatibleWith: versionInfo.compatibilities?.flatMap(\n (comp) => comp.clusterVersion,\n ),\n }))\n .filter((release) => release.version && release.version !== '')\n .filter((release) => {\n if (filter.default) {\n return release.default && release.default === filter.default;\n }\n return true;\n }),\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${AwsEKSAddonDataSource.id}`,\n key: `getReleases:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private getClient({ region, profile }: EksAddonsFilter): EKSClient {\n const cacheKey = `${region ?? 'default'}#${profile ?? 'default'}`;\n if (!(cacheKey in this.clients)) {\n const { password, token, username } = hostRules.find({\n hostType: AwsEKSAddonDataSource.id,\n });\n this.clients[cacheKey] = new EKSClient({\n ...(region && { region }),\n credentials:\n username && password\n ? {\n accessKeyId: username,\n secretAccessKey: password,\n sessionToken: token,\n }\n : fromNodeProviderChain(profile ? { profile } : undefined),\n });\n }\n return this.clients[cacheKey];\n }\n}\n"],"mappings":";;;;;;;;;;;AAYA,IAAa,wBAAb,MAAa,8BAA8B,WAAW;CACpD,OAAgB,KAAK;CAErB,oBAAsCA;CACtC,UAA4B;CAC5B,UAAsD,CAAC;CAEvD,cAAc;EACZ,MAAM,sBAAsB,EAAE;CAChC;CAEA,MAAc,aAAa,EACzB,aAAa,oBACsC;EACnD,MAAM,MAAM,gBAAgB,UAAU,gBAAgB;EACtD,IAAI,CAAC,IAAI,SAAS;GAChB,OAAO,KACL;IAAE,KAAK,IAAI;IAAO;GAAiB,GACnC,kCACF;GACA,OAAO;EACT;EAEA,MAAM,SAAS,IAAI;EAEnB,MAAM,MAAM,IAAI,6BAA6B;GAC3C,mBAAmB,OAAO;GAC1B,WAAW,OAAO;GAClB,YAAY;EACd,CAAC;EACD,MAAM,WAAW,MAAM,KAAK,UAAU,MAAM,CAAC,CAAC,KAAK,GAAG;EAEtD,OAAO,EACL,UAFa,YAAY,SAAS,MAEnB,CAAC,CACb,SAAS,UAAU;GAClB,OAAO,MAAM;EACf,CAAC,CAAC,CACD,OAAO,QAAQ,CAAC,CAChB,KAAK,iBAAiB;GACrB,SAAS,YAAY,gBAAgB;GACrC,SACE,YAAY,iBAAiB,MAAM,SAAS,KAAK,cAAc,KAC/D;GACF,gBAAgB,YAAY,iBAAiB,SAC1C,SAAS,KAAK,cACjB;EACF,EAAE,CAAC,CACF,QAAQ,YAAY,QAAQ,WAAW,QAAQ,YAAY,EAAE,CAAC,CAC9D,QAAQ,YAAY;GACnB,IAAI,OAAO,SACT,OAAO,QAAQ,WAAW,QAAQ,YAAY,OAAO;GAEvD,OAAO;EACT,CAAC,EACL;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,sBAAsB;GAC/C,KAAK,eAAe,OAAO;GAC3B,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,UAAkB,EAAE,QAAQ,WAAuC;EACjE,MAAM,WAAW,GAAG,UAAU,UAAU,GAAG,WAAW;EACtD,IAAI,EAAE,YAAY,KAAK,UAAU;GAC/B,MAAM,EAAE,UAAU,OAAO,aAAaC,KAAe,EACnD,UAAU,sBAAsB,GAClC,CAAC;GACD,KAAK,QAAQ,YAAY,IAAI,UAAU;IACrC,GAAI,UAAU,EAAE,OAAO;IACvB,aACE,YAAY,WACR;KACE,aAAa;KACb,iBAAiB;KACjB,cAAc;IAChB,IACA,sBAAsB,UAAU,EAAE,QAAQ,IAAI,KAAA,CAAS;GAC/D,CAAC;EACH;EACA,OAAO,KAAK,QAAQ;CACtB;AACF"}
1
+ {"version":3,"file":"index.js","names":["awsEksAddonVersioning.id","hostRules.find"],"sources":["../../../../lib/modules/datasource/aws-eks-addon/index.ts"],"sourcesContent":["import { DescribeAddonVersionsCommand, EKSClient } from '@aws-sdk/client-eks';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport * as awsEksAddonVersioning from '../../versioning/aws-eks-addon/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { EksAddonsFilter } from './schema.ts';\n\nexport class AwsEKSAddonDataSource extends Datasource {\n static readonly id = 'aws-eks-addon';\n\n override readonly defaultVersioning = awsEksAddonVersioning.id;\n override readonly caching = true;\n private readonly clients: Record<string, EKSClient> = {};\n\n constructor() {\n super(AwsEKSAddonDataSource.id);\n }\n\n private async fetchReleases({\n packageName: serializedFilter,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const res = EksAddonsFilter.safeParse(serializedFilter);\n if (!res.success) {\n logger.warn(\n { err: res.error, serializedFilter },\n 'Error parsing eks-addons config.',\n );\n return null;\n }\n\n const filter = res.data;\n\n const cmd = new DescribeAddonVersionsCommand({\n kubernetesVersion: filter.kubernetesVersion,\n addonName: filter.addonName,\n maxResults: 1,\n });\n const response = await this.getClient(filter).send(cmd);\n const addons = coerceArray(response.addons);\n return {\n releases: addons\n .flatMap((addon) => {\n return addon.addonVersions;\n })\n .filter(isTruthy)\n .map((versionInfo) => ({\n version: versionInfo.addonVersion ?? '',\n default:\n versionInfo.compatibilities?.some((comp) => comp.defaultVersion) ??\n false,\n compatibleWith: versionInfo.compatibilities?.flatMap(\n (comp) => comp.clusterVersion,\n ),\n }))\n .filter((release) => release.version && release.version !== '')\n .filter((release) => {\n if (filter.default) {\n return release.default && release.default === filter.default;\n }\n return true;\n }),\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `getReleases:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n\n private getClient({ region, profile }: EksAddonsFilter): EKSClient {\n const cacheKey = `${region ?? 'default'}#${profile ?? 'default'}`;\n if (!(cacheKey in this.clients)) {\n const { password, token, username } = hostRules.find({\n hostType: AwsEKSAddonDataSource.id,\n });\n this.clients[cacheKey] = new EKSClient({\n ...(region && { region }),\n credentials:\n username && password\n ? {\n accessKeyId: username,\n secretAccessKey: password,\n sessionToken: token,\n }\n : fromNodeProviderChain(profile ? { profile } : undefined),\n });\n }\n return this.clients[cacheKey];\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAa,wBAAb,MAAa,8BAA8B,WAAW;CACpD,OAAgB,KAAK;CAErB,oBAAsCA;CACtC,UAA4B;CAC5B,UAAsD,CAAC;CAEvD,cAAc;EACZ,MAAM,sBAAsB,EAAE;CAChC;CAEA,MAAc,cAAc,EAC1B,aAAa,oBACsC;EACnD,MAAM,MAAM,gBAAgB,UAAU,gBAAgB;EACtD,IAAI,CAAC,IAAI,SAAS;GAChB,OAAO,KACL;IAAE,KAAK,IAAI;IAAO;GAAiB,GACnC,kCACF;GACA,OAAO;EACT;EAEA,MAAM,SAAS,IAAI;EAEnB,MAAM,MAAM,IAAI,6BAA6B;GAC3C,mBAAmB,OAAO;GAC1B,WAAW,OAAO;GAClB,YAAY;EACd,CAAC;EACD,MAAM,WAAW,MAAM,KAAK,UAAU,MAAM,CAAC,CAAC,KAAK,GAAG;EAEtD,OAAO,EACL,UAFa,YAAY,SAAS,MAEnB,CAAC,CACb,SAAS,UAAU;GAClB,OAAO,MAAM;EACf,CAAC,CAAC,CACD,OAAO,QAAQ,CAAC,CAChB,KAAK,iBAAiB;GACrB,SAAS,YAAY,gBAAgB;GACrC,SACE,YAAY,iBAAiB,MAAM,SAAS,KAAK,cAAc,KAC/D;GACF,gBAAgB,YAAY,iBAAiB,SAC1C,SAAS,KAAK,cACjB;EACF,EAAE,CAAC,CACF,QAAQ,YAAY,QAAQ,WAAW,QAAQ,YAAY,EAAE,CAAC,CAC9D,QAAQ,YAAY;GACnB,IAAI,OAAO,SACT,OAAO,QAAQ,WAAW,QAAQ,YAAY,OAAO;GAEvD,OAAO;EACT,CAAC,EACL;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,eAAe,OAAO;GAC3B,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;CAEA,UAAkB,EAAE,QAAQ,WAAuC;EACjE,MAAM,WAAW,GAAG,UAAU,UAAU,GAAG,WAAW;EACtD,IAAI,EAAE,YAAY,KAAK,UAAU;GAC/B,MAAM,EAAE,UAAU,OAAO,aAAaC,KAAe,EACnD,UAAU,sBAAsB,GAClC,CAAC;GACD,KAAK,QAAQ,YAAY,IAAI,UAAU;IACrC,GAAI,UAAU,EAAE,OAAO;IACvB,aACE,YAAY,WACR;KACE,aAAa;KACb,iBAAiB;KACjB,cAAc;IAChB,IACA,sBAAsB,UAAU,EAAE,QAAQ,IAAI,KAAA,CAAS;GAC/D,CAAC;EACH;EACA,OAAO,KAAK,QAAQ;CACtB;AACF"}
@@ -1,7 +1,6 @@
1
1
  import { coerceArray } from "../../../util/array.js";
2
2
  import { find } from "../../../util/host-rules.js";
3
3
  import { id } from "../../versioning/aws-machine-image/index.js";
4
- import { withCache } from "../../../util/cache/package/with-cache.js";
5
4
  import { asTimestamp } from "../../../util/timestamp.js";
6
5
  import { Datasource } from "../datasource.js";
7
6
  import { fromNodeProviderChain } from "@aws-sdk/credential-providers";
@@ -54,7 +53,7 @@ var AwsMachineImageDatasource = class AwsMachineImageDatasource extends Datasour
54
53
  else config = Object.assign(config, elem);
55
54
  return [filters, config];
56
55
  }
57
- async _getSortedAwsMachineImages(serializedAmiFilter) {
56
+ async fetchSortedAwsMachineImages(serializedAmiFilter) {
58
57
  const [amiFilter, clientConfig] = this.loadConfig(serializedAmiFilter);
59
58
  const amiFilterCmd = this.getAmiFilterCommand(amiFilter);
60
59
  const matchingImages = await this.getEC2Client(clientConfig).send(amiFilterCmd);
@@ -64,12 +63,9 @@ var AwsMachineImageDatasource = class AwsMachineImageDatasource extends Datasour
64
63
  });
65
64
  }
66
65
  getSortedAwsMachineImages(serializedAmiFilter) {
67
- return withCache({
68
- namespace: `datasource-${AwsMachineImageDatasource.id}`,
69
- key: `getSortedAwsMachineImages:${serializedAmiFilter}`
70
- }, () => this._getSortedAwsMachineImages(serializedAmiFilter));
66
+ return this.cached({ key: `getSortedAwsMachineImages:${serializedAmiFilter}` }, () => this.fetchSortedAwsMachineImages(serializedAmiFilter));
71
67
  }
72
- async _getDigest({ packageName: serializedAmiFilter }, newValue) {
68
+ async fetchDigest({ packageName: serializedAmiFilter }, newValue) {
73
69
  const images = await this.getSortedAwsMachineImages(serializedAmiFilter);
74
70
  if (images.length < 1) return null;
75
71
  if (newValue) {
@@ -80,13 +76,12 @@ var AwsMachineImageDatasource = class AwsMachineImageDatasource extends Datasour
80
76
  return images.at(-1).Name ?? null;
81
77
  }
82
78
  getDigest(config, newValue) {
83
- return withCache({
84
- namespace: `datasource-${AwsMachineImageDatasource.id}`,
79
+ return this.cached({
85
80
  key: `getDigest:${config.packageName}:${newValue ?? ""}`,
86
81
  fallback: true
87
- }, () => this._getDigest(config, newValue));
82
+ }, () => this.fetchDigest(config, newValue));
88
83
  }
89
- async _getReleases({ packageName: serializedAmiFilter }) {
84
+ async fetchReleases({ packageName: serializedAmiFilter }) {
90
85
  const images = await this.getSortedAwsMachineImages(serializedAmiFilter);
91
86
  if (!images.length || !images.at(-1).ImageId) return null;
92
87
  return { releases: images.map((image) => ({
@@ -97,11 +92,10 @@ var AwsMachineImageDatasource = class AwsMachineImageDatasource extends Datasour
97
92
  })) };
98
93
  }
99
94
  getReleases(config) {
100
- return withCache({
101
- namespace: `datasource-${AwsMachineImageDatasource.id}`,
95
+ return this.cached({
102
96
  key: `getReleases:${config.packageName}`,
103
97
  fallback: true
104
- }, () => this._getReleases(config));
98
+ }, () => this.fetchReleases(config));
105
99
  }
106
100
  };
107
101
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["amazonMachineImageVersioning.id","hostRules.find"],"sources":["../../../../lib/modules/datasource/aws-machine-image/index.ts"],"sourcesContent":["import type { Filter, Image } from '@aws-sdk/client-ec2';\nimport { DescribeImagesCommand, EC2Client } from '@aws-sdk/client-ec2';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { coerceArray } from '../../../util/array.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport * as amazonMachineImageVersioning from '../../versioning/aws-machine-image/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport type { AwsClientConfig, ParsedConfig } from './types.ts';\n\nexport class AwsMachineImageDatasource extends Datasource {\n static readonly id = 'aws-machine-image';\n\n override readonly defaultVersioning = amazonMachineImageVersioning.id;\n\n override readonly caching = true;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `CreationDate` field in the results.';\n\n override readonly defaultConfig = {\n // Because AMIs don't follow any versioning scheme, we override commitMessageExtra to remove the 'v'\n commitMessageExtra: 'to {{{newVersion}}}',\n prBodyColumns: ['Change', 'Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n digest: {\n // Because newDigestShort will allways be 'amazon-' we override to print the name of the AMI\n commitMessageExtra: 'to {{{newDigest}}}',\n prBodyColumns: ['Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n },\n };\n\n private readonly now: number;\n\n constructor() {\n super(AwsMachineImageDatasource.id);\n this.now = Date.now();\n }\n\n private isAmiFilter(config: Filter | AwsClientConfig): config is Filter {\n return 'Name' in config && 'Values' in config;\n }\n\n private getEC2Client(config: AwsClientConfig): EC2Client {\n const { profile, region } = config;\n const { password, token, username } = hostRules.find({\n hostType: AwsMachineImageDatasource.id,\n });\n return new EC2Client({\n region,\n credentials:\n username && password\n ? {\n accessKeyId: username,\n secretAccessKey: password,\n sessionToken: token,\n }\n : fromNodeProviderChain({ profile }),\n });\n }\n\n private getAmiFilterCommand(filter: Filter[]): DescribeImagesCommand {\n return new DescribeImagesCommand({\n Filters: filter,\n });\n }\n\n loadConfig(serializedAmiFilter: string): [Filter[], AwsClientConfig] {\n const parsedConfig: ParsedConfig = JSON.parse(serializedAmiFilter);\n const filters = [];\n let config = {};\n for (const elem of parsedConfig) {\n if (this.isAmiFilter(elem)) {\n // Separate actual AMI filters from aws client config\n filters.push(elem);\n } else {\n // merge config objects if there are multiple\n config = Object.assign(config, elem);\n }\n }\n return [filters, config];\n }\n\n private async _getSortedAwsMachineImages(\n serializedAmiFilter: string,\n ): Promise<Image[]> {\n const [amiFilter, clientConfig] = this.loadConfig(serializedAmiFilter);\n const amiFilterCmd = this.getAmiFilterCommand(amiFilter);\n const ec2Client = this.getEC2Client(clientConfig);\n const matchingImages = await ec2Client.send(amiFilterCmd);\n matchingImages.Images = coerceArray(matchingImages.Images);\n return matchingImages.Images.sort((image1, image2) => {\n const ts1 = image1.CreationDate\n ? Date.parse(image1.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n\n const ts2 = image2.CreationDate\n ? Date.parse(image2.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n return ts1 - ts2;\n });\n }\n\n getSortedAwsMachineImages(serializedAmiFilter: string): Promise<Image[]> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getSortedAwsMachineImages:${serializedAmiFilter}`,\n },\n () => this._getSortedAwsMachineImages(serializedAmiFilter),\n );\n }\n\n private async _getDigest(\n { packageName: serializedAmiFilter }: GetReleasesConfig,\n newValue?: string,\n ): Promise<string | null> {\n const images = await this.getSortedAwsMachineImages(serializedAmiFilter);\n if (images.length < 1) {\n return null;\n }\n\n if (newValue) {\n const newValueMatchingImages = images.filter(\n (image) => image.ImageId === newValue,\n );\n if (\n newValueMatchingImages.length === 1 &&\n newValueMatchingImages[0].Name\n ) {\n return newValueMatchingImages[0].Name;\n }\n return null;\n }\n\n return images.at(-1)!.Name ?? null;\n }\n\n override getDigest(\n config: GetReleasesConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getDigest:${config.packageName}:${newValue ?? ''}`,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n\n private async _getReleases({\n packageName: serializedAmiFilter,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const images = await this.getSortedAwsMachineImages(serializedAmiFilter);\n if (!images.length || !images.at(-1)!.ImageId) {\n return null;\n }\n return {\n releases: images.map((image) => ({\n version: image.ImageId!,\n releaseTimestamp: asTimestamp(image.CreationDate),\n isDeprecated:\n Date.parse(image.DeprecationTime ?? this.now.toString()) < this.now,\n newDigest: image.Name,\n })),\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${AwsMachineImageDatasource.id}`,\n key: `getReleases:${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":["amazonMachineImageVersioning.id","hostRules.find"],"sources":["../../../../lib/modules/datasource/aws-machine-image/index.ts"],"sourcesContent":["import type { Filter, Image } from '@aws-sdk/client-ec2';\nimport { DescribeImagesCommand, EC2Client } from '@aws-sdk/client-ec2';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { coerceArray } from '../../../util/array.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport * as amazonMachineImageVersioning from '../../versioning/aws-machine-image/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport type { AwsClientConfig, ParsedConfig } from './types.ts';\n\nexport class AwsMachineImageDatasource extends Datasource {\n static readonly id = 'aws-machine-image';\n\n override readonly defaultVersioning = amazonMachineImageVersioning.id;\n\n override readonly caching = true;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `CreationDate` field in the results.';\n\n override readonly defaultConfig = {\n // Because AMIs don't follow any versioning scheme, we override commitMessageExtra to remove the 'v'\n commitMessageExtra: 'to {{{newVersion}}}',\n prBodyColumns: ['Change', 'Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n digest: {\n // Because newDigestShort will allways be 'amazon-' we override to print the name of the AMI\n commitMessageExtra: 'to {{{newDigest}}}',\n prBodyColumns: ['Image'],\n prBodyDefinitions: {\n Image: '```{{{newDigest}}}```',\n },\n },\n };\n\n private readonly now: number;\n\n constructor() {\n super(AwsMachineImageDatasource.id);\n this.now = Date.now();\n }\n\n private isAmiFilter(config: Filter | AwsClientConfig): config is Filter {\n return 'Name' in config && 'Values' in config;\n }\n\n private getEC2Client(config: AwsClientConfig): EC2Client {\n const { profile, region } = config;\n const { password, token, username } = hostRules.find({\n hostType: AwsMachineImageDatasource.id,\n });\n return new EC2Client({\n region,\n credentials:\n username && password\n ? {\n accessKeyId: username,\n secretAccessKey: password,\n sessionToken: token,\n }\n : fromNodeProviderChain({ profile }),\n });\n }\n\n private getAmiFilterCommand(filter: Filter[]): DescribeImagesCommand {\n return new DescribeImagesCommand({\n Filters: filter,\n });\n }\n\n loadConfig(serializedAmiFilter: string): [Filter[], AwsClientConfig] {\n const parsedConfig: ParsedConfig = JSON.parse(serializedAmiFilter);\n const filters = [];\n let config = {};\n for (const elem of parsedConfig) {\n if (this.isAmiFilter(elem)) {\n // Separate actual AMI filters from aws client config\n filters.push(elem);\n } else {\n // merge config objects if there are multiple\n config = Object.assign(config, elem);\n }\n }\n return [filters, config];\n }\n\n private async fetchSortedAwsMachineImages(\n serializedAmiFilter: string,\n ): Promise<Image[]> {\n const [amiFilter, clientConfig] = this.loadConfig(serializedAmiFilter);\n const amiFilterCmd = this.getAmiFilterCommand(amiFilter);\n const ec2Client = this.getEC2Client(clientConfig);\n const matchingImages = await ec2Client.send(amiFilterCmd);\n matchingImages.Images = coerceArray(matchingImages.Images);\n return matchingImages.Images.sort((image1, image2) => {\n const ts1 = image1.CreationDate\n ? Date.parse(image1.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n\n const ts2 = image2.CreationDate\n ? Date.parse(image2.CreationDate)\n : /* v8 ignore next -- AWS SDK types CreationDate as optional, but EC2 always returns it for images */ 0; // TODO: add date coersion util\n return ts1 - ts2;\n });\n }\n\n getSortedAwsMachineImages(serializedAmiFilter: string): Promise<Image[]> {\n return this.cached(\n {\n key: `getSortedAwsMachineImages:${serializedAmiFilter}`,\n },\n () => this.fetchSortedAwsMachineImages(serializedAmiFilter),\n );\n }\n\n private async fetchDigest(\n { packageName: serializedAmiFilter }: GetReleasesConfig,\n newValue?: string,\n ): Promise<string | null> {\n const images = await this.getSortedAwsMachineImages(serializedAmiFilter);\n if (images.length < 1) {\n return null;\n }\n\n if (newValue) {\n const newValueMatchingImages = images.filter(\n (image) => image.ImageId === newValue,\n );\n if (\n newValueMatchingImages.length === 1 &&\n newValueMatchingImages[0].Name\n ) {\n return newValueMatchingImages[0].Name;\n }\n return null;\n }\n\n return images.at(-1)!.Name ?? null;\n }\n\n override getDigest(\n config: GetReleasesConfig,\n newValue?: string,\n ): Promise<string | null> {\n return this.cached(\n {\n key: `getDigest:${config.packageName}:${newValue ?? ''}`,\n fallback: true,\n },\n () => this.fetchDigest(config, newValue),\n );\n }\n\n private async fetchReleases({\n packageName: serializedAmiFilter,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const images = await this.getSortedAwsMachineImages(serializedAmiFilter);\n if (!images.length || !images.at(-1)!.ImageId) {\n return null;\n }\n return {\n releases: images.map((image) => ({\n version: image.ImageId!,\n releaseTimestamp: asTimestamp(image.CreationDate),\n isDeprecated:\n Date.parse(image.DeprecationTime ?? this.now.toString()) < this.now,\n newDigest: image.Name,\n })),\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `getReleases:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { coerceArray } from "../../../util/array.js";
2
- import { withCache } from "../../../util/cache/package/with-cache.js";
3
2
  import { Datasource } from "../datasource.js";
4
3
  import { Lazy } from "../../../util/lazy.js";
5
4
  import { DescribeDBEngineVersionsCommand, RDSClient } from "@aws-sdk/client-rds";
@@ -12,7 +11,7 @@ var AwsRdsDatasource = class AwsRdsDatasource extends Datasource {
12
11
  super(AwsRdsDatasource.id);
13
12
  this.rds = new Lazy(() => new RDSClient({}));
14
13
  }
15
- async _getReleases({ packageName: serializedFilter }) {
14
+ async fetchReleases({ packageName: serializedFilter }) {
16
15
  const cmd = new DescribeDBEngineVersionsCommand({ Filters: JSON.parse(serializedFilter) });
17
16
  const response = await this.rds.getValue().send(cmd);
18
17
  return { releases: coerceArray(response.DBEngineVersions).filter((version) => version.EngineVersion).map((version) => ({
@@ -21,11 +20,10 @@ var AwsRdsDatasource = class AwsRdsDatasource extends Datasource {
21
20
  })) };
22
21
  }
23
22
  getReleases(config) {
24
- return withCache({
25
- namespace: `datasource-${AwsRdsDatasource.id}`,
23
+ return this.cached({
26
24
  key: `getReleases:${config.packageName}`,
27
25
  fallback: true
28
- }, () => this._getReleases(config));
26
+ }, () => this.fetchReleases(config));
29
27
  }
30
28
  };
31
29
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/aws-rds/index.ts"],"sourcesContent":["import {\n DescribeDBEngineVersionsCommand,\n RDSClient,\n} from '@aws-sdk/client-rds';\nimport { coerceArray } from '../../../util/array.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { Lazy } from '../../../util/lazy.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\n\nexport class AwsRdsDatasource extends Datasource {\n static readonly id = 'aws-rds';\n\n override readonly caching = true;\n\n private readonly rds: Lazy<RDSClient>;\n\n constructor() {\n super(AwsRdsDatasource.id);\n this.rds = new Lazy(() => new RDSClient({}));\n }\n\n private async _getReleases({\n packageName: serializedFilter,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const cmd = new DescribeDBEngineVersionsCommand({\n Filters: JSON.parse(serializedFilter),\n });\n const response = await this.rds.getValue().send(cmd);\n const versions = coerceArray(response.DBEngineVersions);\n return {\n releases: versions\n .filter((version) => version.EngineVersion)\n .map((version) => ({\n version: version.EngineVersion!,\n isDeprecated: version.Status === 'deprecated',\n })),\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${AwsRdsDatasource.id}`,\n key: `getReleases:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;AAUA,IAAa,mBAAb,MAAa,yBAAyB,WAAW;CAC/C,OAAgB,KAAK;CAErB,UAA4B;CAE5B;CAEA,cAAc;EACZ,MAAM,iBAAiB,EAAE;EACzB,KAAK,MAAM,IAAI,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC;CAC7C;CAEA,MAAc,aAAa,EACzB,aAAa,oBACsC;EACnD,MAAM,MAAM,IAAI,gCAAgC,EAC9C,SAAS,KAAK,MAAM,gBAAgB,EACtC,CAAC;EACD,MAAM,WAAW,MAAM,KAAK,IAAI,SAAS,CAAC,CAAC,KAAK,GAAG;EAEnD,OAAO,EACL,UAFe,YAAY,SAAS,gBAEnB,CAAC,CACf,QAAQ,YAAY,QAAQ,aAAa,CAAC,CAC1C,KAAK,aAAa;GACjB,SAAS,QAAQ;GACjB,cAAc,QAAQ,WAAW;EACnC,EAAE,EACN;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,iBAAiB;GAC1C,KAAK,eAAe,OAAO;GAC3B,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/aws-rds/index.ts"],"sourcesContent":["import {\n DescribeDBEngineVersionsCommand,\n RDSClient,\n} from '@aws-sdk/client-rds';\nimport { coerceArray } from '../../../util/array.ts';\nimport { Lazy } from '../../../util/lazy.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\n\nexport class AwsRdsDatasource extends Datasource {\n static readonly id = 'aws-rds';\n\n override readonly caching = true;\n\n private readonly rds: Lazy<RDSClient>;\n\n constructor() {\n super(AwsRdsDatasource.id);\n this.rds = new Lazy(() => new RDSClient({}));\n }\n\n private async fetchReleases({\n packageName: serializedFilter,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const cmd = new DescribeDBEngineVersionsCommand({\n Filters: JSON.parse(serializedFilter),\n });\n const response = await this.rds.getValue().send(cmd);\n const versions = coerceArray(response.DBEngineVersions);\n return {\n releases: versions\n .filter((version) => version.EngineVersion)\n .map((version) => ({\n version: version.EngineVersion!,\n isDeprecated: version.Status === 'deprecated',\n })),\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `getReleases:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;AASA,IAAa,mBAAb,MAAa,yBAAyB,WAAW;CAC/C,OAAgB,KAAK;CAErB,UAA4B;CAE5B;CAEA,cAAc;EACZ,MAAM,iBAAiB,EAAE;EACzB,KAAK,MAAM,IAAI,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC;CAC7C;CAEA,MAAc,cAAc,EAC1B,aAAa,oBACsC;EACnD,MAAM,MAAM,IAAI,gCAAgC,EAC9C,SAAS,KAAK,MAAM,gBAAgB,EACtC,CAAC;EACD,MAAM,WAAW,MAAM,KAAK,IAAI,SAAS,CAAC,CAAC,KAAK,GAAG;EAEnD,OAAO,EACL,UAFe,YAAY,SAAS,gBAEnB,CAAC,CACf,QAAQ,YAAY,QAAQ,aAAa,CAAC,CAC1C,KAAK,aAAa;GACjB,SAAS,QAAQ;GACjB,cAAc,QAAQ,WAAW;EACnC,EAAE,EACN;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,eAAe,OAAO;GAC3B,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
@@ -1,5 +1,4 @@
1
1
  import { id } from "../../versioning/azure-rest-api/index.js";
2
- import { withCache } from "../../../util/cache/package/with-cache.js";
3
2
  import { Datasource } from "../datasource.js";
4
3
  import { BicepResourceVersionIndex } from "./schema.js";
5
4
  //#region lib/modules/datasource/azure-bicep-resource/index.ts
@@ -20,7 +19,7 @@ var AzureBicepResourceDatasource = class AzureBicepResourceDatasource extends Da
20
19
  const firstSlashIndex = packageName.indexOf("/");
21
20
  return `https://learn.microsoft.com/en-us/azure/templates/${packageName.slice(0, firstSlashIndex)}/change-log/${packageName.slice(firstSlashIndex + 1)}`;
22
21
  }
23
- async _getReleases(getReleasesConfig) {
22
+ async fetchReleases(getReleasesConfig) {
24
23
  const resourceVersionIndex = await this.getResourceVersionIndex();
25
24
  const packageName = getReleasesConfig.packageName.toLowerCase();
26
25
  const versions = resourceVersionIndex[packageName];
@@ -32,24 +31,22 @@ var AzureBicepResourceDatasource = class AzureBicepResourceDatasource extends Da
32
31
  })) };
33
32
  }
34
33
  getReleases(config) {
35
- return withCache({
36
- namespace: `datasource-${AzureBicepResourceDatasource.id}`,
34
+ return this.cached({
37
35
  key: `getReleases-${config.packageName}`,
38
36
  fallback: true,
39
37
  cacheable: true
40
- }, () => this._getReleases(config));
38
+ }, () => this.fetchReleases(config));
41
39
  }
42
- async _getResourceVersionIndex() {
40
+ async fetchResourceVersionIndex() {
43
41
  const { body } = await this.http.getJson(BICEP_TYPES_INDEX_URL, BicepResourceVersionIndex);
44
42
  return body;
45
43
  }
46
44
  getResourceVersionIndex() {
47
- return withCache({
48
- namespace: `datasource-${AzureBicepResourceDatasource.id}`,
45
+ return this.cached({
49
46
  key: "getResourceVersionIndex",
50
47
  ttlMinutes: 1440,
51
48
  cacheable: true
52
- }, () => this._getResourceVersionIndex());
49
+ }, () => this.fetchResourceVersionIndex());
53
50
  }
54
51
  };
55
52
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["azureRestApiVersioningApi.id"],"sources":["../../../../lib/modules/datasource/azure-bicep-resource/index.ts"],"sourcesContent":["import { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as azureRestApiVersioningApi from '../../versioning/azure-rest-api/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { BicepResourceVersionIndex } from './schema.ts';\n\nconst BICEP_TYPES_INDEX_URL =\n 'https://raw.githubusercontent.com/Azure/bicep-types-az/main/generated/index.json';\n\nexport class AzureBicepResourceDatasource extends Datasource {\n static readonly id = 'azure-bicep-resource';\n\n override readonly defaultConfig = {\n commitMessageTopic: 'resource {{depName}}',\n commitMessageExtra: 'to {{{newVersion}}}',\n prBodyColumns: ['Resource', 'Change'],\n prBodyDefinitions: {\n Resource: '{{{depNameLinked}}}',\n },\n };\n\n override readonly defaultVersioning = azureRestApiVersioningApi.id;\n\n constructor() {\n super(AzureBicepResourceDatasource.id);\n }\n\n private getChangelogUrl(packageName: string): string {\n const firstSlashIndex = packageName.indexOf('/');\n const namespaceProvider = packageName.slice(0, firstSlashIndex);\n const type = packageName.slice(firstSlashIndex + 1);\n return `https://learn.microsoft.com/en-us/azure/templates/${namespaceProvider}/change-log/${type}`;\n }\n\n private async _getReleases(\n getReleasesConfig: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const resourceVersionIndex = await this.getResourceVersionIndex();\n const packageName = getReleasesConfig.packageName.toLowerCase();\n const versions = resourceVersionIndex[packageName];\n if (!versions?.length) {\n return null;\n }\n\n const changelogUrl = this.getChangelogUrl(packageName);\n const releases = versions.map((version) => ({\n version,\n changelogUrl: `${changelogUrl}#${version}`,\n }));\n return { releases };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${AzureBicepResourceDatasource.id}`,\n key: `getReleases-${config.packageName}`,\n fallback: true,\n cacheable: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getResourceVersionIndex(): Promise<BicepResourceVersionIndex> {\n const { body } = await this.http.getJson(\n BICEP_TYPES_INDEX_URL,\n BicepResourceVersionIndex,\n );\n return body;\n }\n\n getResourceVersionIndex(): Promise<BicepResourceVersionIndex> {\n return withCache(\n {\n namespace: `datasource-${AzureBicepResourceDatasource.id}`,\n key: 'getResourceVersionIndex',\n ttlMinutes: 24 * 60,\n cacheable: true,\n },\n () => this._getResourceVersionIndex(),\n );\n }\n}\n"],"mappings":";;;;;AAMA,MAAM,wBACJ;AAEF,IAAa,+BAAb,MAAa,qCAAqC,WAAW;CAC3D,OAAgB,KAAK;CAErB,gBAAkC;EAChC,oBAAoB;EACpB,oBAAoB;EACpB,eAAe,CAAC,YAAY,QAAQ;EACpC,mBAAmB,EACjB,UAAU,sBACZ;CACF;CAEA,oBAAsCA;CAEtC,cAAc;EACZ,MAAM,6BAA6B,EAAE;CACvC;CAEA,gBAAwB,aAA6B;EACnD,MAAM,kBAAkB,YAAY,QAAQ,GAAG;EAG/C,OAAO,qDAFmB,YAAY,MAAM,GAAG,eAE6B,EAAE,cADjE,YAAY,MAAM,kBAAkB,CAC8C;CACjG;CAEA,MAAc,aACZ,mBAC+B;EAC/B,MAAM,uBAAuB,MAAM,KAAK,wBAAwB;EAChE,MAAM,cAAc,kBAAkB,YAAY,YAAY;EAC9D,MAAM,WAAW,qBAAqB;EACtC,IAAI,CAAC,UAAU,QACb,OAAO;EAGT,MAAM,eAAe,KAAK,gBAAgB,WAAW;EAKrD,OAAO,EAAE,UAJQ,SAAS,KAAK,aAAa;GAC1C;GACA,cAAc,GAAG,aAAa,GAAG;EACnC,EACgB,EAAE;CACpB;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,6BAA6B;GACtD,KAAK,eAAe,OAAO;GAC3B,UAAU;GACV,WAAW;EACb,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,2BAA+D;EAC3E,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAC/B,uBACA,yBACF;EACA,OAAO;CACT;CAEA,0BAA8D;EAC5D,OAAO,UACL;GACE,WAAW,cAAc,6BAA6B;GACtD,KAAK;GACL,YAAY;GACZ,WAAW;EACb,SACM,KAAK,yBAAyB,CACtC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["azureRestApiVersioningApi.id"],"sources":["../../../../lib/modules/datasource/azure-bicep-resource/index.ts"],"sourcesContent":["import * as azureRestApiVersioningApi from '../../versioning/azure-rest-api/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { BicepResourceVersionIndex } from './schema.ts';\n\nconst BICEP_TYPES_INDEX_URL =\n 'https://raw.githubusercontent.com/Azure/bicep-types-az/main/generated/index.json';\n\nexport class AzureBicepResourceDatasource extends Datasource {\n static readonly id = 'azure-bicep-resource';\n\n override readonly defaultConfig = {\n commitMessageTopic: 'resource {{depName}}',\n commitMessageExtra: 'to {{{newVersion}}}',\n prBodyColumns: ['Resource', 'Change'],\n prBodyDefinitions: {\n Resource: '{{{depNameLinked}}}',\n },\n };\n\n override readonly defaultVersioning = azureRestApiVersioningApi.id;\n\n constructor() {\n super(AzureBicepResourceDatasource.id);\n }\n\n private getChangelogUrl(packageName: string): string {\n const firstSlashIndex = packageName.indexOf('/');\n const namespaceProvider = packageName.slice(0, firstSlashIndex);\n const type = packageName.slice(firstSlashIndex + 1);\n return `https://learn.microsoft.com/en-us/azure/templates/${namespaceProvider}/change-log/${type}`;\n }\n\n private async fetchReleases(\n getReleasesConfig: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const resourceVersionIndex = await this.getResourceVersionIndex();\n const packageName = getReleasesConfig.packageName.toLowerCase();\n const versions = resourceVersionIndex[packageName];\n if (!versions?.length) {\n return null;\n }\n\n const changelogUrl = this.getChangelogUrl(packageName);\n const releases = versions.map((version) => ({\n version,\n changelogUrl: `${changelogUrl}#${version}`,\n }));\n return { releases };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `getReleases-${config.packageName}`,\n fallback: true,\n cacheable: true,\n },\n () => this.fetchReleases(config),\n );\n }\n\n private async fetchResourceVersionIndex(): Promise<BicepResourceVersionIndex> {\n const { body } = await this.http.getJson(\n BICEP_TYPES_INDEX_URL,\n BicepResourceVersionIndex,\n );\n return body;\n }\n\n getResourceVersionIndex(): Promise<BicepResourceVersionIndex> {\n return this.cached(\n {\n key: 'getResourceVersionIndex',\n ttlMinutes: 24 * 60,\n cacheable: true,\n },\n () => this.fetchResourceVersionIndex(),\n );\n }\n}\n"],"mappings":";;;;AAKA,MAAM,wBACJ;AAEF,IAAa,+BAAb,MAAa,qCAAqC,WAAW;CAC3D,OAAgB,KAAK;CAErB,gBAAkC;EAChC,oBAAoB;EACpB,oBAAoB;EACpB,eAAe,CAAC,YAAY,QAAQ;EACpC,mBAAmB,EACjB,UAAU,sBACZ;CACF;CAEA,oBAAsCA;CAEtC,cAAc;EACZ,MAAM,6BAA6B,EAAE;CACvC;CAEA,gBAAwB,aAA6B;EACnD,MAAM,kBAAkB,YAAY,QAAQ,GAAG;EAG/C,OAAO,qDAFmB,YAAY,MAAM,GAAG,eAE6B,EAAE,cADjE,YAAY,MAAM,kBAAkB,CAC8C;CACjG;CAEA,MAAc,cACZ,mBAC+B;EAC/B,MAAM,uBAAuB,MAAM,KAAK,wBAAwB;EAChE,MAAM,cAAc,kBAAkB,YAAY,YAAY;EAC9D,MAAM,WAAW,qBAAqB;EACtC,IAAI,CAAC,UAAU,QACb,OAAO;EAGT,MAAM,eAAe,KAAK,gBAAgB,WAAW;EAKrD,OAAO,EAAE,UAJQ,SAAS,KAAK,aAAa;GAC1C;GACA,cAAc,GAAG,aAAa,GAAG;EACnC,EACgB,EAAE;CACpB;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,eAAe,OAAO;GAC3B,UAAU;GACV,WAAW;EACb,SACM,KAAK,cAAc,MAAM,CACjC;CACF;CAEA,MAAc,4BAAgE;EAC5E,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAC/B,uBACA,yBACF;EACA,OAAO;CACT;CAEA,0BAA8D;EAC5D,OAAO,KAAK,OACV;GACE,KAAK;GACL,YAAY;GACZ,WAAW;EACb,SACM,KAAK,0BAA0B,CACvC;CACF;AACF"}
@@ -4,7 +4,6 @@ import { isValidLocalPath, readLocalFile } from "../../../util/fs/index.js";
4
4
  import { Json } from "../../../util/schema-utils/index.js";
5
5
  import { BzlmodVersion } from "../../versioning/bazel-module/bzlmod-version.js";
6
6
  import { id } from "../../versioning/bazel-module/index.js";
7
- import { withCache } from "../../../util/cache/package/with-cache.js";
8
7
  import { RequestError } from "../../../util/http/got.js";
9
8
  import "../../../util/http/index.js";
10
9
  import { Datasource } from "../datasource.js";
@@ -25,7 +24,7 @@ var BazelDatasource = class BazelDatasource extends Datasource {
25
24
  constructor() {
26
25
  super(BazelDatasource.id);
27
26
  }
28
- async _getReleases({ registryUrl, packageName }) {
27
+ async fetchReleases({ registryUrl, packageName }) {
29
28
  const path = BazelDatasource.packageMetadataPath(packageName);
30
29
  const url = joinUrlParts(registryUrl, path);
31
30
  const result = { releases: [] };
@@ -54,11 +53,10 @@ var BazelDatasource = class BazelDatasource extends Datasource {
54
53
  return result.releases.length ? result : null;
55
54
  }
56
55
  getReleases(config) {
57
- return withCache({
58
- namespace: `datasource-${BazelDatasource.id}`,
56
+ return this.cached({
59
57
  key: `${config.registryUrl}:${config.packageName}`,
60
58
  fallback: true
61
- }, () => this._getReleases(config));
59
+ }, () => this.fetchReleases(config));
62
60
  }
63
61
  };
64
62
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["bazelVersioningId","HttpError"],"sources":["../../../../lib/modules/datasource/bazel/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { isValidLocalPath, readLocalFile } from '../../../util/fs/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { Json } from '../../../util/schema-utils/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { BzlmodVersion } from '../../versioning/bazel-module/bzlmod-version.ts';\nimport { id as bazelVersioningId } from '../../versioning/bazel-module/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BazelModuleMetadata } from './schema.ts';\n\nexport class BazelDatasource extends Datasource {\n static readonly id = 'bazel';\n\n static readonly bazelCentralRepoUrl =\n 'https://raw.githubusercontent.com/bazelbuild/bazel-central-registry/main';\n\n override readonly defaultRegistryUrls = [BazelDatasource.bazelCentralRepoUrl];\n override readonly registryStrategy = 'hunt';\n override readonly customRegistrySupport = true;\n override readonly caching = true;\n override readonly defaultVersioning = bazelVersioningId;\n\n static packageMetadataPath(packageName: string): string {\n return `/modules/${packageName}/metadata.json`;\n }\n\n constructor() {\n super(BazelDatasource.id);\n }\n\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const path = BazelDatasource.packageMetadataPath(packageName);\n const url = joinUrlParts(registryUrl!, path);\n const result: ReleaseResult = { releases: [] };\n try {\n let metadata: BazelModuleMetadata;\n const FILE_PREFIX = 'file://';\n if (url.startsWith(FILE_PREFIX)) {\n const filePath = url.slice(FILE_PREFIX.length);\n if (!isValidLocalPath(filePath)) {\n return null;\n }\n const fileContent = await readLocalFile(filePath, 'utf8');\n if (!fileContent) {\n return null;\n }\n metadata = Json.pipe(BazelModuleMetadata).parse(fileContent);\n } else {\n const response = await this.http.getJson(url, BazelModuleMetadata);\n metadata = response.body;\n }\n\n result.releases = metadata.versions\n .map((v) => new BzlmodVersion(v))\n .sort(BzlmodVersion.defaultCompare)\n .map((bv) => {\n const release: Release = { version: bv.original };\n if (isTruthy(metadata.yanked_versions?.[bv.original])) {\n release.isDeprecated = true;\n }\n return release;\n });\n if (metadata.homepage) {\n result.homepage = metadata.homepage;\n }\n } catch (err) {\n if (err instanceof HttpError) {\n if (err.response?.statusCode === 404) {\n return null;\n }\n throw new ExternalHostError(err);\n }\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-${BazelDatasource.id}`,\n key: `${config.registryUrl!}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAgB,KAAK;CAErB,OAAgB,sBACd;CAEF,sBAAwC,CAAC,gBAAgB,mBAAmB;CAC5E,mBAAqC;CACrC,wBAA0C;CAC1C,UAA4B;CAC5B,oBAAsCA;CAEtC,OAAO,oBAAoB,aAA6B;EACtD,OAAO,YAAY,YAAY;CACjC;CAEA,cAAc;EACZ,MAAM,gBAAgB,EAAE;CAC1B;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,OAAO,gBAAgB,oBAAoB,WAAW;EAC5D,MAAM,MAAM,aAAa,aAAc,IAAI;EAC3C,MAAM,SAAwB,EAAE,UAAU,CAAC,EAAE;EAC7C,IAAI;GACF,IAAI;GAEJ,IAAI,IAAI,WAAW,SAAW,GAAG;IAC/B,MAAM,WAAW,IAAI,MAAM,CAAkB;IAC7C,IAAI,CAAC,iBAAiB,QAAQ,GAC5B,OAAO;IAET,MAAM,cAAc,MAAM,cAAc,UAAU,MAAM;IACxD,IAAI,CAAC,aACH,OAAO;IAET,WAAW,KAAK,KAAK,mBAAmB,CAAC,CAAC,MAAM,WAAW;GAC7D,OAEE,YAAW,MADY,KAAK,KAAK,QAAQ,KAAK,mBAAmB,EAAA,CAC7C;GAGtB,OAAO,WAAW,SAAS,SACxB,KAAK,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAChC,KAAK,cAAc,cAAc,CAAC,CAClC,KAAK,OAAO;IACX,MAAM,UAAmB,EAAE,SAAS,GAAG,SAAS;IAChD,IAAI,SAAS,SAAS,kBAAkB,GAAG,SAAS,GAClD,QAAQ,eAAe;IAEzB,OAAO;GACT,CAAC;GACH,IAAI,SAAS,UACX,OAAO,WAAW,SAAS;EAE/B,SAAS,KAAK;GACZ,IAAI,eAAeC,cAAW;IAC5B,IAAI,IAAI,UAAU,eAAe,KAC/B,OAAO;IAET,MAAM,IAAI,kBAAkB,GAAG;GACjC;GACA,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,gBAAgB;GACzC,KAAK,GAAG,OAAO,YAAa,GAAG,OAAO;GACtC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["bazelVersioningId","HttpError"],"sources":["../../../../lib/modules/datasource/bazel/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { isValidLocalPath, readLocalFile } from '../../../util/fs/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { Json } from '../../../util/schema-utils/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { BzlmodVersion } from '../../versioning/bazel-module/bzlmod-version.ts';\nimport { id as bazelVersioningId } from '../../versioning/bazel-module/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BazelModuleMetadata } from './schema.ts';\n\nexport class BazelDatasource extends Datasource {\n static readonly id = 'bazel';\n\n static readonly bazelCentralRepoUrl =\n 'https://raw.githubusercontent.com/bazelbuild/bazel-central-registry/main';\n\n override readonly defaultRegistryUrls = [BazelDatasource.bazelCentralRepoUrl];\n override readonly registryStrategy = 'hunt';\n override readonly customRegistrySupport = true;\n override readonly caching = true;\n override readonly defaultVersioning = bazelVersioningId;\n\n static packageMetadataPath(packageName: string): string {\n return `/modules/${packageName}/metadata.json`;\n }\n\n constructor() {\n super(BazelDatasource.id);\n }\n\n private async fetchReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const path = BazelDatasource.packageMetadataPath(packageName);\n const url = joinUrlParts(registryUrl!, path);\n const result: ReleaseResult = { releases: [] };\n try {\n let metadata: BazelModuleMetadata;\n const FILE_PREFIX = 'file://';\n if (url.startsWith(FILE_PREFIX)) {\n const filePath = url.slice(FILE_PREFIX.length);\n if (!isValidLocalPath(filePath)) {\n return null;\n }\n const fileContent = await readLocalFile(filePath, 'utf8');\n if (!fileContent) {\n return null;\n }\n metadata = Json.pipe(BazelModuleMetadata).parse(fileContent);\n } else {\n const response = await this.http.getJson(url, BazelModuleMetadata);\n metadata = response.body;\n }\n\n result.releases = metadata.versions\n .map((v) => new BzlmodVersion(v))\n .sort(BzlmodVersion.defaultCompare)\n .map((bv) => {\n const release: Release = { version: bv.original };\n if (isTruthy(metadata.yanked_versions?.[bv.original])) {\n release.isDeprecated = true;\n }\n return release;\n });\n if (metadata.homepage) {\n result.homepage = metadata.homepage;\n }\n } catch (err) {\n if (err instanceof HttpError) {\n if (err.response?.statusCode === 404) {\n return null;\n }\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `${config.registryUrl!}:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAgB,KAAK;CAErB,OAAgB,sBACd;CAEF,sBAAwC,CAAC,gBAAgB,mBAAmB;CAC5E,mBAAqC;CACrC,wBAA0C;CAC1C,UAA4B;CAC5B,oBAAsCA;CAEtC,OAAO,oBAAoB,aAA6B;EACtD,OAAO,YAAY,YAAY;CACjC;CAEA,cAAc;EACZ,MAAM,gBAAgB,EAAE;CAC1B;CAEA,MAAc,cAAc,EAC1B,aACA,eACmD;EACnD,MAAM,OAAO,gBAAgB,oBAAoB,WAAW;EAC5D,MAAM,MAAM,aAAa,aAAc,IAAI;EAC3C,MAAM,SAAwB,EAAE,UAAU,CAAC,EAAE;EAC7C,IAAI;GACF,IAAI;GAEJ,IAAI,IAAI,WAAW,SAAW,GAAG;IAC/B,MAAM,WAAW,IAAI,MAAM,CAAkB;IAC7C,IAAI,CAAC,iBAAiB,QAAQ,GAC5B,OAAO;IAET,MAAM,cAAc,MAAM,cAAc,UAAU,MAAM;IACxD,IAAI,CAAC,aACH,OAAO;IAET,WAAW,KAAK,KAAK,mBAAmB,CAAC,CAAC,MAAM,WAAW;GAC7D,OAEE,YAAW,MADY,KAAK,KAAK,QAAQ,KAAK,mBAAmB,EAAA,CAC7C;GAGtB,OAAO,WAAW,SAAS,SACxB,KAAK,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAChC,KAAK,cAAc,cAAc,CAAC,CAClC,KAAK,OAAO;IACX,MAAM,UAAmB,EAAE,SAAS,GAAG,SAAS;IAChD,IAAI,SAAS,SAAS,kBAAkB,GAAG,SAAS,GAClD,QAAQ,eAAe;IAEzB,OAAO;GACT,CAAC;GACH,IAAI,SAAS,UACX,OAAO,WAAW,SAAS;EAE/B,SAAS,KAAK;GACZ,IAAI,eAAeC,cAAW;IAC5B,IAAI,IAAI,UAAU,eAAe,KAC/B,OAAO;IAET,MAAM,IAAI,kBAAkB,GAAG;GACjC;GACA,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,GAAG,OAAO,YAAa,GAAG,OAAO;GACtC,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
@@ -12,12 +12,12 @@ import { ZodError } from "zod/v4";
12
12
  var BitbucketServerTagsDatasource = class BitbucketServerTagsDatasource extends Datasource {
13
13
  static id = "bitbucket-server-tags";
14
14
  http = new BitbucketServerHttp(BitbucketServerTagsDatasource.id);
15
- static sourceUrlSupport = "package";
16
- static sourceUrlNote = "The source URL is determined by using the `packageName` and `registryUrl`.";
17
15
  static cacheNamespace = `datasource-${BitbucketServerTagsDatasource.id}`;
18
16
  constructor() {
19
17
  super(BitbucketServerTagsDatasource.id);
20
18
  }
19
+ sourceUrlSupport = "package";
20
+ sourceUrlNote = "The source URL is determined by using the `packageName` and `registryUrl`.";
21
21
  static getRegistryURL(registryUrl) {
22
22
  return registryUrl?.replace(regEx(/\/rest\/api\/1.0$/), "");
23
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-server-tags/index.ts"],"sourcesContent":["import { ZodError } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketServerHttp } from '../../../util/http/bitbucket-server.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { Result } from '../../../util/result.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport { DigestsConfig, ReleasesConfig } from '../schema.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport {\n BitbucketServerCommits,\n BitbucketServerTag,\n BitbucketServerTags,\n} from './schema.ts';\n\nexport class BitbucketServerTagsDatasource extends Datasource {\n static readonly id = 'bitbucket-server-tags';\n\n override http = new BitbucketServerHttp(BitbucketServerTagsDatasource.id);\n\n static readonly sourceUrlSupport = 'package';\n static readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketServerTagsDatasource.id}`;\n\n constructor() {\n super(BitbucketServerTagsDatasource.id);\n }\n\n static getRegistryURL(registryUrl: string): string {\n return registryUrl?.replace(regEx(/\\/rest\\/api\\/1.0$/), '');\n }\n\n static getSourceUrl(\n projectKey: string,\n repositorySlug: string,\n registryUrl: string,\n ): string {\n const url = BitbucketServerTagsDatasource.getRegistryURL(registryUrl);\n return `${ensureTrailingSlash(url)}projects/${projectKey}/repos/${repositorySlug}`;\n }\n\n static getApiUrl(registryUrl: string): string {\n const res = BitbucketServerTagsDatasource.getRegistryURL(registryUrl);\n return `${ensureTrailingSlash(res)}rest/api/1.0/`;\n }\n\n static getCacheKey(\n registryUrl: string | undefined,\n repo: string,\n type: string,\n ): string {\n return `${BitbucketServerTagsDatasource.getRegistryURL(registryUrl ?? '')}:${repo}:${type}`;\n }\n\n // getReleases fetches list of tags for the repository\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { registryUrl, packageName } = config;\n const [projectKey, repositorySlug] = packageName.split('/');\n if (!registryUrl) {\n logger.debug('Missing registryUrl');\n return null;\n }\n\n const result = Result.parse(config, ReleasesConfig)\n .transform(({ registryUrl }) => {\n const url = `${BitbucketServerTagsDatasource.getApiUrl(registryUrl)}projects/${projectKey}/repos/${repositorySlug}/tags`;\n\n return this.http.getJsonSafe(\n url,\n { paginate: true },\n BitbucketServerTags,\n );\n })\n .transform((tags) =>\n tags.map(({ displayId, hash }) => ({\n version: displayId,\n gitRef: displayId,\n newDigest: hash ?? undefined,\n })),\n )\n .transform((versions): ReleaseResult => {\n return {\n sourceUrl: BitbucketServerTagsDatasource.getSourceUrl(\n projectKey,\n repositorySlug,\n registryUrl,\n ),\n registryUrl:\n BitbucketServerTagsDatasource.getRegistryURL(registryUrl),\n releases: versions,\n };\n });\n const { val, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'bitbucket-server-tags: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'tags',\n ),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n // getTagCommit fetches the commit hash for the specified tag\n private async _getTagCommit(\n baseUrl: string,\n tag: string,\n ): Promise<string | null> {\n const bitbucketServerTag = (\n await this.http.getJson(`${baseUrl}/tags/${tag}`, BitbucketServerTag)\n ).body;\n\n return bitbucketServerTag.hash ?? null;\n }\n\n getTagCommit(\n baseUrl: string,\n tag: string,\n config: DigestConfig,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n `tag-${tag}`,\n ),\n },\n () => this._getTagCommit(baseUrl, tag),\n );\n }\n\n // getDigest fetches the latest commit for repository main branch.\n // If newValue is provided, then getTagCommit is called\n private async _getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n const { registryUrl, packageName } = config;\n const [projectKey, repositorySlug] = packageName.split('/');\n if (!registryUrl) {\n logger.debug('Missing registryUrl');\n return null;\n }\n\n const baseUrl = `${BitbucketServerTagsDatasource.getApiUrl(registryUrl)}projects/${projectKey}/repos/${repositorySlug}`;\n\n if (newValue?.length) {\n return this.getTagCommit(baseUrl, newValue, config);\n }\n\n const result = Result.parse(config, DigestsConfig)\n .transform(() => {\n const url = `${baseUrl}/commits?ignoreMissing=true`;\n\n return this.http.getJsonSafe(\n url,\n {\n paginate: true,\n limit: 1,\n maxPages: 1,\n },\n BitbucketServerCommits,\n );\n })\n .transform((commits) => {\n return commits[0]?.id;\n });\n\n const { val = null, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'bitbucket-server-tags: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'digest',\n ),\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-server-tags/index.ts"],"sourcesContent":["import { ZodError } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketServerHttp } from '../../../util/http/bitbucket-server.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { Result } from '../../../util/result.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport { DigestsConfig, ReleasesConfig } from '../schema.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport {\n BitbucketServerCommits,\n BitbucketServerTag,\n BitbucketServerTags,\n} from './schema.ts';\n\nexport class BitbucketServerTagsDatasource extends Datasource {\n static readonly id = 'bitbucket-server-tags';\n\n override http = new BitbucketServerHttp(BitbucketServerTagsDatasource.id);\n\n static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketServerTagsDatasource.id}`;\n\n constructor() {\n super(BitbucketServerTagsDatasource.id);\n }\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n static getRegistryURL(registryUrl: string): string {\n return registryUrl?.replace(regEx(/\\/rest\\/api\\/1.0$/), '');\n }\n\n static getSourceUrl(\n projectKey: string,\n repositorySlug: string,\n registryUrl: string,\n ): string {\n const url = BitbucketServerTagsDatasource.getRegistryURL(registryUrl);\n return `${ensureTrailingSlash(url)}projects/${projectKey}/repos/${repositorySlug}`;\n }\n\n static getApiUrl(registryUrl: string): string {\n const res = BitbucketServerTagsDatasource.getRegistryURL(registryUrl);\n return `${ensureTrailingSlash(res)}rest/api/1.0/`;\n }\n\n static getCacheKey(\n registryUrl: string | undefined,\n repo: string,\n type: string,\n ): string {\n return `${BitbucketServerTagsDatasource.getRegistryURL(registryUrl ?? '')}:${repo}:${type}`;\n }\n\n // getReleases fetches list of tags for the repository\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { registryUrl, packageName } = config;\n const [projectKey, repositorySlug] = packageName.split('/');\n if (!registryUrl) {\n logger.debug('Missing registryUrl');\n return null;\n }\n\n const result = Result.parse(config, ReleasesConfig)\n .transform(({ registryUrl }) => {\n const url = `${BitbucketServerTagsDatasource.getApiUrl(registryUrl)}projects/${projectKey}/repos/${repositorySlug}/tags`;\n\n return this.http.getJsonSafe(\n url,\n { paginate: true },\n BitbucketServerTags,\n );\n })\n .transform((tags) =>\n tags.map(({ displayId, hash }) => ({\n version: displayId,\n gitRef: displayId,\n newDigest: hash ?? undefined,\n })),\n )\n .transform((versions): ReleaseResult => {\n return {\n sourceUrl: BitbucketServerTagsDatasource.getSourceUrl(\n projectKey,\n repositorySlug,\n registryUrl,\n ),\n registryUrl:\n BitbucketServerTagsDatasource.getRegistryURL(registryUrl),\n releases: versions,\n };\n });\n const { val, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'bitbucket-server-tags: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'tags',\n ),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n // getTagCommit fetches the commit hash for the specified tag\n private async _getTagCommit(\n baseUrl: string,\n tag: string,\n ): Promise<string | null> {\n const bitbucketServerTag = (\n await this.http.getJson(`${baseUrl}/tags/${tag}`, BitbucketServerTag)\n ).body;\n\n return bitbucketServerTag.hash ?? null;\n }\n\n getTagCommit(\n baseUrl: string,\n tag: string,\n config: DigestConfig,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n `tag-${tag}`,\n ),\n },\n () => this._getTagCommit(baseUrl, tag),\n );\n }\n\n // getDigest fetches the latest commit for repository main branch.\n // If newValue is provided, then getTagCommit is called\n private async _getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n const { registryUrl, packageName } = config;\n const [projectKey, repositorySlug] = packageName.split('/');\n if (!registryUrl) {\n logger.debug('Missing registryUrl');\n return null;\n }\n\n const baseUrl = `${BitbucketServerTagsDatasource.getApiUrl(registryUrl)}projects/${projectKey}/repos/${repositorySlug}`;\n\n if (newValue?.length) {\n return this.getTagCommit(baseUrl, newValue, config);\n }\n\n const result = Result.parse(config, DigestsConfig)\n .transform(() => {\n const url = `${baseUrl}/commits?ignoreMissing=true`;\n\n return this.http.getJsonSafe(\n url,\n {\n paginate: true,\n limit: 1,\n maxPages: 1,\n },\n BitbucketServerCommits,\n );\n })\n .transform((commits) => {\n return commits[0]?.id;\n });\n\n const { val = null, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'bitbucket-server-tags: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketServerTagsDatasource.cacheNamespace,\n key: BitbucketServerTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'digest',\n ),\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":"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"}
@@ -9,17 +9,16 @@ import { BitbucketCommits, BitbucketTag, BitbucketTags } from "./schema.js";
9
9
  var BitbucketTagsDatasource = class BitbucketTagsDatasource extends Datasource {
10
10
  static id = "bitbucket-tags";
11
11
  bitbucketHttp = new BitbucketHttp(BitbucketTagsDatasource.id);
12
- static customRegistrySupport = true;
13
- static registryStrategy = "first";
14
12
  static defaultRegistryUrls = ["https://bitbucket.org"];
15
- static releaseTimestampSupport = true;
16
- static releaseTimestampNote = "The release timestamp is determined from the `date` field in the results.";
17
- static sourceUrlSupport = "package";
18
- static sourceUrlNote = "The source URL is determined by using the `packageName` and `registryUrl`.";
19
13
  static cacheNamespace = `datasource-${BitbucketTagsDatasource.id}`;
20
14
  constructor() {
21
15
  super(BitbucketTagsDatasource.id);
22
16
  }
17
+ defaultRegistryUrls = BitbucketTagsDatasource.defaultRegistryUrls;
18
+ releaseTimestampSupport = true;
19
+ releaseTimestampNote = "The release timestamp is determined from the `date` field in the results.";
20
+ sourceUrlSupport = "package";
21
+ sourceUrlNote = "The source URL is determined by using the `packageName` and `registryUrl`.";
23
22
  static getRegistryURL(registryUrl) {
24
23
  return registryUrl ?? this.defaultRegistryUrls[0];
25
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-tags/index.ts"],"sourcesContent":["import type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketHttp } from '../../../util/http/bitbucket.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { RepoInfo } from '../../platform/bitbucket/schema.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport { BitbucketCommits, BitbucketTag, BitbucketTags } from './schema.ts';\n\nexport class BitbucketTagsDatasource extends Datasource {\n static readonly id = 'bitbucket-tags';\n\n bitbucketHttp = new BitbucketHttp(BitbucketTagsDatasource.id);\n\n static readonly customRegistrySupport = true;\n\n static readonly registryStrategy = 'first';\n\n static readonly defaultRegistryUrls = ['https://bitbucket.org'];\n\n static readonly releaseTimestampSupport = true;\n static readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field in the results.';\n static readonly sourceUrlSupport = 'package';\n static readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketTagsDatasource.id}`;\n\n constructor() {\n super(BitbucketTagsDatasource.id);\n }\n\n static getRegistryURL(registryUrl?: string): string {\n // fallback to default API endpoint if custom not provided\n return registryUrl ?? this.defaultRegistryUrls[0];\n }\n\n static getCacheKey(\n registryUrl: string | undefined,\n repo: string,\n type: string,\n ): string {\n return `${BitbucketTagsDatasource.getRegistryURL(\n registryUrl,\n )}:${repo}:${type}`;\n }\n\n static getSourceUrl(packageName: string, registryUrl?: string): string {\n const url = BitbucketTagsDatasource.getRegistryURL(registryUrl);\n const normalizedUrl = ensureTrailingSlash(url);\n return `${normalizedUrl}${packageName}`;\n }\n\n // getReleases fetches list of tags for the repository\n private async _getReleases({\n registryUrl,\n packageName: repo,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = `/2.0/repositories/${repo}/refs/tags`;\n const bitbucketTags = (\n await this.bitbucketHttp.getJson(url, { paginate: true }, BitbucketTags)\n ).body;\n\n const dependency: ReleaseResult = {\n sourceUrl: BitbucketTagsDatasource.getSourceUrl(repo, registryUrl),\n registryUrl: BitbucketTagsDatasource.getRegistryURL(registryUrl),\n releases: bitbucketTags.map(({ name, target }) => ({\n version: name,\n gitRef: name,\n releaseTimestamp: asTimestamp(target?.date),\n })),\n };\n\n return dependency;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'tags',\n ),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n // getTagCommit fetched the commit has for specified tag\n private async _getTagCommit(\n _registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n const url = `/2.0/repositories/${repo}/refs/tags/${tag}`;\n\n const bitbucketTag = (await this.bitbucketHttp.getJson(url, BitbucketTag))\n .body;\n\n return bitbucketTag.target?.hash ?? null;\n }\n\n getTagCommit(\n registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n `tag-${tag}`,\n ),\n },\n () => this._getTagCommit(registryUrl, repo, tag),\n );\n }\n\n private async _getMainBranch(\n _registryUrl: string,\n repo: string,\n ): Promise<string> {\n return (\n await this.bitbucketHttp.getJson(`/2.0/repositories/${repo}`, RepoInfo)\n ).body.mainbranch;\n }\n\n getMainBranch(registryUrl: string, repo: string): Promise<string> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n 'mainbranch',\n ),\n ttlMinutes: 60,\n },\n () => this._getMainBranch(registryUrl, repo),\n );\n }\n\n // getDigest fetched the latest commit for repository main branch\n // however, if newValue is provided, then getTagCommit is called\n private async _getDigest(\n { packageName: repo, registryUrl }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n if (newValue?.length) {\n return this.getTagCommit(registryUrl, repo, newValue);\n }\n\n const mainBranch = await this.getMainBranch(\n BitbucketTagsDatasource.getRegistryURL(registryUrl),\n repo,\n );\n\n const url = `/2.0/repositories/${repo}/commits/${mainBranch}`;\n const bitbucketCommits = (\n await this.bitbucketHttp.getJson(url, BitbucketCommits)\n ).body;\n\n if (bitbucketCommits.length === 0) {\n return null;\n }\n\n return bitbucketCommits[0].hash;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'digest',\n ),\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,0BAAb,MAAa,gCAAgC,WAAW;CACtD,OAAgB,KAAK;CAErB,gBAAgB,IAAI,cAAc,wBAAwB,EAAE;CAE5D,OAAgB,wBAAwB;CAExC,OAAgB,mBAAmB;CAEnC,OAAgB,sBAAsB,CAAC,uBAAuB;CAE9D,OAAgB,0BAA0B;CAC1C,OAAgB,uBACd;CACF,OAAgB,mBAAmB;CACnC,OAAgB,gBACd;CAEF,OAAgB,iBAAwC,cAAc,wBAAwB;CAE9F,cAAc;EACZ,MAAM,wBAAwB,EAAE;CAClC;CAEA,OAAO,eAAe,aAA8B;EAElD,OAAO,eAAe,KAAK,oBAAoB;CACjD;CAEA,OAAO,YACL,aACA,MACA,MACQ;EACR,OAAO,GAAG,wBAAwB,eAChC,WACF,EAAE,GAAG,KAAK,GAAG;CACf;CAEA,OAAO,aAAa,aAAqB,aAA8B;EACrE,MAAM,MAAM,wBAAwB,eAAe,WAAW;EAE9D,OAAO,GADe,oBAAoB,GACpB,IAAI;CAC5B;CAGA,MAAc,aAAa,EACzB,aACA,aAAa,QACsC;EACnD,MAAM,MAAM,qBAAqB,KAAK;EACtC,MAAM,iBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,EAAE,UAAU,KAAK,GAAG,aAAa,EAAA,CACvE;EAYF,OAAO;GATL,WAAW,wBAAwB,aAAa,MAAM,WAAW;GACjE,aAAa,wBAAwB,eAAe,WAAW;GAC/D,UAAU,cAAc,KAAK,EAAE,MAAM,cAAc;IACjD,SAAS;IACT,QAAQ;IACR,kBAAkB,YAAY,QAAQ,IAAI;GAC5C,EAAE;EAGY;CAClB;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,MACF;GACA,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAGA,MAAc,cACZ,cACA,MACA,KACwB;EACxB,MAAM,MAAM,qBAAqB,KAAK,aAAa;EAKnD,QAHsB,MAAM,KAAK,cAAc,QAAQ,KAAK,YAAY,EAAA,CACrE,KAEiB,QAAQ,QAAQ;CACtC;CAEA,aACE,aACA,MACA,KACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,OAAO,KACT;EACF,SACM,KAAK,cAAc,aAAa,MAAM,GAAG,CACjD;CACF;CAEA,MAAc,eACZ,cACA,MACiB;EACjB,QACE,MAAM,KAAK,cAAc,QAAQ,qBAAqB,QAAQ,QAAQ,EAAA,CACtE,KAAK;CACT;CAEA,cAAc,aAAqB,MAA+B;EAChE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,YACF;GACA,YAAY;EACd,SACM,KAAK,eAAe,aAAa,IAAI,CAC7C;CACF;CAIA,MAAc,WACZ,EAAE,aAAa,MAAM,eACrB,UACwB;EACxB,IAAI,UAAU,QACZ,OAAO,KAAK,aAAa,aAAa,MAAM,QAAQ;EAQtD,MAAM,MAAM,qBAAqB,KAAK,WAAW,MALxB,KAAK,cAC5B,wBAAwB,eAAe,WAAW,GAClD,IACF;EAGA,MAAM,oBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,gBAAgB,EAAA,CACtD;EAEF,IAAI,iBAAiB,WAAW,GAC9B,OAAO;EAGT,OAAO,iBAAiB,EAAE,CAAC;CAC7B;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,QACF;GACA,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-tags/index.ts"],"sourcesContent":["import type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketHttp } from '../../../util/http/bitbucket.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { RepoInfo } from '../../platform/bitbucket/schema.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport { BitbucketCommits, BitbucketTag, BitbucketTags } from './schema.ts';\n\nexport class BitbucketTagsDatasource extends Datasource {\n static readonly id = 'bitbucket-tags';\n\n bitbucketHttp = new BitbucketHttp(BitbucketTagsDatasource.id);\n\n static readonly defaultRegistryUrls = ['https://bitbucket.org'];\n\n static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketTagsDatasource.id}`;\n\n constructor() {\n super(BitbucketTagsDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n BitbucketTagsDatasource.defaultRegistryUrls;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n static getRegistryURL(registryUrl?: string): string {\n // fallback to default API endpoint if custom not provided\n return registryUrl ?? this.defaultRegistryUrls[0];\n }\n\n static getCacheKey(\n registryUrl: string | undefined,\n repo: string,\n type: string,\n ): string {\n return `${BitbucketTagsDatasource.getRegistryURL(\n registryUrl,\n )}:${repo}:${type}`;\n }\n\n static getSourceUrl(packageName: string, registryUrl?: string): string {\n const url = BitbucketTagsDatasource.getRegistryURL(registryUrl);\n const normalizedUrl = ensureTrailingSlash(url);\n return `${normalizedUrl}${packageName}`;\n }\n\n // getReleases fetches list of tags for the repository\n private async _getReleases({\n registryUrl,\n packageName: repo,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = `/2.0/repositories/${repo}/refs/tags`;\n const bitbucketTags = (\n await this.bitbucketHttp.getJson(url, { paginate: true }, BitbucketTags)\n ).body;\n\n const dependency: ReleaseResult = {\n sourceUrl: BitbucketTagsDatasource.getSourceUrl(repo, registryUrl),\n registryUrl: BitbucketTagsDatasource.getRegistryURL(registryUrl),\n releases: bitbucketTags.map(({ name, target }) => ({\n version: name,\n gitRef: name,\n releaseTimestamp: asTimestamp(target?.date),\n })),\n };\n\n return dependency;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'tags',\n ),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n // getTagCommit fetched the commit has for specified tag\n private async _getTagCommit(\n _registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n const url = `/2.0/repositories/${repo}/refs/tags/${tag}`;\n\n const bitbucketTag = (await this.bitbucketHttp.getJson(url, BitbucketTag))\n .body;\n\n return bitbucketTag.target?.hash ?? null;\n }\n\n getTagCommit(\n registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n `tag-${tag}`,\n ),\n },\n () => this._getTagCommit(registryUrl, repo, tag),\n );\n }\n\n private async _getMainBranch(\n _registryUrl: string,\n repo: string,\n ): Promise<string> {\n return (\n await this.bitbucketHttp.getJson(`/2.0/repositories/${repo}`, RepoInfo)\n ).body.mainbranch;\n }\n\n getMainBranch(registryUrl: string, repo: string): Promise<string> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n 'mainbranch',\n ),\n ttlMinutes: 60,\n },\n () => this._getMainBranch(registryUrl, repo),\n );\n }\n\n // getDigest fetched the latest commit for repository main branch\n // however, if newValue is provided, then getTagCommit is called\n private async _getDigest(\n { packageName: repo, registryUrl }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n if (newValue?.length) {\n return this.getTagCommit(registryUrl, repo, newValue);\n }\n\n const mainBranch = await this.getMainBranch(\n BitbucketTagsDatasource.getRegistryURL(registryUrl),\n repo,\n );\n\n const url = `/2.0/repositories/${repo}/commits/${mainBranch}`;\n const bitbucketCommits = (\n await this.bitbucketHttp.getJson(url, BitbucketCommits)\n ).body;\n\n if (bitbucketCommits.length === 0) {\n return null;\n }\n\n return bitbucketCommits[0].hash;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'digest',\n ),\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,0BAAb,MAAa,gCAAgC,WAAW;CACtD,OAAgB,KAAK;CAErB,gBAAgB,IAAI,cAAc,wBAAwB,EAAE;CAE5D,OAAgB,sBAAsB,CAAC,uBAAuB;CAE9D,OAAgB,iBAAwC,cAAc,wBAAwB;CAE9F,cAAc;EACZ,MAAM,wBAAwB,EAAE;CAClC;CAEA,sBACE,wBAAwB;CAE1B,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,OAAO,eAAe,aAA8B;EAElD,OAAO,eAAe,KAAK,oBAAoB;CACjD;CAEA,OAAO,YACL,aACA,MACA,MACQ;EACR,OAAO,GAAG,wBAAwB,eAChC,WACF,EAAE,GAAG,KAAK,GAAG;CACf;CAEA,OAAO,aAAa,aAAqB,aAA8B;EACrE,MAAM,MAAM,wBAAwB,eAAe,WAAW;EAE9D,OAAO,GADe,oBAAoB,GACpB,IAAI;CAC5B;CAGA,MAAc,aAAa,EACzB,aACA,aAAa,QACsC;EACnD,MAAM,MAAM,qBAAqB,KAAK;EACtC,MAAM,iBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,EAAE,UAAU,KAAK,GAAG,aAAa,EAAA,CACvE;EAYF,OAAO;GATL,WAAW,wBAAwB,aAAa,MAAM,WAAW;GACjE,aAAa,wBAAwB,eAAe,WAAW;GAC/D,UAAU,cAAc,KAAK,EAAE,MAAM,cAAc;IACjD,SAAS;IACT,QAAQ;IACR,kBAAkB,YAAY,QAAQ,IAAI;GAC5C,EAAE;EAGY;CAClB;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,MACF;GACA,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAGA,MAAc,cACZ,cACA,MACA,KACwB;EACxB,MAAM,MAAM,qBAAqB,KAAK,aAAa;EAKnD,QAHsB,MAAM,KAAK,cAAc,QAAQ,KAAK,YAAY,EAAA,CACrE,KAEiB,QAAQ,QAAQ;CACtC;CAEA,aACE,aACA,MACA,KACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,OAAO,KACT;EACF,SACM,KAAK,cAAc,aAAa,MAAM,GAAG,CACjD;CACF;CAEA,MAAc,eACZ,cACA,MACiB;EACjB,QACE,MAAM,KAAK,cAAc,QAAQ,qBAAqB,QAAQ,QAAQ,EAAA,CACtE,KAAK;CACT;CAEA,cAAc,aAAqB,MAA+B;EAChE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,YACF;GACA,YAAY;EACd,SACM,KAAK,eAAe,aAAa,IAAI,CAC7C;CACF;CAIA,MAAc,WACZ,EAAE,aAAa,MAAM,eACrB,UACwB;EACxB,IAAI,UAAU,QACZ,OAAO,KAAK,aAAa,aAAa,MAAM,QAAQ;EAQtD,MAAM,MAAM,qBAAqB,KAAK,WAAW,MALxB,KAAK,cAC5B,wBAAwB,eAAe,WAAW,GAClD,IACF;EAGA,MAAM,oBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,gBAAgB,EAAA,CACtD;EAEF,IAAI,iBAAiB,WAAW,GAC9B,OAAO;EAGT,OAAO,iBAAiB,EAAE,CAAC;CAC7B;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,QACF;GACA,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;AACF"}
@@ -3,7 +3,6 @@ import { logger } from "../../../logger/index.js";
3
3
  import { joinUrlParts } from "../../../util/url.js";
4
4
  import { detectPlatform } from "../../../util/common.js";
5
5
  import { api } from "../../versioning/semver/index.js";
6
- import { withCache } from "../../../util/cache/package/with-cache.js";
7
6
  import { Datasource } from "../datasource.js";
8
7
  import { parseGitUrl } from "../../../util/git/url.js";
9
8
  import { GithubHttp } from "../../../util/http/github.js";
@@ -24,7 +23,7 @@ var BitriseDatasource = class BitriseDatasource extends Datasource {
24
23
  releaseTimestampNote = "The release timestamp is determined from the `published_at` field in the results.";
25
24
  sourceUrlSupport = "release";
26
25
  sourceUrlNote = "The source URL is determined from the `source_code_url` field of the release object in the results.";
27
- async _getReleases({ packageName, registryUrl }) {
26
+ async fetchReleases({ packageName, registryUrl }) {
28
27
  /* v8 ignore next -- should never happen */
29
28
  if (!registryUrl) return null;
30
29
  const parsedUrl = parseGitUrl(registryUrl);
@@ -77,11 +76,10 @@ var BitriseDatasource = class BitriseDatasource extends Datasource {
77
76
  };
78
77
  }
79
78
  getReleases(config) {
80
- return withCache({
81
- namespace: `datasource-${BitriseDatasource.id}`,
79
+ return this.cached({
82
80
  key: `${config.registryUrl}/${config.packageName}`,
83
81
  fallback: true
84
- }, () => this._getReleases(config));
82
+ }, () => this.fetchReleases(config));
85
83
  }
86
84
  };
87
85
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["semver"],"sources":["../../../../lib/modules/datasource/bitrise/index.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { GithubContentResponse } from '../../platform/github/schema.ts';\nimport semver from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { BitriseStepFile } from './schema.ts';\n\nexport class BitriseDatasource extends Datasource {\n static readonly id = 'bitrise';\n\n override readonly http: GithubHttp;\n\n constructor() {\n super(BitriseDatasource.id);\n\n this.http = new GithubHttp(this.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = [\n 'https://github.com/bitrise-io/bitrise-steplib.git',\n ];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `source_code_url` field of the release object 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 const parsedUrl = parseGitUrl(registryUrl);\n if (detectPlatform(registryUrl) !== 'github') {\n logger.once.warn(\n { source: parsedUrl.source },\n 'Unsupported Git hoster for this datasource',\n );\n return null;\n }\n\n const result: ReleaseResult = {\n releases: [],\n };\n\n const massagedPackageName = encodeURIComponent(packageName);\n const baseApiURL =\n parsedUrl.resource === 'github.com'\n ? 'https://api.github.com'\n : `https://${parsedUrl.resource}/api/v3`;\n const packageUrl = joinUrlParts(\n baseApiURL,\n 'repos',\n parsedUrl.full_name,\n 'contents/steps',\n massagedPackageName,\n );\n\n const { body: packageRaw } = await this.http.getJson(\n packageUrl,\n GithubContentResponse,\n );\n\n if (!isArray(packageRaw)) {\n logger.warn(\n { data: packageRaw, url: packageUrl },\n 'Got unexpected response for Bitrise package location',\n );\n return null;\n }\n\n for (const versionDir of packageRaw.filter((element) =>\n semver.isValid(element.name),\n )) {\n const stepUrl = joinUrlParts(packageUrl, versionDir.name, 'step.yml');\n // TODO use getRawFile when ready #30155\n const { body } = await this.http.getJson(stepUrl, GithubContentResponse);\n if (!('content' in body)) {\n logger.warn(\n { data: body, url: stepUrl },\n 'Got unexpected response for Bitrise step location',\n );\n return null;\n }\n if (body.encoding !== 'base64') {\n logger.warn(\n { encoding: body.encoding, data: body, url: stepUrl },\n `Got unexpected encoding for Bitrise step location`,\n );\n return null;\n }\n\n const content = fromBase64(body.content);\n const { published_at, source_code_url } = BitriseStepFile.parse(content);\n\n result.releases.push({\n version: versionDir.name,\n releaseTimestamp: published_at,\n sourceUrl: source_code_url,\n });\n }\n\n // if we have no releases return null\n if (!result.releases.length) {\n return null;\n }\n\n return {\n ...result,\n homepage: `https://bitrise.io/integrations/steps/${packageName}`,\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${BitriseDatasource.id}`,\n key: `${config.registryUrl}/${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,IAAa,oBAAb,MAAa,0BAA0B,WAAW;CAChD,OAAgB,KAAK;CAErB;CAEA,cAAc;EACZ,MAAM,kBAAkB,EAAE;EAE1B,KAAK,OAAO,IAAI,WAAW,KAAK,EAAE;CACpC;CAEA,wBAA0C;CAE1C,sBAAwC,CACtC,mDACF;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,YAAY,YAAY,WAAW;EACzC,IAAI,eAAe,WAAW,MAAM,UAAU;GAC5C,OAAO,KAAK,KACV,EAAE,QAAQ,UAAU,OAAO,GAC3B,4CACF;GACA,OAAO;EACT;EAEA,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EAEA,MAAM,sBAAsB,mBAAmB,WAAW;EAC1D,MAAM,aACJ,UAAU,aAAa,eACnB,2BACA,WAAW,UAAU,SAAS;EACpC,MAAM,aAAa,aACjB,YACA,SACA,UAAU,WACV,kBACA,mBACF;EAEA,MAAM,EAAE,MAAM,eAAe,MAAM,KAAK,KAAK,QAC3C,YACA,qBACF;EAEA,IAAI,CAAC,QAAQ,UAAU,GAAG;GACxB,OAAO,KACL;IAAE,MAAM;IAAY,KAAK;GAAW,GACpC,sDACF;GACA,OAAO;EACT;EAEA,KAAK,MAAM,cAAc,WAAW,QAAQ,YAC1CA,IAAO,QAAQ,QAAQ,IAAI,CAC7B,GAAG;GACD,MAAM,UAAU,aAAa,YAAY,WAAW,MAAM,UAAU;GAEpE,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAAQ,SAAS,qBAAqB;GACvE,IAAI,EAAE,aAAa,OAAO;IACxB,OAAO,KACL;KAAE,MAAM;KAAM,KAAK;IAAQ,GAC3B,mDACF;IACA,OAAO;GACT;GACA,IAAI,KAAK,aAAa,UAAU;IAC9B,OAAO,KACL;KAAE,UAAU,KAAK;KAAU,MAAM;KAAM,KAAK;IAAQ,GACpD,mDACF;IACA,OAAO;GACT;GAEA,MAAM,UAAU,WAAW,KAAK,OAAO;GACvC,MAAM,EAAE,cAAc,oBAAoB,gBAAgB,MAAM,OAAO;GAEvE,OAAO,SAAS,KAAK;IACnB,SAAS,WAAW;IACpB,kBAAkB;IAClB,WAAW;GACb,CAAC;EACH;EAGA,IAAI,CAAC,OAAO,SAAS,QACnB,OAAO;EAGT,OAAO;GACL,GAAG;GACH,UAAU,yCAAyC;EACrD;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,kBAAkB;GAC3C,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["semver"],"sources":["../../../../lib/modules/datasource/bitrise/index.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { GithubContentResponse } from '../../platform/github/schema.ts';\nimport semver from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { BitriseStepFile } from './schema.ts';\n\nexport class BitriseDatasource extends Datasource {\n static readonly id = 'bitrise';\n\n override readonly http: GithubHttp;\n\n constructor() {\n super(BitriseDatasource.id);\n\n this.http = new GithubHttp(this.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = [\n 'https://github.com/bitrise-io/bitrise-steplib.git',\n ];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `source_code_url` field of the release object in the results.';\n\n private async fetchReleases({\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 const parsedUrl = parseGitUrl(registryUrl);\n if (detectPlatform(registryUrl) !== 'github') {\n logger.once.warn(\n { source: parsedUrl.source },\n 'Unsupported Git hoster for this datasource',\n );\n return null;\n }\n\n const result: ReleaseResult = {\n releases: [],\n };\n\n const massagedPackageName = encodeURIComponent(packageName);\n const baseApiURL =\n parsedUrl.resource === 'github.com'\n ? 'https://api.github.com'\n : `https://${parsedUrl.resource}/api/v3`;\n const packageUrl = joinUrlParts(\n baseApiURL,\n 'repos',\n parsedUrl.full_name,\n 'contents/steps',\n massagedPackageName,\n );\n\n const { body: packageRaw } = await this.http.getJson(\n packageUrl,\n GithubContentResponse,\n );\n\n if (!isArray(packageRaw)) {\n logger.warn(\n { data: packageRaw, url: packageUrl },\n 'Got unexpected response for Bitrise package location',\n );\n return null;\n }\n\n for (const versionDir of packageRaw.filter((element) =>\n semver.isValid(element.name),\n )) {\n const stepUrl = joinUrlParts(packageUrl, versionDir.name, 'step.yml');\n // TODO use getRawFile when ready #30155\n const { body } = await this.http.getJson(stepUrl, GithubContentResponse);\n if (!('content' in body)) {\n logger.warn(\n { data: body, url: stepUrl },\n 'Got unexpected response for Bitrise step location',\n );\n return null;\n }\n if (body.encoding !== 'base64') {\n logger.warn(\n { encoding: body.encoding, data: body, url: stepUrl },\n `Got unexpected encoding for Bitrise step location`,\n );\n return null;\n }\n\n const content = fromBase64(body.content);\n const { published_at, source_code_url } = BitriseStepFile.parse(content);\n\n result.releases.push({\n version: versionDir.name,\n releaseTimestamp: published_at,\n sourceUrl: source_code_url,\n });\n }\n\n // if we have no releases return null\n if (!result.releases.length) {\n return null;\n }\n\n return {\n ...result,\n homepage: `https://bitrise.io/integrations/steps/${packageName}`,\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `${config.registryUrl}/${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAaA,IAAa,oBAAb,MAAa,0BAA0B,WAAW;CAChD,OAAgB,KAAK;CAErB;CAEA,cAAc;EACZ,MAAM,kBAAkB,EAAE;EAE1B,KAAK,OAAO,IAAI,WAAW,KAAK,EAAE;CACpC;CAEA,wBAA0C;CAE1C,sBAAwC,CACtC,mDACF;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,cAAc,EAC1B,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,YAAY,YAAY,WAAW;EACzC,IAAI,eAAe,WAAW,MAAM,UAAU;GAC5C,OAAO,KAAK,KACV,EAAE,QAAQ,UAAU,OAAO,GAC3B,4CACF;GACA,OAAO;EACT;EAEA,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EAEA,MAAM,sBAAsB,mBAAmB,WAAW;EAC1D,MAAM,aACJ,UAAU,aAAa,eACnB,2BACA,WAAW,UAAU,SAAS;EACpC,MAAM,aAAa,aACjB,YACA,SACA,UAAU,WACV,kBACA,mBACF;EAEA,MAAM,EAAE,MAAM,eAAe,MAAM,KAAK,KAAK,QAC3C,YACA,qBACF;EAEA,IAAI,CAAC,QAAQ,UAAU,GAAG;GACxB,OAAO,KACL;IAAE,MAAM;IAAY,KAAK;GAAW,GACpC,sDACF;GACA,OAAO;EACT;EAEA,KAAK,MAAM,cAAc,WAAW,QAAQ,YAC1CA,IAAO,QAAQ,QAAQ,IAAI,CAC7B,GAAG;GACD,MAAM,UAAU,aAAa,YAAY,WAAW,MAAM,UAAU;GAEpE,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAAQ,SAAS,qBAAqB;GACvE,IAAI,EAAE,aAAa,OAAO;IACxB,OAAO,KACL;KAAE,MAAM;KAAM,KAAK;IAAQ,GAC3B,mDACF;IACA,OAAO;GACT;GACA,IAAI,KAAK,aAAa,UAAU;IAC9B,OAAO,KACL;KAAE,UAAU,KAAK;KAAU,MAAM;KAAM,KAAK;IAAQ,GACpD,mDACF;IACA,OAAO;GACT;GAEA,MAAM,UAAU,WAAW,KAAK,OAAO;GACvC,MAAM,EAAE,cAAc,oBAAoB,gBAAgB,MAAM,OAAO;GAEvE,OAAO,SAAS,KAAK;IACnB,SAAS,WAAW;IACpB,kBAAkB;IAClB,WAAW;GACb,CAAC;EACH;EAGA,IAAI,CAAC,OAAO,SAAS,QACnB,OAAO;EAGT,OAAO;GACL,GAAG;GACH,UAAU,yCAAyC;EACrD;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}