renovate 44.149.0 → 44.149.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/config/options/index.js +1 -1
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/config/presets/index.js +2 -1
  4. package/dist/config/presets/index.js.map +1 -1
  5. package/dist/global-config-option-defaults.generated.js +1 -1
  6. package/dist/global-config-option-defaults.generated.js.map +1 -1
  7. package/dist/modules/datasource/artifactory/index.js +2 -1
  8. package/dist/modules/datasource/artifactory/index.js.map +1 -1
  9. package/dist/modules/datasource/aws-eks-addon/index.js +6 -5
  10. package/dist/modules/datasource/aws-eks-addon/index.js.map +1 -1
  11. package/dist/modules/datasource/aws-machine-image/index.js +4 -3
  12. package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
  13. package/dist/modules/datasource/aws-rds/index.js +2 -1
  14. package/dist/modules/datasource/aws-rds/index.js.map +1 -1
  15. package/dist/modules/datasource/azure-bicep-resource/index.js +2 -1
  16. package/dist/modules/datasource/azure-bicep-resource/index.js.map +1 -1
  17. package/dist/modules/datasource/bazel/index.js +2 -1
  18. package/dist/modules/datasource/bazel/index.js.map +1 -1
  19. package/dist/modules/datasource/bitrise/index.js +2 -1
  20. package/dist/modules/datasource/bitrise/index.js.map +1 -1
  21. package/dist/modules/datasource/buildpacks-registry/index.js +2 -1
  22. package/dist/modules/datasource/buildpacks-registry/index.js.map +1 -1
  23. package/dist/modules/datasource/cdnjs/index.js +3 -2
  24. package/dist/modules/datasource/cdnjs/index.js.map +1 -1
  25. package/dist/modules/datasource/conan/index.js +3 -2
  26. package/dist/modules/datasource/conan/index.js.map +1 -1
  27. package/dist/modules/datasource/conda/index.js +2 -1
  28. package/dist/modules/datasource/conda/index.js.map +1 -1
  29. package/dist/modules/datasource/cpan/index.js +1 -1
  30. package/dist/modules/datasource/cpan/index.js.map +1 -1
  31. package/dist/modules/datasource/crate/index.js +17 -9
  32. package/dist/modules/datasource/crate/index.js.map +1 -1
  33. package/dist/modules/datasource/deb/index.js +3 -2
  34. package/dist/modules/datasource/deb/index.js.map +1 -1
  35. package/dist/modules/datasource/deno/index.js +4 -3
  36. package/dist/modules/datasource/deno/index.js.map +1 -1
  37. package/dist/modules/datasource/docker/index.js +9 -9
  38. package/dist/modules/datasource/docker/index.js.map +1 -1
  39. package/dist/modules/datasource/dotnet-version/index.js +2 -1
  40. package/dist/modules/datasource/dotnet-version/index.js.map +1 -1
  41. package/dist/modules/datasource/elm-package/index.js +2 -1
  42. package/dist/modules/datasource/elm-package/index.js.map +1 -1
  43. package/dist/modules/datasource/endoflife-date/index.js +2 -1
  44. package/dist/modules/datasource/endoflife-date/index.js.map +1 -1
  45. package/dist/modules/datasource/galaxy-collection/index.js +3 -2
  46. package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
  47. package/dist/modules/datasource/git-host-tags.js +6 -5
  48. package/dist/modules/datasource/git-host-tags.js.map +1 -1
  49. package/dist/modules/datasource/gitea-tags/base.js +5 -4
  50. package/dist/modules/datasource/gitea-tags/base.js.map +1 -1
  51. package/dist/modules/datasource/gitea-tags/util.js +2 -5
  52. package/dist/modules/datasource/gitea-tags/util.js.map +1 -1
  53. package/dist/modules/datasource/github-digest/index.js +3 -5
  54. package/dist/modules/datasource/github-digest/index.js.map +1 -1
  55. package/dist/modules/datasource/github-release-attachments/index.js +3 -2
  56. package/dist/modules/datasource/github-release-attachments/index.js.map +1 -1
  57. package/dist/modules/datasource/gitlab-packages/index.js +2 -1
  58. package/dist/modules/datasource/gitlab-packages/index.js.map +1 -1
  59. package/dist/modules/datasource/gitlab-releases/index.js +2 -1
  60. package/dist/modules/datasource/gitlab-releases/index.js.map +1 -1
  61. package/dist/modules/datasource/gitlab-tags/index.js +3 -2
  62. package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
  63. package/dist/modules/datasource/glasskube-packages/index.js +2 -1
  64. package/dist/modules/datasource/glasskube-packages/index.js.map +1 -1
  65. package/dist/modules/datasource/go/goproxy-parser.js +3 -2
  66. package/dist/modules/datasource/go/goproxy-parser.js.map +1 -1
  67. package/dist/modules/datasource/go/index.js +4 -3
  68. package/dist/modules/datasource/go/index.js.map +1 -1
  69. package/dist/modules/datasource/go/releases-goproxy.js +6 -3
  70. package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
  71. package/dist/modules/datasource/go/timestamp-cache.js +3 -1
  72. package/dist/modules/datasource/go/timestamp-cache.js.map +1 -1
  73. package/dist/modules/datasource/golang-version/index.js +1 -1
  74. package/dist/modules/datasource/golang-version/index.js.map +1 -1
  75. package/dist/modules/datasource/gradle-version/index.js +1 -1
  76. package/dist/modules/datasource/gradle-version/index.js.map +1 -1
  77. package/dist/modules/datasource/helm/index.js +2 -1
  78. package/dist/modules/datasource/helm/index.js.map +1 -1
  79. package/dist/modules/datasource/hermit/index.js +3 -2
  80. package/dist/modules/datasource/hermit/index.js.map +1 -1
  81. package/dist/modules/datasource/hex/index.js +3 -2
  82. package/dist/modules/datasource/hex/index.js.map +1 -1
  83. package/dist/modules/datasource/hexpm-bob/index.js +2 -1
  84. package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
  85. package/dist/modules/datasource/index.js +4 -3
  86. package/dist/modules/datasource/index.js.map +1 -1
  87. package/dist/modules/datasource/java-version/index.js +2 -1
  88. package/dist/modules/datasource/java-version/index.js.map +1 -1
  89. package/dist/modules/datasource/jsr/index.js +2 -1
  90. package/dist/modules/datasource/jsr/index.js.map +1 -1
  91. package/dist/modules/datasource/maven/index.js +2 -1
  92. package/dist/modules/datasource/maven/index.js.map +1 -1
  93. package/dist/modules/datasource/nextcloud/index.js +2 -1
  94. package/dist/modules/datasource/nextcloud/index.js.map +1 -1
  95. package/dist/modules/datasource/node-version/index.js +1 -1
  96. package/dist/modules/datasource/node-version/index.js.map +1 -1
  97. package/dist/modules/datasource/nuget/v3.js +3 -2
  98. package/dist/modules/datasource/nuget/v3.js.map +1 -1
  99. package/dist/modules/datasource/orb/index.js +2 -1
  100. package/dist/modules/datasource/orb/index.js.map +1 -1
  101. package/dist/modules/datasource/packagist/index.js +4 -3
  102. package/dist/modules/datasource/packagist/index.js.map +1 -1
  103. package/dist/modules/datasource/pod/index.js +2 -1
  104. package/dist/modules/datasource/pod/index.js.map +1 -1
  105. package/dist/modules/datasource/python-version/index.js +1 -1
  106. package/dist/modules/datasource/python-version/index.js.map +1 -1
  107. package/dist/modules/datasource/repology/index.js +2 -1
  108. package/dist/modules/datasource/repology/index.js.map +1 -1
  109. package/dist/modules/datasource/rpm/index.js +2 -1
  110. package/dist/modules/datasource/rpm/index.js.map +1 -1
  111. package/dist/modules/datasource/rubygems/index.js +2 -1
  112. package/dist/modules/datasource/rubygems/index.js.map +1 -1
  113. package/dist/modules/datasource/rubygems/metadata-cache.js +2 -1
  114. package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
  115. package/dist/modules/datasource/sbt-package/index.js +11 -10
  116. package/dist/modules/datasource/sbt-package/index.js.map +1 -1
  117. package/dist/modules/datasource/terraform-module/index.js +2 -1
  118. package/dist/modules/datasource/terraform-module/index.js.map +1 -1
  119. package/dist/modules/datasource/terraform-provider/index.js +6 -5
  120. package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
  121. package/dist/modules/datasource/unity3d/index.js +2 -1
  122. package/dist/modules/datasource/unity3d/index.js.map +1 -1
  123. package/dist/modules/datasource/unity3d-packages/index.js +2 -1
  124. package/dist/modules/datasource/unity3d-packages/index.js.map +1 -1
  125. package/dist/modules/manager/bazel/parser.js +3 -1
  126. package/dist/modules/manager/bazel/parser.js.map +1 -1
  127. package/dist/modules/manager/github-actions/extract.js +2 -1
  128. package/dist/modules/manager/github-actions/extract.js.map +1 -1
  129. package/dist/modules/manager/terraform/lockfile/hash.js +2 -1
  130. package/dist/modules/manager/terraform/lockfile/hash.js.map +1 -1
  131. package/dist/modules/platform/bitbucket/pr-cache.js +3 -2
  132. package/dist/modules/platform/bitbucket/pr-cache.js.map +1 -1
  133. package/dist/modules/platform/bitbucket-server/pr-cache.js +3 -2
  134. package/dist/modules/platform/bitbucket-server/pr-cache.js.map +1 -1
  135. package/dist/modules/platform/gitea/pr-cache.js +7 -6
  136. package/dist/modules/platform/gitea/pr-cache.js.map +1 -1
  137. package/dist/modules/platform/gitlab/pr-cache.js +3 -2
  138. package/dist/modules/platform/gitlab/pr-cache.js.map +1 -1
  139. package/dist/util/cache/package/index.js +1 -1
  140. package/dist/util/cache/package/key.js +8 -1
  141. package/dist/util/cache/package/key.js.map +1 -1
  142. package/dist/util/cache/package/with-cache.js +2 -1
  143. package/dist/util/cache/package/with-cache.js.map +1 -1
  144. package/dist/util/exec/containerbase.js +2 -1
  145. package/dist/util/exec/containerbase.js.map +1 -1
  146. package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js +2 -1
  147. package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js.map +1 -1
  148. package/dist/util/github/graphql/datasource-fetcher.js +5 -8
  149. package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
  150. package/dist/util/http/cache/memory-http-cache-provider.js +2 -1
  151. package/dist/util/http/cache/memory-http-cache-provider.js.map +1 -1
  152. package/dist/util/http/cache/package-http-cache-provider.js +2 -1
  153. package/dist/util/http/cache/package-http-cache-provider.js.map +1 -1
  154. package/dist/util/jsonata.js +2 -1
  155. package/dist/util/jsonata.js.map +1 -1
  156. package/dist/util/merge-confidence/index.js +10 -7
  157. package/dist/util/merge-confidence/index.js.map +1 -1
  158. package/dist/workers/repository/update/pr/changelog/release-notes.js +4 -5
  159. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  160. package/dist/workers/repository/update/pr/changelog/source.js +2 -1
  161. package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
  162. package/package.json +2 -2
  163. package/renovate-schema.json +2 -2
@@ -10,6 +10,7 @@ import { removedPresets } from "./common.js";
10
10
  import { mergeChildConfig } from "../utils.js";
11
11
  import { migrateConfig } from "../migration.js";
12
12
  import { compile } from "../../util/template/index.js";
13
+ import { buildCacheKey } from "../../util/cache/package/key.js";
13
14
  import { ExternalHostError } from "../../types/errors/external-host-error.js";
14
15
  import { getPreset as getPreset$1, isInternal } from "./internal/index.js";
15
16
  import { PRESET_DEP_NOT_FOUND, PRESET_RELATIVE_NO_PARENT } from "./util.js";
@@ -85,7 +86,7 @@ async function getPreset(preset, baseConfig) {
85
86
  tag
86
87
  });
87
88
  else {
88
- const cacheKey = `preset:${preset}`;
89
+ const cacheKey = buildCacheKey("preset", preset);
89
90
  const packageCache = GlobalConfig.get("presetCachePersistence") ? await import("../../util/cache/package/index.js") : void 0;
90
91
  if (packageCache) presetConfig = await packageCache.get(presetCacheNamespace, cacheKey);
91
92
  else presetConfig = get(cacheKey);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["internal.getPreset","memCache.get","migration.migrateConfig","massage.massageConfig","template.compile","internal.isInternal"],"sources":["../../../lib/config/presets/index.ts"],"sourcesContent":["import {\n isArray,\n isNullOrUndefined,\n isObject,\n isString,\n} from '@sindresorhus/is';\nimport {\n CONFIG_VALIDATION,\n HOST_BLOCKED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n} from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport { clone } from '../../util/clone.ts';\nimport { regEx } from '../../util/regex.ts';\nimport * as template from '../../util/template/index.ts';\nimport { GlobalConfig } from '../global.ts';\nimport * as massage from '../massage.ts';\nimport * as migration from '../migration.ts';\nimport type { AllConfig, RenovateConfig } from '../types.ts';\nimport { mergeChildConfig } from '../utils.ts';\nimport { removedPresets } from './common.ts';\nimport * as internal from './internal/index.ts';\nimport { parsePreset } from './parse.ts';\nimport { canonicalizeRelativePresets } from './relative.ts';\nimport type { Preset, PresetApi } from './types.ts';\nimport {\n PRESET_DEP_NOT_FOUND,\n PRESET_INVALID,\n PRESET_INVALID_JSON,\n PRESET_NOT_FOUND,\n PRESET_PROHIBITED_SUBPRESET,\n PRESET_RELATIVE_NO_PARENT,\n PRESET_RENOVATE_CONFIG_NOT_FOUND,\n} from './util.ts';\n\ninterface PresetSource {\n load: () => Promise<PresetApi>;\n\n /**\n * Whether presets from this source are hosted in a repository, which is what\n * allows them to reference other presets relatively.\n */\n repoHosted: boolean;\n}\n\nexport const presetSources: Record<string, PresetSource> = {\n forgejo: { load: () => import('./forgejo/index.ts'), repoHosted: true },\n gitea: { load: () => import('./gitea/index.ts'), repoHosted: true },\n github: { load: () => import('./github/index.ts'), repoHosted: true },\n gitlab: { load: () => import('./gitlab/index.ts'), repoHosted: true },\n http: { load: () => import('./http/index.ts'), repoHosted: false },\n local: { load: () => import('./local/index.ts'), repoHosted: true },\n npm: { load: () => import('./npm/index.ts'), repoHosted: false },\n};\n\nconst presetCacheNamespace = 'preset';\n\nexport function replaceArgs(\n obj: string,\n argMapping: Record<string, any>,\n): string;\nexport function replaceArgs(\n obj: string[],\n argMapping: Record<string, any>,\n): string[];\nexport function replaceArgs(\n obj: Record<string, any>,\n argMapping: Record<string, any>,\n): Record<string, any>;\nexport function replaceArgs(\n obj: Record<string, any>[],\n argMapping: Record<string, any>,\n): Record<string, any>[];\n\n/**\n * TODO: fix me #22198\n * @param obj\n * @param argMapping\n */\nexport function replaceArgs(obj: any, argMapping: Record<string, any>): any;\nexport function replaceArgs(\n obj: string | string[] | Record<string, any> | Record<string, any>[],\n argMapping: Record<string, any>,\n): any {\n if (isString(obj)) {\n let returnStr = obj;\n for (const [arg, argVal] of Object.entries(argMapping)) {\n const re = regEx(`{{${arg}}}`, 'g', false);\n returnStr = returnStr.replace(re, argVal);\n }\n return returnStr;\n }\n if (isArray(obj)) {\n const returnArray = [];\n for (const item of obj) {\n returnArray.push(replaceArgs(item, argMapping));\n }\n return returnArray;\n }\n if (isObject(obj)) {\n const returnObj: Record<string, any> = {};\n for (const [key, val] of Object.entries(obj)) {\n returnObj[key] = replaceArgs(val, argMapping);\n }\n return returnObj;\n }\n return obj;\n}\n\nexport async function getPreset(\n preset: string,\n baseConfig?: RenovateConfig,\n): Promise<RenovateConfig> {\n logger.trace(`getPreset(${preset})`);\n // Check if the preset has been removed or replaced\n const newPreset = removedPresets[preset];\n if (newPreset) {\n return getPreset(newPreset, baseConfig);\n }\n if (newPreset === null) {\n return {};\n }\n const parsedPreset = parsePreset(preset);\n const { presetSource, repo, presetPath, presetName, tag, params, rawParams } =\n parsedPreset;\n\n if (presetSource === 'relative') {\n throw new Error(PRESET_RELATIVE_NO_PARENT);\n }\n\n let presetConfig: Preset | null | undefined;\n\n if (presetSource === 'internal') {\n presetConfig = internal.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n } else {\n const cacheKey = `preset:${preset}`;\n const presetCachePersistence = GlobalConfig.get('presetCachePersistence');\n\n const packageCache = presetCachePersistence\n ? await import('../../util/cache/package/index.ts')\n : undefined;\n\n if (packageCache) {\n presetConfig = await packageCache.get(presetCacheNamespace, cacheKey);\n } else {\n presetConfig = memCache.get(cacheKey);\n }\n\n if (isNullOrUndefined(presetConfig)) {\n const source = await presetSources[presetSource].load();\n presetConfig = await source.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n if (packageCache) {\n await packageCache.set(\n presetCacheNamespace,\n cacheKey,\n presetConfig,\n 15,\n );\n } else {\n memCache.set(cacheKey, presetConfig);\n }\n }\n }\n\n if (!presetConfig) {\n throw new Error(PRESET_DEP_NOT_FOUND);\n }\n logger.trace({ presetConfig }, `Found preset ${preset}`);\n if (params) {\n const argMapping: Record<string, string> = {};\n for (const [index, value] of params.entries()) {\n argMapping[`arg${index}`] = value;\n }\n if (rawParams) {\n argMapping.args = rawParams;\n }\n presetConfig = replaceArgs(presetConfig, argMapping);\n }\n logger.trace({ presetConfig }, `Applied params to preset ${preset}`);\n const presetKeys = Object.keys(presetConfig);\n if (\n presetKeys.length === 2 &&\n presetKeys.includes('description') &&\n presetKeys.includes('extends')\n ) {\n // preset is just a collection of other presets\n delete presetConfig.description;\n }\n const packageListKeys = ['description', 'matchPackageNames'];\n if (presetKeys.every((key) => packageListKeys.includes(key))) {\n delete presetConfig.description;\n }\n const { migratedConfig } = migration.migrateConfig(presetConfig);\n const massagedConfig = massage.massageConfig(migratedConfig);\n if (presetSources[parsedPreset.presetSource]?.repoHosted) {\n // only presets which are hosted in a repository can contain relative\n // references, in all other presets they are left as they are and fail\n // when they are resolved\n canonicalizeRelativePresets(massagedConfig, parsedPreset);\n }\n return massagedConfig;\n}\n\nexport interface ResolveConfigPresetsResult {\n config: AllConfig;\n /** when resolving the given configuration, which internal/shared presets were discovered */\n visitedPresets: {\n /** which internal/shared presets were merged into the final config */\n merged: string[];\n /** which internal/shared presets were not merged into the final config */\n unmerged: string[];\n };\n}\n\n/**\n * @param [mergeInternalPresets=true] when resolving the config presets, whether to merge Renovate internal presets into the resulting configuration.\n * When set to `false`, this will resolve these internal presets (recursively), but not merge them.\n * This is primarily intended to be used by \"shallow config\" resolution (for logging purposes).\n */\nexport async function resolveConfigPresets(\n inputConfig: AllConfig,\n baseConfig?: RenovateConfig,\n _ignorePresets?: string[],\n existingPresets: string[] = [],\n mergeInternalPresets = true,\n): Promise<ResolveConfigPresetsResult> {\n const allVisitedPresets = {\n merged: new Set<string>(),\n unmerged: new Set<string>(),\n };\n\n let ignorePresets = clone(_ignorePresets);\n if (!ignorePresets || ignorePresets.length === 0) {\n ignorePresets = coerceArray(inputConfig.ignorePresets);\n }\n logger.trace(\n { config: inputConfig, existingPresets, mergeInternalPresets },\n 'resolveConfigPresets',\n );\n\n let config: AllConfig = {};\n // First, merge all the preset configs from left to right\n if (inputConfig.extends?.length) {\n // Compile templates\n inputConfig.extends = inputConfig.extends.map((tmpl) =>\n template.compile(tmpl, {}),\n );\n for (const preset of inputConfig.extends) {\n // don't attempt to merge any internal presets if we're not expecting to\n if (!mergeInternalPresets && internal.isInternal(preset)) {\n logger.once.trace(\n { ignoredPreset: preset, mergeInternalPresets },\n 'Not merging preset',\n );\n // ... but make sure we note that we haven't resolved it\n allVisitedPresets.unmerged.add(preset);\n continue;\n }\n\n if (shouldResolvePreset(preset, existingPresets, ignorePresets)) {\n logger.trace(`Resolving preset \"${preset}\"`);\n const fetchedPreset = await fetchPreset(\n preset,\n baseConfig,\n inputConfig,\n existingPresets,\n );\n const { config: presetConfig, visitedPresets } =\n await resolveConfigPresets(\n fetchedPreset,\n baseConfig ?? inputConfig,\n ignorePresets,\n existingPresets.concat([preset]),\n mergeInternalPresets,\n );\n config = mergeChildConfig(config, presetConfig);\n allVisitedPresets.merged.add(preset);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visitedPresets.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visitedPresets.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n }\n logger.trace({ config }, `Post-preset resolve config`);\n // Now assign \"regular\" config on top\n config = mergeChildConfig(config, inputConfig);\n delete config.extends;\n delete config.ignorePresets;\n // Any description of this config replaces the ones collated from its presets.\n // Check the length, because array options default to an empty array.\n if (config.overrideDescription?.length) {\n config.description = config.overrideDescription;\n }\n delete config.overrideDescription;\n logger.trace({ config }, `Post-merge resolve config`);\n for (const [key, val] of Object.entries(config) as [\n keyof AllConfig,\n unknown,\n ][]) {\n const ignoredKeys = ['content', 'onboardingConfig'];\n if (isArray(val)) {\n // Resolve nested objects inside arrays\n config[key] = [] as never; // type can't be narrowed\n for (const element of val) {\n if (isObject(element)) {\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n element,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n (config[key] as RenovateConfig[]).push(presetConfig);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n } else {\n (config[key] as unknown[]).push(element);\n }\n }\n } else if (isObject(val) && !ignoredKeys.includes(key)) {\n // Resolve nested objects\n logger.trace(`Resolving object \"${key}\"`);\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n val,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n config[key] = presetConfig as never; // type can't be narrowed\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n logger.trace({ config: inputConfig }, 'Input config');\n logger.trace(\n { config, visitedPresets: allVisitedPresets },\n 'Resolved config',\n );\n\n return {\n config,\n visitedPresets: {\n merged: Array.from(allVisitedPresets.merged),\n unmerged: Array.from(allVisitedPresets.unmerged),\n },\n };\n}\n\nasync function fetchPreset(\n preset: string,\n baseConfig: RenovateConfig | undefined,\n inputConfig: AllConfig,\n existingPresets: string[],\n): Promise<AllConfig> {\n try {\n return await getPreset(preset, baseConfig ?? inputConfig);\n } catch (err) {\n logger.debug({ preset, err }, 'Preset fetch error');\n if (err instanceof ExternalHostError) {\n throw err;\n }\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n throw err;\n }\n const error = new Error(CONFIG_VALIDATION);\n if (err.message === HOST_BLOCKED) {\n logger.warn(\n {\n preset,\n documentationUrl: `${GlobalConfig.get('productLinks').documentation}self-hosted-configuration/#hostrulesallowinternal`,\n },\n 'Preset host is blocked by this Renovate instance',\n );\n // a preset's response becomes configuration, so a plain hostname grant is not enough - say what the administrator actually has to configure\n error.validationError = `Preset host is blocked by this Renovate instance (${preset}). If this is intended, ask your Renovate administrator to permit it with a \\`hostRules\\` entry setting \\`allowInternal=true\\`, scoped either by \\`hostType\\` (for example \\`preset\\` or \\`npm\\`) or by a URL-prefix \\`matchHost\\``;\n } else if (err.message === PRESET_DEP_NOT_FOUND) {\n error.validationError = `Cannot find preset's package (${preset})`;\n } else if (err.message === PRESET_RENOVATE_CONFIG_NOT_FOUND) {\n error.validationError = `Preset package is missing a renovate-config entry (${preset})`;\n } else if (err.message === PRESET_NOT_FOUND) {\n error.validationError = `Preset name not found within published preset config (${preset})`;\n } else if (err.message === PRESET_INVALID) {\n error.validationError = `Preset is invalid (${preset})`;\n } else if (err.message === PRESET_PROHIBITED_SUBPRESET) {\n error.validationError = `Sub-presets cannot be combined with a custom path (${preset})`;\n } else if (err.message === PRESET_INVALID_JSON) {\n error.validationError = `Preset is invalid JSON (${preset})`;\n } else if (err.message === PRESET_RELATIVE_NO_PARENT) {\n error.validationError = `Relative preset reference cannot be resolved (${preset}). Relative presets can only be used within presets from a supported source, must stay inside their repository, and cannot be templated or used outside of a preset (for example in the repository config, inherited config, or globalExtends)`;\n } else {\n error.validationError = `Preset caused unexpected error (${preset})`;\n }\n if (existingPresets.length) {\n error.validationError +=\n '. Note: this is a *nested* preset so please contact the preset author if you are unable to fix it yourself.';\n }\n logger.info(\n { validationError: error.validationError },\n 'Throwing preset error',\n );\n throw error;\n }\n}\n\nfunction shouldResolvePreset(\n preset: string,\n existingPresets: string[],\n ignorePresets: string[],\n): boolean {\n if (existingPresets.includes(preset)) {\n logger.debug(\n `Already seen preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n if (ignorePresets.includes(preset)) {\n logger.debug(\n `Ignoring preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n return true;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["internal.getPreset","memCache.get","migration.migrateConfig","massage.massageConfig","template.compile","internal.isInternal"],"sources":["../../../lib/config/presets/index.ts"],"sourcesContent":["import {\n isArray,\n isNullOrUndefined,\n isObject,\n isString,\n} from '@sindresorhus/is';\nimport {\n CONFIG_VALIDATION,\n HOST_BLOCKED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n} from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport { buildCacheKey } from '../../util/cache/package/key.ts';\nimport { clone } from '../../util/clone.ts';\nimport { regEx } from '../../util/regex.ts';\nimport * as template from '../../util/template/index.ts';\nimport { GlobalConfig } from '../global.ts';\nimport * as massage from '../massage.ts';\nimport * as migration from '../migration.ts';\nimport type { AllConfig, RenovateConfig } from '../types.ts';\nimport { mergeChildConfig } from '../utils.ts';\nimport { removedPresets } from './common.ts';\nimport * as internal from './internal/index.ts';\nimport { parsePreset } from './parse.ts';\nimport { canonicalizeRelativePresets } from './relative.ts';\nimport type { Preset, PresetApi } from './types.ts';\nimport {\n PRESET_DEP_NOT_FOUND,\n PRESET_INVALID,\n PRESET_INVALID_JSON,\n PRESET_NOT_FOUND,\n PRESET_PROHIBITED_SUBPRESET,\n PRESET_RELATIVE_NO_PARENT,\n PRESET_RENOVATE_CONFIG_NOT_FOUND,\n} from './util.ts';\n\ninterface PresetSource {\n load: () => Promise<PresetApi>;\n\n /**\n * Whether presets from this source are hosted in a repository, which is what\n * allows them to reference other presets relatively.\n */\n repoHosted: boolean;\n}\n\nexport const presetSources: Record<string, PresetSource> = {\n forgejo: { load: () => import('./forgejo/index.ts'), repoHosted: true },\n gitea: { load: () => import('./gitea/index.ts'), repoHosted: true },\n github: { load: () => import('./github/index.ts'), repoHosted: true },\n gitlab: { load: () => import('./gitlab/index.ts'), repoHosted: true },\n http: { load: () => import('./http/index.ts'), repoHosted: false },\n local: { load: () => import('./local/index.ts'), repoHosted: true },\n npm: { load: () => import('./npm/index.ts'), repoHosted: false },\n};\n\nconst presetCacheNamespace = 'preset';\n\nexport function replaceArgs(\n obj: string,\n argMapping: Record<string, any>,\n): string;\nexport function replaceArgs(\n obj: string[],\n argMapping: Record<string, any>,\n): string[];\nexport function replaceArgs(\n obj: Record<string, any>,\n argMapping: Record<string, any>,\n): Record<string, any>;\nexport function replaceArgs(\n obj: Record<string, any>[],\n argMapping: Record<string, any>,\n): Record<string, any>[];\n\n/**\n * TODO: fix me #22198\n * @param obj\n * @param argMapping\n */\nexport function replaceArgs(obj: any, argMapping: Record<string, any>): any;\nexport function replaceArgs(\n obj: string | string[] | Record<string, any> | Record<string, any>[],\n argMapping: Record<string, any>,\n): any {\n if (isString(obj)) {\n let returnStr = obj;\n for (const [arg, argVal] of Object.entries(argMapping)) {\n const re = regEx(`{{${arg}}}`, 'g', false);\n returnStr = returnStr.replace(re, argVal);\n }\n return returnStr;\n }\n if (isArray(obj)) {\n const returnArray = [];\n for (const item of obj) {\n returnArray.push(replaceArgs(item, argMapping));\n }\n return returnArray;\n }\n if (isObject(obj)) {\n const returnObj: Record<string, any> = {};\n for (const [key, val] of Object.entries(obj)) {\n returnObj[key] = replaceArgs(val, argMapping);\n }\n return returnObj;\n }\n return obj;\n}\n\nexport async function getPreset(\n preset: string,\n baseConfig?: RenovateConfig,\n): Promise<RenovateConfig> {\n logger.trace(`getPreset(${preset})`);\n // Check if the preset has been removed or replaced\n const newPreset = removedPresets[preset];\n if (newPreset) {\n return getPreset(newPreset, baseConfig);\n }\n if (newPreset === null) {\n return {};\n }\n const parsedPreset = parsePreset(preset);\n const { presetSource, repo, presetPath, presetName, tag, params, rawParams } =\n parsedPreset;\n\n if (presetSource === 'relative') {\n throw new Error(PRESET_RELATIVE_NO_PARENT);\n }\n\n let presetConfig: Preset | null | undefined;\n\n if (presetSource === 'internal') {\n presetConfig = internal.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n } else {\n const cacheKey = buildCacheKey('preset', preset);\n const presetCachePersistence = GlobalConfig.get('presetCachePersistence');\n\n const packageCache = presetCachePersistence\n ? await import('../../util/cache/package/index.ts')\n : undefined;\n\n if (packageCache) {\n presetConfig = await packageCache.get(presetCacheNamespace, cacheKey);\n } else {\n presetConfig = memCache.get(cacheKey);\n }\n\n if (isNullOrUndefined(presetConfig)) {\n const source = await presetSources[presetSource].load();\n presetConfig = await source.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n if (packageCache) {\n await packageCache.set(\n presetCacheNamespace,\n cacheKey,\n presetConfig,\n 15,\n );\n } else {\n memCache.set(cacheKey, presetConfig);\n }\n }\n }\n\n if (!presetConfig) {\n throw new Error(PRESET_DEP_NOT_FOUND);\n }\n logger.trace({ presetConfig }, `Found preset ${preset}`);\n if (params) {\n const argMapping: Record<string, string> = {};\n for (const [index, value] of params.entries()) {\n argMapping[`arg${index}`] = value;\n }\n if (rawParams) {\n argMapping.args = rawParams;\n }\n presetConfig = replaceArgs(presetConfig, argMapping);\n }\n logger.trace({ presetConfig }, `Applied params to preset ${preset}`);\n const presetKeys = Object.keys(presetConfig);\n if (\n presetKeys.length === 2 &&\n presetKeys.includes('description') &&\n presetKeys.includes('extends')\n ) {\n // preset is just a collection of other presets\n delete presetConfig.description;\n }\n const packageListKeys = ['description', 'matchPackageNames'];\n if (presetKeys.every((key) => packageListKeys.includes(key))) {\n delete presetConfig.description;\n }\n const { migratedConfig } = migration.migrateConfig(presetConfig);\n const massagedConfig = massage.massageConfig(migratedConfig);\n if (presetSources[parsedPreset.presetSource]?.repoHosted) {\n // only presets which are hosted in a repository can contain relative\n // references, in all other presets they are left as they are and fail\n // when they are resolved\n canonicalizeRelativePresets(massagedConfig, parsedPreset);\n }\n return massagedConfig;\n}\n\nexport interface ResolveConfigPresetsResult {\n config: AllConfig;\n /** when resolving the given configuration, which internal/shared presets were discovered */\n visitedPresets: {\n /** which internal/shared presets were merged into the final config */\n merged: string[];\n /** which internal/shared presets were not merged into the final config */\n unmerged: string[];\n };\n}\n\n/**\n * @param [mergeInternalPresets=true] when resolving the config presets, whether to merge Renovate internal presets into the resulting configuration.\n * When set to `false`, this will resolve these internal presets (recursively), but not merge them.\n * This is primarily intended to be used by \"shallow config\" resolution (for logging purposes).\n */\nexport async function resolveConfigPresets(\n inputConfig: AllConfig,\n baseConfig?: RenovateConfig,\n _ignorePresets?: string[],\n existingPresets: string[] = [],\n mergeInternalPresets = true,\n): Promise<ResolveConfigPresetsResult> {\n const allVisitedPresets = {\n merged: new Set<string>(),\n unmerged: new Set<string>(),\n };\n\n let ignorePresets = clone(_ignorePresets);\n if (!ignorePresets || ignorePresets.length === 0) {\n ignorePresets = coerceArray(inputConfig.ignorePresets);\n }\n logger.trace(\n { config: inputConfig, existingPresets, mergeInternalPresets },\n 'resolveConfigPresets',\n );\n\n let config: AllConfig = {};\n // First, merge all the preset configs from left to right\n if (inputConfig.extends?.length) {\n // Compile templates\n inputConfig.extends = inputConfig.extends.map((tmpl) =>\n template.compile(tmpl, {}),\n );\n for (const preset of inputConfig.extends) {\n // don't attempt to merge any internal presets if we're not expecting to\n if (!mergeInternalPresets && internal.isInternal(preset)) {\n logger.once.trace(\n { ignoredPreset: preset, mergeInternalPresets },\n 'Not merging preset',\n );\n // ... but make sure we note that we haven't resolved it\n allVisitedPresets.unmerged.add(preset);\n continue;\n }\n\n if (shouldResolvePreset(preset, existingPresets, ignorePresets)) {\n logger.trace(`Resolving preset \"${preset}\"`);\n const fetchedPreset = await fetchPreset(\n preset,\n baseConfig,\n inputConfig,\n existingPresets,\n );\n const { config: presetConfig, visitedPresets } =\n await resolveConfigPresets(\n fetchedPreset,\n baseConfig ?? inputConfig,\n ignorePresets,\n existingPresets.concat([preset]),\n mergeInternalPresets,\n );\n config = mergeChildConfig(config, presetConfig);\n allVisitedPresets.merged.add(preset);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visitedPresets.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visitedPresets.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n }\n logger.trace({ config }, `Post-preset resolve config`);\n // Now assign \"regular\" config on top\n config = mergeChildConfig(config, inputConfig);\n delete config.extends;\n delete config.ignorePresets;\n // Any description of this config replaces the ones collated from its presets.\n // Check the length, because array options default to an empty array.\n if (config.overrideDescription?.length) {\n config.description = config.overrideDescription;\n }\n delete config.overrideDescription;\n logger.trace({ config }, `Post-merge resolve config`);\n for (const [key, val] of Object.entries(config) as [\n keyof AllConfig,\n unknown,\n ][]) {\n const ignoredKeys = ['content', 'onboardingConfig'];\n if (isArray(val)) {\n // Resolve nested objects inside arrays\n config[key] = [] as never; // type can't be narrowed\n for (const element of val) {\n if (isObject(element)) {\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n element,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n (config[key] as RenovateConfig[]).push(presetConfig);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n } else {\n (config[key] as unknown[]).push(element);\n }\n }\n } else if (isObject(val) && !ignoredKeys.includes(key)) {\n // Resolve nested objects\n logger.trace(`Resolving object \"${key}\"`);\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n val,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n config[key] = presetConfig as never; // type can't be narrowed\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n logger.trace({ config: inputConfig }, 'Input config');\n logger.trace(\n { config, visitedPresets: allVisitedPresets },\n 'Resolved config',\n );\n\n return {\n config,\n visitedPresets: {\n merged: Array.from(allVisitedPresets.merged),\n unmerged: Array.from(allVisitedPresets.unmerged),\n },\n };\n}\n\nasync function fetchPreset(\n preset: string,\n baseConfig: RenovateConfig | undefined,\n inputConfig: AllConfig,\n existingPresets: string[],\n): Promise<AllConfig> {\n try {\n return await getPreset(preset, baseConfig ?? inputConfig);\n } catch (err) {\n logger.debug({ preset, err }, 'Preset fetch error');\n if (err instanceof ExternalHostError) {\n throw err;\n }\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n throw err;\n }\n const error = new Error(CONFIG_VALIDATION);\n if (err.message === HOST_BLOCKED) {\n logger.warn(\n {\n preset,\n documentationUrl: `${GlobalConfig.get('productLinks').documentation}self-hosted-configuration/#hostrulesallowinternal`,\n },\n 'Preset host is blocked by this Renovate instance',\n );\n // a preset's response becomes configuration, so a plain hostname grant is not enough - say what the administrator actually has to configure\n error.validationError = `Preset host is blocked by this Renovate instance (${preset}). If this is intended, ask your Renovate administrator to permit it with a \\`hostRules\\` entry setting \\`allowInternal=true\\`, scoped either by \\`hostType\\` (for example \\`preset\\` or \\`npm\\`) or by a URL-prefix \\`matchHost\\``;\n } else if (err.message === PRESET_DEP_NOT_FOUND) {\n error.validationError = `Cannot find preset's package (${preset})`;\n } else if (err.message === PRESET_RENOVATE_CONFIG_NOT_FOUND) {\n error.validationError = `Preset package is missing a renovate-config entry (${preset})`;\n } else if (err.message === PRESET_NOT_FOUND) {\n error.validationError = `Preset name not found within published preset config (${preset})`;\n } else if (err.message === PRESET_INVALID) {\n error.validationError = `Preset is invalid (${preset})`;\n } else if (err.message === PRESET_PROHIBITED_SUBPRESET) {\n error.validationError = `Sub-presets cannot be combined with a custom path (${preset})`;\n } else if (err.message === PRESET_INVALID_JSON) {\n error.validationError = `Preset is invalid JSON (${preset})`;\n } else if (err.message === PRESET_RELATIVE_NO_PARENT) {\n error.validationError = `Relative preset reference cannot be resolved (${preset}). Relative presets can only be used within presets from a supported source, must stay inside their repository, and cannot be templated or used outside of a preset (for example in the repository config, inherited config, or globalExtends)`;\n } else {\n error.validationError = `Preset caused unexpected error (${preset})`;\n }\n if (existingPresets.length) {\n error.validationError +=\n '. Note: this is a *nested* preset so please contact the preset author if you are unable to fix it yourself.';\n }\n logger.info(\n { validationError: error.validationError },\n 'Throwing preset error',\n );\n throw error;\n }\n}\n\nfunction shouldResolvePreset(\n preset: string,\n existingPresets: string[],\n ignorePresets: string[],\n): boolean {\n if (existingPresets.includes(preset)) {\n logger.debug(\n `Already seen preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n if (ignorePresets.includes(preset)) {\n logger.debug(\n `Ignoring preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n return true;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAiDA,MAAa,gBAA8C;CACzD,SAAS;EAAE,YAAY,OAAO;EAAuB,YAAY;CAAK;CACtE,OAAO;EAAE,YAAY,OAAO;EAAqB,YAAY;CAAK;CAClE,QAAQ;EAAE,YAAY,OAAO;EAAsB,YAAY;CAAK;CACpE,QAAQ;EAAE,YAAY,OAAO;EAAsB,YAAY;CAAK;CACpE,MAAM;EAAE,YAAY,OAAO;EAAoB,YAAY;CAAM;CACjE,OAAO;EAAE,YAAY,OAAO;EAAqB,YAAY;CAAK;CAClE,KAAK;EAAE,YAAY,OAAO;EAAmB,YAAY;CAAM;AACjE;AAEA,MAAM,uBAAuB;AAyB7B,SAAgB,YACd,KACA,YACK;CACL,IAAI,SAAS,GAAG,GAAG;EACjB,IAAI,YAAY;EAChB,KAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,UAAU,GAAG;GACtD,MAAM,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,KAAK;GACzC,YAAY,UAAU,QAAQ,IAAI,MAAM;EAC1C;EACA,OAAO;CACT;CACA,IAAI,QAAQ,GAAG,GAAG;EAChB,MAAM,cAAc,CAAC;EACrB,KAAK,MAAM,QAAQ,KACjB,YAAY,KAAK,YAAY,MAAM,UAAU,CAAC;EAEhD,OAAO;CACT;CACA,IAAI,SAAS,GAAG,GAAG;EACjB,MAAM,YAAiC,CAAC;EACxC,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,GAAG,GACzC,UAAU,OAAO,YAAY,KAAK,UAAU;EAE9C,OAAO;CACT;CACA,OAAO;AACT;AAEA,eAAsB,UACpB,QACA,YACyB;CACzB,OAAO,MAAM,aAAa,OAAO,EAAE;CAEnC,MAAM,YAAY,eAAe;CACjC,IAAI,WACF,OAAO,UAAU,WAAW,UAAU;CAExC,IAAI,cAAc,MAChB,OAAO,CAAC;CAEV,MAAM,eAAe,YAAY,MAAM;CACvC,MAAM,EAAE,cAAc,MAAM,YAAY,YAAY,KAAK,QAAQ,cAC/D;CAEF,IAAI,iBAAiB,YACnB,MAAM,IAAI,MAAM,yBAAyB;CAG3C,IAAI;CAEJ,IAAI,iBAAiB,YACnB,eAAeA,YAAmB;EAChC;EACA;EACA;EACA;CACF,CAAC;MACI;EACL,MAAM,WAAW,cAAc,UAAU,MAAM;EAG/C,MAAM,eAFyB,aAAa,IAAI,wBAEN,IACtC,MAAM,OAAO,uCACb,KAAA;EAEJ,IAAI,cACF,eAAe,MAAM,aAAa,IAAI,sBAAsB,QAAQ;OAEpE,eAAeC,IAAa,QAAQ;EAGtC,IAAI,kBAAkB,YAAY,GAAG;GAEnC,eAAe,OAAM,MADA,cAAc,aAAa,CAAC,KAAK,EAAA,CAC1B,UAAU;IACpC;IACA;IACA;IACA;GACF,CAAC;GACD,IAAI,cACF,MAAM,aAAa,IACjB,sBACA,UACA,cACA,EACF;QAEA,IAAa,UAAU,YAAY;EAEvC;CACF;CAEA,IAAI,CAAC,cACH,MAAM,IAAI,MAAM,oBAAoB;CAEtC,OAAO,MAAM,EAAE,aAAa,GAAG,gBAAgB,QAAQ;CACvD,IAAI,QAAQ;EACV,MAAM,aAAqC,CAAC;EAC5C,KAAK,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ,GAC1C,WAAW,MAAM,WAAW;EAE9B,IAAI,WACF,WAAW,OAAO;EAEpB,eAAe,YAAY,cAAc,UAAU;CACrD;CACA,OAAO,MAAM,EAAE,aAAa,GAAG,4BAA4B,QAAQ;CACnE,MAAM,aAAa,OAAO,KAAK,YAAY;CAC3C,IACE,WAAW,WAAW,KACtB,WAAW,SAAS,aAAa,KACjC,WAAW,SAAS,SAAS,GAG7B,OAAO,aAAa;CAEtB,MAAM,kBAAkB,CAAC,eAAe,mBAAmB;CAC3D,IAAI,WAAW,OAAO,QAAQ,gBAAgB,SAAS,GAAG,CAAC,GACzD,OAAO,aAAa;CAEtB,MAAM,EAAE,mBAAmBC,cAAwB,YAAY;CAC/D,MAAM,iBAAiBC,cAAsB,cAAc;CAC3D,IAAI,cAAc,aAAa,aAAa,EAAE,YAI5C,4BAA4B,gBAAgB,YAAY;CAE1D,OAAO;AACT;;;;;;AAkBA,eAAsB,qBACpB,aACA,YACA,gBACA,kBAA4B,CAAC,GAC7B,uBAAuB,MACc;CACrC,MAAM,oBAAoB;EACxB,wBAAQ,IAAI,IAAY;EACxB,0BAAU,IAAI,IAAY;CAC5B;CAEA,IAAI,gBAAgB,MAAM,cAAc;CACxC,IAAI,CAAC,iBAAiB,cAAc,WAAW,GAC7C,gBAAgB,YAAY,YAAY,aAAa;CAEvD,OAAO,MACL;EAAE,QAAQ;EAAa;EAAiB;CAAqB,GAC7D,sBACF;CAEA,IAAI,SAAoB,CAAC;CAEzB,IAAI,YAAY,SAAS,QAAQ;EAE/B,YAAY,UAAU,YAAY,QAAQ,KAAK,SAC7CC,QAAiB,MAAM,CAAC,CAAC,CAC3B;EACA,KAAK,MAAM,UAAU,YAAY,SAAS;GAExC,IAAI,CAAC,wBAAwBC,WAAoB,MAAM,GAAG;IACxD,OAAO,KAAK,MACV;KAAE,eAAe;KAAQ;IAAqB,GAC9C,oBACF;IAEA,kBAAkB,SAAS,IAAI,MAAM;IACrC;GACF;GAEA,IAAI,oBAAoB,QAAQ,iBAAiB,aAAa,GAAG;IAC/D,OAAO,MAAM,qBAAqB,OAAO,EAAE;IAO3C,MAAM,EAAE,QAAQ,cAAc,mBAC5B,MAAM,qBACJ,MARwB,YAC1B,QACA,YACA,aACA,eACF,GAII,cAAc,aACd,eACA,gBAAgB,OAAO,CAAC,MAAM,CAAC,GAC/B,oBACF;IACF,SAAS,iBAAiB,QAAQ,YAAY;IAC9C,kBAAkB,OAAO,IAAI,MAAM;IAGnC,KAAK,MAAM,gBAAgB,eAAe,QACxC,kBAAkB,OAAO,IAAI,YAAY;IAG3C,KAAK,MAAM,kBAAkB,eAAe,UAC1C,kBAAkB,SAAS,IAAI,cAAc;GAEjD;EACF;CACF;CACA,OAAO,MAAM,EAAE,OAAO,GAAG,4BAA4B;CAErD,SAAS,iBAAiB,QAAQ,WAAW;CAC7C,OAAO,OAAO;CACd,OAAO,OAAO;CAGd,IAAI,OAAO,qBAAqB,QAC9B,OAAO,cAAc,OAAO;CAE9B,OAAO,OAAO;CACd,OAAO,MAAM,EAAE,OAAO,GAAG,2BAA2B;CACpD,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,MAAM,GAGzC;EACH,MAAM,cAAc,CAAC,WAAW,kBAAkB;EAClD,IAAI,QAAQ,GAAG,GAAG;GAEhB,OAAO,OAAO,CAAC;GACf,KAAK,MAAM,WAAW,KACpB,IAAI,SAAS,OAAO,GAAG;IACrB,MAAM,EAAE,QAAQ,cAAc,gBAAgB,YAC5C,MAAM,qBACJ,SACA,YACA,eACA,iBACA,oBACF;IACF,OAAQ,IAAI,CAAsB,KAAK,YAAY;IAGnD,KAAK,MAAM,gBAAgB,QAAQ,QACjC,kBAAkB,OAAO,IAAI,YAAY;IAG3C,KAAK,MAAM,kBAAkB,QAAQ,UACnC,kBAAkB,SAAS,IAAI,cAAc;GAEjD,OACE,OAAQ,IAAI,CAAe,KAAK,OAAO;EAG7C,OAAO,IAAI,SAAS,GAAG,KAAK,CAAC,YAAY,SAAS,GAAG,GAAG;GAEtD,OAAO,MAAM,qBAAqB,IAAI,EAAE;GACxC,MAAM,EAAE,QAAQ,cAAc,gBAAgB,YAC5C,MAAM,qBACJ,KACA,YACA,eACA,iBACA,oBACF;GACF,OAAO,OAAO;GAGd,KAAK,MAAM,gBAAgB,QAAQ,QACjC,kBAAkB,OAAO,IAAI,YAAY;GAG3C,KAAK,MAAM,kBAAkB,QAAQ,UACnC,kBAAkB,SAAS,IAAI,cAAc;EAEjD;CACF;CACA,OAAO,MAAM,EAAE,QAAQ,YAAY,GAAG,cAAc;CACpD,OAAO,MACL;EAAE;EAAQ,gBAAgB;CAAkB,GAC5C,iBACF;CAEA,OAAO;EACL;EACA,gBAAgB;GACd,QAAQ,MAAM,KAAK,kBAAkB,MAAM;GAC3C,UAAU,MAAM,KAAK,kBAAkB,QAAQ;EACjD;CACF;AACF;AAEA,eAAe,YACb,QACA,YACA,aACA,iBACoB;CACpB,IAAI;EACF,OAAO,MAAM,UAAU,QAAQ,cAAc,WAAW;CAC1D,SAAS,KAAK;EACZ,OAAO,MAAM;GAAE;GAAQ;EAAI,GAAG,oBAAoB;EAClD,IAAI,eAAe,mBACjB,MAAM;EAER,IAAI,IAAI,YAAA,uBACN,MAAM;EAER,MAAM,QAAQ,IAAI,MAAM,iBAAiB;EACzC,IAAI,IAAI,YAAA,gBAA0B;GAChC,OAAO,KACL;IACE;IACA,kBAAkB,GAAG,aAAa,IAAI,cAAc,CAAC,CAAC,cAAc;GACtE,GACA,kDACF;GAEA,MAAM,kBAAkB,qDAAqD,OAAO;EACtF,OAAO,IAAI,IAAI,YAAA,iBACb,MAAM,kBAAkB,iCAAiC,OAAO;OAC3D,IAAI,IAAI,YAAA,oCACb,MAAM,kBAAkB,sDAAsD,OAAO;OAChF,IAAI,IAAI,YAAA,oBACb,MAAM,kBAAkB,yDAAyD,OAAO;OACnF,IAAI,IAAI,YAAA,kBACb,MAAM,kBAAkB,sBAAsB,OAAO;OAChD,IAAI,IAAI,YAAA,yBACb,MAAM,kBAAkB,sDAAsD,OAAO;OAChF,IAAI,IAAI,YAAA,uBACb,MAAM,kBAAkB,2BAA2B,OAAO;OACrD,IAAI,IAAI,YAAA,iCACb,MAAM,kBAAkB,iDAAiD,OAAO;OAEhF,MAAM,kBAAkB,mCAAmC,OAAO;EAEpE,IAAI,gBAAgB,QAClB,MAAM,mBACJ;EAEJ,OAAO,KACL,EAAE,iBAAiB,MAAM,gBAAgB,GACzC,uBACF;EACA,MAAM;CACR;AACF;AAEA,SAAS,oBACP,QACA,iBACA,eACS;CACT,IAAI,gBAAgB,SAAS,MAAM,GAAG;EACpC,OAAO,MACL,uBAAuB,OAAO,OAAO,gBAAgB,KAAK,IAAI,EAAE,EAClE;EACA,OAAO;CACT;CACA,IAAI,cAAc,SAAS,MAAM,GAAG;EAClC,OAAO,MACL,mBAAmB,OAAO,OAAO,gBAAgB,KAAK,IAAI,EAAE,EAC9D;EACA,OAAO;CACT;CACA,OAAO;AACT"}
@@ -23,7 +23,7 @@ const globalConfigOptionDefaults = {
23
23
  "detectHostRulesFromEnv": false,
24
24
  "dockerChildPrefix": "renovate_",
25
25
  "dockerMaxPages": 20,
26
- "dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.118.0",
26
+ "dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.118.1",
27
27
  "dockerUser": "12021",
28
28
  "executionTimeout": 15,
29
29
  "exitCodeForErrors": false,
@@ -1 +1 @@
1
- {"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateGitRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.118.0\",\n \"dockerUser\": \"12021\",\n \"executionTimeout\": 15,\n \"exitCodeForErrors\": false,\n \"exposeAllEnv\": false,\n \"forceCli\": true,\n \"forkCreation\": true,\n \"githubTokenWarn\": true,\n \"gitNoVerify\": [\n \"commit\",\n \"push\"\n ],\n \"gitTimeout\": 0,\n \"gitUrl\": \"default\",\n \"httpCacheTtlDays\": 90,\n \"ignorePrAuthor\": false,\n \"includeMirrors\": false,\n \"inheritConfig\": false,\n \"inheritConfigFileName\": \"org-inherited-config.json\",\n \"inheritConfigRepoName\": \"{{parentOrg}}/renovate-config\",\n \"inheritConfigStrict\": false,\n \"inheritConfigTrusted\": false,\n \"internalHostAccess\": \"warn\",\n \"mergeConfidenceDatasources\": [\n \"go\",\n \"maven\",\n \"npm\",\n \"nuget\",\n \"packagist\",\n \"pypi\",\n \"rubygems\"\n ],\n \"mergeConfidenceEndpoint\": \"https://developer.mend.io/\",\n \"migratePresets\": {},\n \"onboardingBranch\": \"renovate/configure\",\n \"onboardingConfig\": {\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\"\n },\n \"onboardingConfigFileName\": \"renovate.json\",\n \"onboardingNoDeps\": \"auto\",\n \"onboardingPrTitle\": \"Configure Renovate\",\n \"onboardingRebaseCheckbox\": false,\n \"optimizeForDisabled\": false,\n \"persistRepoData\": false,\n \"platform\": \"github\",\n \"prCacheSyncMaxPages\": 100,\n \"prCommitsPerRunLimit\": 0,\n \"presetCachePersistence\": false,\n \"processEnv\": {},\n \"productLinks\": {\n \"documentation\": \"https://docs.renovatebot.com/\",\n \"help\": \"https://github.com/renovatebot/renovate/discussions\",\n \"homepage\": \"https://github.com/renovatebot/renovate\"\n },\n \"rebaseAllOpenBranches\": false,\n \"reportFormatting\": false,\n \"repositoryCache\": \"disabled\",\n \"repositoryCacheForceLocal\": false,\n \"repositoryCacheType\": \"local\",\n \"requireConfig\": \"required\",\n \"s3PathStyle\": false,\n \"secrets\": {},\n \"unicodeEmoji\": true,\n \"useCloudMetadataServices\": true,\n \"userAgent\": \"Renovate/{{renovateVersion}} (https://github.com/renovatebot/renovate)\",\n \"variables\": {}\n};\n"],"mappings":";AACA,MAAa,6BAAsD;CACjE,iCAAiC;CACjC,mBAAmB,CAAC;CACpB,cAAc,CAAC;CACf,kBAAkB,CAChB,KACF;CACA,2BAA2B,CAAC;CAC5B,gBAAgB;CAChB,gBAAgB;CAChB,4CAA4C;CAC5C,gBAAgB;CAChB,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,wBAAwB;CACxB,oBAAoB,CAAC;CACrB,mBAAmB,CAAC;CACpB,yBAAyB;CACzB,sBAAsB,CAAC;CACvB,8BAA8B;CAC9B,oBAAoB;CACpB,6BAA6B;CAC7B,0BAA0B;CAC1B,qBAAqB;CACrB,kBAAkB;CAClB,sBAAsB;CACtB,cAAc;CACd,oBAAoB;CACpB,qBAAqB;CACrB,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,eAAe,CACb,UACA,MACF;CACA,cAAc;CACd,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;CACvB,wBAAwB;CACxB,sBAAsB;CACtB,8BAA8B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,2BAA2B;CAC3B,kBAAkB,CAAC;CACnB,oBAAoB;CACpB,oBAAoB,EAClB,WAAW,oDACb;CACA,4BAA4B;CAC5B,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,uBAAuB;CACvB,mBAAmB;CACnB,YAAY;CACZ,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,cAAc,CAAC;CACf,gBAAgB;EACd,iBAAiB;EACjB,QAAQ;EACR,YAAY;CACd;CACA,yBAAyB;CACzB,oBAAoB;CACpB,mBAAmB;CACnB,6BAA6B;CAC7B,uBAAuB;CACvB,iBAAiB;CACjB,eAAe;CACf,WAAW,CAAC;CACZ,gBAAgB;CAChB,4BAA4B;CAC5B,aAAa;CACb,aAAa,CAAC;AAChB"}
1
+ {"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateGitRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.118.1\",\n \"dockerUser\": \"12021\",\n \"executionTimeout\": 15,\n \"exitCodeForErrors\": false,\n \"exposeAllEnv\": false,\n \"forceCli\": true,\n \"forkCreation\": true,\n \"githubTokenWarn\": true,\n \"gitNoVerify\": [\n \"commit\",\n \"push\"\n ],\n \"gitTimeout\": 0,\n \"gitUrl\": \"default\",\n \"httpCacheTtlDays\": 90,\n \"ignorePrAuthor\": false,\n \"includeMirrors\": false,\n \"inheritConfig\": false,\n \"inheritConfigFileName\": \"org-inherited-config.json\",\n \"inheritConfigRepoName\": \"{{parentOrg}}/renovate-config\",\n \"inheritConfigStrict\": false,\n \"inheritConfigTrusted\": false,\n \"internalHostAccess\": \"warn\",\n \"mergeConfidenceDatasources\": [\n \"go\",\n \"maven\",\n \"npm\",\n \"nuget\",\n \"packagist\",\n \"pypi\",\n \"rubygems\"\n ],\n \"mergeConfidenceEndpoint\": \"https://developer.mend.io/\",\n \"migratePresets\": {},\n \"onboardingBranch\": \"renovate/configure\",\n \"onboardingConfig\": {\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\"\n },\n \"onboardingConfigFileName\": \"renovate.json\",\n \"onboardingNoDeps\": \"auto\",\n \"onboardingPrTitle\": \"Configure Renovate\",\n \"onboardingRebaseCheckbox\": false,\n \"optimizeForDisabled\": false,\n \"persistRepoData\": false,\n \"platform\": \"github\",\n \"prCacheSyncMaxPages\": 100,\n \"prCommitsPerRunLimit\": 0,\n \"presetCachePersistence\": false,\n \"processEnv\": {},\n \"productLinks\": {\n \"documentation\": \"https://docs.renovatebot.com/\",\n \"help\": \"https://github.com/renovatebot/renovate/discussions\",\n \"homepage\": \"https://github.com/renovatebot/renovate\"\n },\n \"rebaseAllOpenBranches\": false,\n \"reportFormatting\": false,\n \"repositoryCache\": \"disabled\",\n \"repositoryCacheForceLocal\": false,\n \"repositoryCacheType\": \"local\",\n \"requireConfig\": \"required\",\n \"s3PathStyle\": false,\n \"secrets\": {},\n \"unicodeEmoji\": true,\n \"useCloudMetadataServices\": true,\n \"userAgent\": \"Renovate/{{renovateVersion}} (https://github.com/renovatebot/renovate)\",\n \"variables\": {}\n};\n"],"mappings":";AACA,MAAa,6BAAsD;CACjE,iCAAiC;CACjC,mBAAmB,CAAC;CACpB,cAAc,CAAC;CACf,kBAAkB,CAChB,KACF;CACA,2BAA2B,CAAC;CAC5B,gBAAgB;CAChB,gBAAgB;CAChB,4CAA4C;CAC5C,gBAAgB;CAChB,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,wBAAwB;CACxB,oBAAoB,CAAC;CACrB,mBAAmB,CAAC;CACpB,yBAAyB;CACzB,sBAAsB,CAAC;CACvB,8BAA8B;CAC9B,oBAAoB;CACpB,6BAA6B;CAC7B,0BAA0B;CAC1B,qBAAqB;CACrB,kBAAkB;CAClB,sBAAsB;CACtB,cAAc;CACd,oBAAoB;CACpB,qBAAqB;CACrB,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,eAAe,CACb,UACA,MACF;CACA,cAAc;CACd,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;CACvB,wBAAwB;CACxB,sBAAsB;CACtB,8BAA8B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,2BAA2B;CAC3B,kBAAkB,CAAC;CACnB,oBAAoB;CACpB,oBAAoB,EAClB,WAAW,oDACb;CACA,4BAA4B;CAC5B,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,uBAAuB;CACvB,mBAAmB;CACnB,YAAY;CACZ,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,cAAc,CAAC;CACf,gBAAgB;EACd,iBAAiB;EACjB,QAAQ;EACR,YAAY;CACd;CACA,yBAAyB;CACzB,oBAAoB;CACpB,mBAAmB;CACnB,6BAA6B;CAC7B,uBAAuB;CACvB,iBAAiB;CACjB,eAAe;CACf,WAAW,CAAC;CACZ,gBAAgB;CAChB,4BAA4B;CAC5B,aAAa;CACb,aAAa,CAAC;AAChB"}
@@ -1,6 +1,7 @@
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 { buildCacheKey } from "../../../util/cache/package/key.js";
4
5
  import { RequestError } from "../../../util/http/got.js";
5
6
  import "../../../util/http/index.js";
6
7
  import { asTimestamp } from "../../../util/timestamp.js";
@@ -62,7 +63,7 @@ var ArtifactoryDatasource = class extends Datasource {
62
63
  }
63
64
  getReleases(config) {
64
65
  return this.cached({
65
- key: `${config.registryUrl}:${config.packageName}`,
66
+ key: buildCacheKey(config.registryUrl, config.packageName),
66
67
  fallback: true
67
68
  }, () => this.fetchReleases(config));
68
69
  }
@@ -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 { 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 supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\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,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,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"}
1
+ {"version":3,"file":"index.js","names":["HttpError"],"sources":["../../../../lib/modules/datasource/artifactory/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.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 supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\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: buildCacheKey(config.registryUrl, config.packageName),\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,wBAAb,cAA2C,WAAW;CACpD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,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,cAAc,OAAO,aAAa,OAAO,WAAW;GACzD,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
@@ -1,6 +1,7 @@
1
1
  import { coerceArray } from "../../../util/array.js";
2
2
  import { logger } from "../../../logger/index.js";
3
3
  import { find } from "../../../util/host-rules.js";
4
+ import { buildCacheKey } from "../../../util/cache/package/key.js";
4
5
  import { id } from "../../versioning/aws-eks-addon/index.js";
5
6
  import { Datasource } from "../datasource.js";
6
7
  import { EksAddonsFilter } from "./schema.js";
@@ -44,15 +45,15 @@ var AwsEKSAddonDataSource = class AwsEKSAddonDataSource extends Datasource {
44
45
  }
45
46
  getReleases(config) {
46
47
  return this.cached({
47
- key: `getReleases:${config.packageName}`,
48
+ key: buildCacheKey("getReleases", config.packageName),
48
49
  fallback: true
49
50
  }, () => this.fetchReleases(config));
50
51
  }
51
52
  getClient({ region, profile }) {
52
- const cacheKey = `${region ?? "default"}#${profile ?? "default"}`;
53
- if (!(cacheKey in this.clients)) {
53
+ const clientKey = `${region ?? "default"}#${profile ?? "default"}`;
54
+ if (!(clientKey in this.clients)) {
54
55
  const { password, token, username } = find({ hostType: AwsEKSAddonDataSource.id });
55
- this.clients[cacheKey] = new EKSClient({
56
+ this.clients[clientKey] = new EKSClient({
56
57
  ...region && { region },
57
58
  credentials: username && password ? {
58
59
  accessKeyId: username,
@@ -61,7 +62,7 @@ var AwsEKSAddonDataSource = class AwsEKSAddonDataSource extends Datasource {
61
62
  } : fromNodeProviderChain(profile ? { profile } : void 0)
62
63
  });
63
64
  }
64
- return this.clients[cacheKey];
65
+ return this.clients[clientKey];
65
66
  }
66
67
  };
67
68
  //#endregion
@@ -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 * 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 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,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
+ {"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 { buildCacheKey } from '../../../util/cache/package/key.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 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: buildCacheKey('getReleases', config.packageName),\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n\n private getClient({ region, profile }: EksAddonsFilter): EKSClient {\n const clientKey = `${region ?? 'default'}#${profile ?? 'default'}`;\n if (!(clientKey in this.clients)) {\n const { password, token, username } = hostRules.find({\n hostType: AwsEKSAddonDataSource.id,\n });\n this.clients[clientKey] = 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[clientKey];\n }\n}\n"],"mappings":";;;;;;;;;;;AAYA,IAAa,wBAAb,MAAa,8BAA8B,WAAW;CACpD,OAAgB,KAAK;CAErB,oBAAsCA;CACtC,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,cAAc,eAAe,OAAO,WAAW;GACpD,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;CAEA,UAAkB,EAAE,QAAQ,WAAuC;EACjE,MAAM,YAAY,GAAG,UAAU,UAAU,GAAG,WAAW;EACvD,IAAI,EAAE,aAAa,KAAK,UAAU;GAChC,MAAM,EAAE,UAAU,OAAO,aAAaC,KAAe,EACnD,UAAU,sBAAsB,GAClC,CAAC;GACD,KAAK,QAAQ,aAAa,IAAI,UAAU;IACtC,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,5 +1,6 @@
1
1
  import { coerceArray } from "../../../util/array.js";
2
2
  import { find } from "../../../util/host-rules.js";
3
+ import { buildCacheKey } from "../../../util/cache/package/key.js";
3
4
  import { id } from "../../versioning/aws-machine-image/index.js";
4
5
  import { asTimestamp } from "../../../util/timestamp.js";
5
6
  import { Datasource } from "../datasource.js";
@@ -62,7 +63,7 @@ var AwsMachineImageDatasource = class AwsMachineImageDatasource extends Datasour
62
63
  });
63
64
  }
64
65
  getSortedAwsMachineImages(serializedAmiFilter) {
65
- return this.cached({ key: `getSortedAwsMachineImages:${serializedAmiFilter}` }, () => this.fetchSortedAwsMachineImages(serializedAmiFilter));
66
+ return this.cached({ key: buildCacheKey("getSortedAwsMachineImages", serializedAmiFilter) }, () => this.fetchSortedAwsMachineImages(serializedAmiFilter));
66
67
  }
67
68
  async fetchDigest({ packageName: serializedAmiFilter }, newValue) {
68
69
  const images = await this.getSortedAwsMachineImages(serializedAmiFilter);
@@ -76,7 +77,7 @@ var AwsMachineImageDatasource = class AwsMachineImageDatasource extends Datasour
76
77
  }
77
78
  getDigest(config, newValue) {
78
79
  return this.cached({
79
- key: `getDigest:${config.packageName}:${newValue ?? ""}`,
80
+ key: buildCacheKey("getDigest", config.packageName, newValue),
80
81
  fallback: true
81
82
  }, () => this.fetchDigest(config, newValue));
82
83
  }
@@ -92,7 +93,7 @@ var AwsMachineImageDatasource = class AwsMachineImageDatasource extends Datasour
92
93
  }
93
94
  getReleases(config) {
94
95
  return this.cached({
95
- key: `getReleases:${config.packageName}`,
96
+ key: buildCacheKey("getReleases", config.packageName),
96
97
  fallback: true
97
98
  }, () => this.fetchReleases(config));
98
99
  }
@@ -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 * 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 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
+ {"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 { buildCacheKey } from '../../../util/cache/package/key.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 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: buildCacheKey('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: buildCacheKey('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: buildCacheKey('getReleases', config.packageName),\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { coerceArray } from "../../../util/array.js";
2
+ import { buildCacheKey } from "../../../util/cache/package/key.js";
2
3
  import { Datasource } from "../datasource.js";
3
4
  import { Lazy } from "../../../util/lazy.js";
4
5
  import { DescribeDBEngineVersionsCommand, RDSClient } from "@aws-sdk/client-rds";
@@ -20,7 +21,7 @@ var AwsRdsDatasource = class AwsRdsDatasource extends Datasource {
20
21
  }
21
22
  getReleases(config) {
22
23
  return this.cached({
23
- key: `getReleases:${config.packageName}`,
24
+ key: buildCacheKey("getReleases", config.packageName),
24
25
  fallback: true
25
26
  }, () => this.fetchReleases(config));
26
27
  }
@@ -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 { 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 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;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
+ {"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 { buildCacheKey } from '../../../util/cache/package/key.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 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: buildCacheKey('getReleases', config.packageName),\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;AAUA,IAAa,mBAAb,MAAa,yBAAyB,WAAW;CAC/C,OAAgB,KAAK;CAErB;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,cAAc,eAAe,OAAO,WAAW;GACpD,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
@@ -1,3 +1,4 @@
1
+ import { buildCacheKey } from "../../../util/cache/package/key.js";
1
2
  import { id } from "../../versioning/azure-rest-api/index.js";
2
3
  import { Datasource } from "../datasource.js";
3
4
  import { BicepResourceVersionIndex } from "./schema.js";
@@ -32,7 +33,7 @@ var AzureBicepResourceDatasource = class AzureBicepResourceDatasource extends Da
32
33
  }
33
34
  getReleases(config) {
34
35
  return this.cached({
35
- key: `getReleases-${config.packageName}`,
36
+ key: buildCacheKey("getReleases", config.packageName),
36
37
  fallback: true,
37
38
  cacheable: true
38
39
  }, () => this.fetchReleases(config));
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"index.js","names":["azureRestApiVersioningApi.id"],"sources":["../../../../lib/modules/datasource/azure-bicep-resource/index.ts"],"sourcesContent":["import { buildCacheKey } from '../../../util/cache/package/key.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 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: buildCacheKey('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":";;;;;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,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,cAAc,eAAe,OAAO,WAAW;GACpD,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"}
@@ -1,4 +1,5 @@
1
1
  import { joinUrlParts } from "../../../util/url.js";
2
+ import { buildCacheKey } from "../../../util/cache/package/key.js";
2
3
  import { ExternalHostError } from "../../../types/errors/external-host-error.js";
3
4
  import { isValidLocalPath, readLocalFile } from "../../../util/fs/index.js";
4
5
  import { Json } from "../../../util/schema-utils/index.js";
@@ -57,7 +58,7 @@ var BazelDatasource = class BazelDatasource extends Datasource {
57
58
  }
58
59
  getReleases(config) {
59
60
  return this.cached({
60
- key: `${config.registryUrl}:${config.packageName}`,
61
+ key: buildCacheKey(config.registryUrl, config.packageName),
61
62
  fallback: true
62
63
  }, () => this.fetchReleases(config));
63
64
  }
@@ -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 { 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 getDefaultRegistryUrls(_packageName: string): string[] {\n return [BazelDatasource.bazelCentralRepoUrl];\n }\n override readonly registryStrategy = 'hunt';\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\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,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,gBAAgB,mBAAmB;CAC7C;CACA,mBAAqC;CACrC,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CACA,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"}
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 { buildCacheKey } from '../../../util/cache/package/key.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 getDefaultRegistryUrls(_packageName: string): string[] {\n return [BazelDatasource.bazelCentralRepoUrl];\n }\n override readonly registryStrategy = 'hunt';\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\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: buildCacheKey(config.registryUrl, config.packageName),\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAgB,KAAK;CAErB,OAAgB,sBACd;CAEF,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,gBAAgB,mBAAmB;CAC7C;CACA,mBAAqC;CACrC,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CACA,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,cAAc,OAAO,aAAa,OAAO,WAAW;GACzD,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
@@ -2,6 +2,7 @@ import { fromBase64 } from "../../../util/string.js";
2
2
  import { logger } from "../../../logger/index.js";
3
3
  import { joinUrlParts } from "../../../util/url.js";
4
4
  import { detectPlatform } from "../../../util/common.js";
5
+ import { buildCacheKey } from "../../../util/cache/package/key.js";
5
6
  import { api } from "../../versioning/semver/index.js";
6
7
  import { Datasource } from "../datasource.js";
7
8
  import { parseGitUrl } from "../../../util/git/url.js";
@@ -79,7 +80,7 @@ var BitriseDatasource = class BitriseDatasource extends Datasource {
79
80
  }
80
81
  getReleases(config) {
81
82
  return this.cached({
82
- key: `${config.registryUrl}/${config.packageName}`,
83
+ key: buildCacheKey(config.registryUrl, config.packageName),
83
84
  fallback: true
84
85
  }, () => this.fetchReleases(config));
85
86
  }
@@ -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 { 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<GithubHttp> {\n static readonly id = 'bitrise';\n\n constructor() {\n super(BitriseDatasource.id, new GithubHttp(BitriseDatasource.id));\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['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,WAAuB;CAC5D,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,kBAAkB,IAAI,IAAI,WAAW,kBAAkB,EAAE,CAAC;CAClE;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,mDAAmD;CAC7D;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"}
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 { buildCacheKey } from '../../../util/cache/package/key.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<GithubHttp> {\n static readonly id = 'bitrise';\n\n constructor() {\n super(BitriseDatasource.id, new GithubHttp(BitriseDatasource.id));\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['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: buildCacheKey(config.registryUrl, config.packageName),\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,IAAa,oBAAb,MAAa,0BAA0B,WAAuB;CAC5D,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,kBAAkB,IAAI,IAAI,WAAW,kBAAkB,EAAE,CAAC;CAClE;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,mDAAmD;CAC7D;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,cAAc,OAAO,aAAa,OAAO,WAAW;GACzD,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
@@ -1,3 +1,4 @@
1
+ import { buildCacheKey } from "../../../util/cache/package/key.js";
1
2
  import { withCache } from "../../../util/cache/package/with-cache.js";
2
3
  import { Datasource } from "../datasource.js";
3
4
  import { BuildpacksRegistryResponse } from "./schema.js";
@@ -33,7 +34,7 @@ var BuildpacksRegistryDatasource = class BuildpacksRegistryDatasource extends Da
33
34
  getReleases(config) {
34
35
  return withCache({
35
36
  namespace: `datasource-${BuildpacksRegistryDatasource.id}`,
36
- key: `${config.registryUrl}:${config.packageName}`,
37
+ key: buildCacheKey(config.registryUrl, config.packageName),
37
38
  cacheable: true,
38
39
  fallback: true
39
40
  }, () => this._getReleases(config));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/buildpacks-registry/index.ts"],"sourcesContent":["import urlJoin from 'url-join';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BuildpacksRegistryResponse } from './schema.ts';\n\nexport class BuildpacksRegistryDatasource extends Datasource {\n static readonly id = 'buildpacks-registry';\n\n constructor() {\n super(BuildpacksRegistryDatasource.id);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return false;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://registry.buildpacks.io'];\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 config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName, registryUrl } = config;\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const url = urlJoin(registryUrl, 'api', 'v1', 'buildpacks', packageName);\n\n const body = await this.fetchJsonOrNull(url, BuildpacksRegistryResponse);\n if (!body) {\n return null;\n }\n\n const { versions, latest } = body;\n const releases: Release[] = versions;\n\n const res: ReleaseResult = { releases };\n\n if (latest?.homepage) {\n res.homepage = latest.homepage;\n }\n\n return res;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${BuildpacksRegistryDatasource.id}`,\n key: `${config.registryUrl}:${config.packageName}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;AAMA,IAAa,+BAAb,MAAa,qCAAqC,WAAW;CAC3D,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,6BAA6B,EAAE;CACvC;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,gCAAgC;CAC1C;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aACZ,QAC+B;EAC/B,MAAM,EAAE,aAAa,gBAAgB;;EAErC,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,MAAM,QAAQ,aAAa,OAAO,MAAM,cAAc,WAAW;EAEvE,MAAM,OAAO,MAAM,KAAK,gBAAgB,KAAK,0BAA0B;EACvE,IAAI,CAAC,MACH,OAAO;EAGT,MAAM,EAAE,UAAU,WAAW;EAG7B,MAAM,MAAqB,EAAE,UAAA,SAAS;EAEtC,IAAI,QAAQ,UACV,IAAI,WAAW,OAAO;EAGxB,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,6BAA6B;GACtD,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/buildpacks-registry/index.ts"],"sourcesContent":["import urlJoin from 'url-join';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BuildpacksRegistryResponse } from './schema.ts';\n\nexport class BuildpacksRegistryDatasource extends Datasource {\n static readonly id = 'buildpacks-registry';\n\n constructor() {\n super(BuildpacksRegistryDatasource.id);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return false;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://registry.buildpacks.io'];\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 config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName, registryUrl } = config;\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const url = urlJoin(registryUrl, 'api', 'v1', 'buildpacks', packageName);\n\n const body = await this.fetchJsonOrNull(url, BuildpacksRegistryResponse);\n if (!body) {\n return null;\n }\n\n const { versions, latest } = body;\n const releases: Release[] = versions;\n\n const res: ReleaseResult = { releases };\n\n if (latest?.homepage) {\n res.homepage = latest.homepage;\n }\n\n return res;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${BuildpacksRegistryDatasource.id}`,\n key: buildCacheKey(config.registryUrl, config.packageName),\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,+BAAb,MAAa,qCAAqC,WAAW;CAC3D,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,6BAA6B,EAAE;CACvC;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,gCAAgC;CAC1C;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aACZ,QAC+B;EAC/B,MAAM,EAAE,aAAa,gBAAgB;;EAErC,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,MAAM,QAAQ,aAAa,OAAO,MAAM,cAAc,WAAW;EAEvE,MAAM,OAAO,MAAM,KAAK,gBAAgB,KAAK,0BAA0B;EACvE,IAAI,CAAC,MACH,OAAO;EAGT,MAAM,EAAE,UAAU,WAAW;EAG7B,MAAM,MAAqB,EAAE,UAAA,SAAS;EAEtC,IAAI,QAAQ,UACV,IAAI,WAAW,OAAO;EAGxB,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,6BAA6B;GACtD,KAAK,cAAc,OAAO,aAAa,OAAO,WAAW;GACzD,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
@@ -1,3 +1,4 @@
1
+ import { buildCacheKey } from "../../../util/cache/package/key.js";
1
2
  import { ExternalHostError } from "../../../types/errors/external-host-error.js";
2
3
  import { withCache } from "../../../util/cache/package/with-cache.js";
3
4
  import { Datasource } from "../datasource.js";
@@ -35,7 +36,7 @@ var CdnjsDatasource = class CdnjsDatasource extends Datasource {
35
36
  const library = config.packageName.split("/")[0];
36
37
  return withCache({
37
38
  namespace: `datasource-${CdnjsDatasource.id}`,
38
- key: `getReleases:${library}`,
39
+ key: buildCacheKey("getReleases", library),
39
40
  cacheable: true,
40
41
  fallback: true
41
42
  }, () => this._getReleases(config));
@@ -52,7 +53,7 @@ var CdnjsDatasource = class CdnjsDatasource extends Datasource {
52
53
  getDigest(config, newValue) {
53
54
  return withCache({
54
55
  namespace: `datasource-${CdnjsDatasource.id}`,
55
- key: `getDigest:${config.registryUrl}:${config.packageName}:${newValue}`,
56
+ key: buildCacheKey("getDigest", config.registryUrl, config.packageName, newValue),
56
57
  cacheable: true,
57
58
  fallback: true
58
59
  }, () => this._getDigest(config, newValue));