renovate 44.28.0 → 44.29.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 (122) hide show
  1. package/dist/config/options/index.js +1 -2
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/config/presets/index.js +39 -12
  4. package/dist/config/presets/index.js.map +1 -1
  5. package/dist/config/presets/parse.js +64 -7
  6. package/dist/config/presets/parse.js.map +1 -1
  7. package/dist/config/presets/relative.js +66 -0
  8. package/dist/config/presets/relative.js.map +1 -0
  9. package/dist/config/presets/util.js +3 -1
  10. package/dist/config/presets/util.js.map +1 -1
  11. package/dist/config/validation.js +48 -4
  12. package/dist/config/validation.js.map +1 -1
  13. package/dist/global-config-option-defaults.generated.js +1 -1
  14. package/dist/global-config-option-defaults.generated.js.map +1 -1
  15. package/dist/logger/bunyan.js +2 -2
  16. package/dist/logger/bunyan.js.map +1 -1
  17. package/dist/logger/cmd-serializer.js +2 -1
  18. package/dist/logger/cmd-serializer.js.map +1 -1
  19. package/dist/modules/datasource/go/goproxy-parser.js +2 -2
  20. package/dist/modules/datasource/go/goproxy-parser.js.map +1 -1
  21. package/dist/modules/datasource/index.js +3 -3
  22. package/dist/modules/datasource/index.js.map +1 -1
  23. package/dist/modules/datasource/nuget/common.js +2 -1
  24. package/dist/modules/datasource/nuget/common.js.map +1 -1
  25. package/dist/modules/datasource/packagist/schema.js +2 -2
  26. package/dist/modules/datasource/packagist/schema.js.map +1 -1
  27. package/dist/modules/datasource/rpm/providers/common.js +3 -2
  28. package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
  29. package/dist/modules/manager/ant/update.js +2 -1
  30. package/dist/modules/manager/ant/update.js.map +1 -1
  31. package/dist/modules/manager/bazel-module/parser/fragments.js +4 -3
  32. package/dist/modules/manager/bazel-module/parser/fragments.js.map +1 -1
  33. package/dist/modules/manager/bun/extract.js +2 -2
  34. package/dist/modules/manager/bun/extract.js.map +1 -1
  35. package/dist/modules/manager/circleci/extract.js +2 -1
  36. package/dist/modules/manager/circleci/extract.js.map +1 -1
  37. package/dist/modules/manager/deno/post.js +2 -2
  38. package/dist/modules/manager/deno/post.js.map +1 -1
  39. package/dist/modules/manager/fingerprint.generated.js +1 -1
  40. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  41. package/dist/modules/manager/helm-values/extract.js +2 -1
  42. package/dist/modules/manager/helm-values/extract.js.map +1 -1
  43. package/dist/modules/manager/helm-values/util.js +3 -2
  44. package/dist/modules/manager/helm-values/util.js.map +1 -1
  45. package/dist/modules/manager/npm/extract/common/dependency.js +1 -1
  46. package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
  47. package/dist/modules/manager/npm/extract/post/monorepo.js +3 -3
  48. package/dist/modules/manager/npm/extract/post/monorepo.js.map +1 -1
  49. package/dist/modules/manager/npm/post-update/rules.js +2 -2
  50. package/dist/modules/manager/npm/post-update/rules.js.map +1 -1
  51. package/dist/modules/manager/osgi/extract.js +2 -2
  52. package/dist/modules/manager/osgi/extract.js.map +1 -1
  53. package/dist/modules/manager/pipenv/extract.js +2 -2
  54. package/dist/modules/manager/pipenv/extract.js.map +1 -1
  55. package/dist/modules/manager/pre-commit/parsing.js +3 -2
  56. package/dist/modules/manager/pre-commit/parsing.js.map +1 -1
  57. package/dist/modules/manager/proto/schema.js +2 -1
  58. package/dist/modules/manager/proto/schema.js.map +1 -1
  59. package/dist/modules/manager/renovate-config/extract.js +16 -2
  60. package/dist/modules/manager/renovate-config/extract.js.map +1 -1
  61. package/dist/modules/manager/woodpecker/extract.js +2 -2
  62. package/dist/modules/manager/woodpecker/extract.js.map +1 -1
  63. package/dist/modules/versioning/apk/index.js +2 -1
  64. package/dist/modules/versioning/apk/index.js.map +1 -1
  65. package/dist/modules/versioning/bazel-module/bzlmod-version.js +2 -1
  66. package/dist/modules/versioning/bazel-module/bzlmod-version.js.map +1 -1
  67. package/dist/modules/versioning/bazel-module/index.js +2 -1
  68. package/dist/modules/versioning/bazel-module/index.js.map +1 -1
  69. package/dist/modules/versioning/conan/common.js +2 -1
  70. package/dist/modules/versioning/conan/common.js.map +1 -1
  71. package/dist/modules/versioning/conan/range.js +5 -3
  72. package/dist/modules/versioning/conan/range.js.map +1 -1
  73. package/dist/modules/versioning/gradle/compare.js +1 -1
  74. package/dist/modules/versioning/gradle/compare.js.map +1 -1
  75. package/dist/modules/versioning/lambda-node/index.js +2 -1
  76. package/dist/modules/versioning/lambda-node/index.js.map +1 -1
  77. package/dist/modules/versioning/maven/compare.js +4 -3
  78. package/dist/modules/versioning/maven/compare.js.map +1 -1
  79. package/dist/modules/versioning/pep440/range.js +2 -1
  80. package/dist/modules/versioning/pep440/range.js.map +1 -1
  81. package/dist/modules/versioning/pvp/index.js +2 -1
  82. package/dist/modules/versioning/pvp/index.js.map +1 -1
  83. package/dist/modules/versioning/ruby/index.js +2 -1
  84. package/dist/modules/versioning/ruby/index.js.map +1 -1
  85. package/dist/util/cache/package/impl/file.js +2 -1
  86. package/dist/util/cache/package/impl/file.js.map +1 -1
  87. package/dist/util/cache/package/legacy.js +2 -1
  88. package/dist/util/cache/package/legacy.js.map +1 -1
  89. package/dist/util/date.js +2 -1
  90. package/dist/util/date.js.map +1 -1
  91. package/dist/util/exec/docker/index.js +2 -2
  92. package/dist/util/exec/docker/index.js.map +1 -1
  93. package/dist/util/exec/index.js +2 -2
  94. package/dist/util/exec/index.js.map +1 -1
  95. package/dist/util/exec/utils.js +2 -2
  96. package/dist/util/exec/utils.js.map +1 -1
  97. package/dist/util/fingerprint.js.map +1 -1
  98. package/dist/util/git/index.js +3 -3
  99. package/dist/util/git/index.js.map +1 -1
  100. package/dist/util/git/instrument.js +3 -2
  101. package/dist/util/git/instrument.js.map +1 -1
  102. package/dist/util/host-rules.js +1 -1
  103. package/dist/util/host-rules.js.map +1 -1
  104. package/dist/util/http/github.js +2 -2
  105. package/dist/util/http/github.js.map +1 -1
  106. package/dist/util/object.js.map +1 -1
  107. package/dist/util/result.js.map +1 -1
  108. package/dist/util/s3.js +2 -2
  109. package/dist/util/s3.js.map +1 -1
  110. package/dist/util/schema-utils/index.js.map +1 -1
  111. package/dist/util/timestamp.js +2 -1
  112. package/dist/util/timestamp.js.map +1 -1
  113. package/dist/workers/global/config/parse/index.js +2 -2
  114. package/dist/workers/global/config/parse/index.js.map +1 -1
  115. package/dist/workers/global/index.js +2 -2
  116. package/dist/workers/global/index.js.map +1 -1
  117. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js +2 -2
  118. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js.map +1 -1
  119. package/dist/workers/repository/update/pr/changelog/release-notes.js +2 -2
  120. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  121. package/package.json +2 -2
  122. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["datasources","packageCache.get","packageCache.set","versioning.get","memCache.get"],"sources":["../../../lib/modules/datasource/index.ts"],"sourcesContent":["import { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport { isFunction, isNonEmptyArray, isString } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport {\n ATTR_RENOVATE_DATASOURCE,\n ATTR_RENOVATE_PACKAGE_NAME,\n ATTR_RENOVATE_REGISTRY_URL,\n} from '../../instrumentation/types.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 * as packageCache from '../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport { clone } from '../../util/clone.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { AsyncResult, Result } from '../../util/result.ts';\nimport { DatasourceCacheStats } from '../../util/stats.ts';\nimport { trimTrailingSlash } from '../../util/url.ts';\nimport * as versioning from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport {\n applyConstraintsFiltering,\n applyExtractVersion,\n applyVersionCompatibility,\n filterValidVersions,\n getDatasourceFor,\n sortAndRemoveDuplicates,\n} from './common.ts';\nimport { addMetaData } from './metadata.ts';\nimport { setNpmrc } from './npm/index.ts';\nimport { resolveRegistryUrl } from './npm/npmrc.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetDigestInputConfig,\n GetPkgReleasesConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport { isGetPkgReleasesConfig } from './common.ts';\nexport * from './types.ts';\n\nexport function getDatasources(): Map<string, DatasourceApi> {\n return datasources;\n}\nexport function getDatasourceList(): string[] {\n return Array.from(datasources.keys());\n}\n\ntype GetReleasesInternalConfig = GetReleasesConfig & GetPkgReleasesConfig;\n\n// TODO: fix error Type\nfunction logError(datasource: string, packageName: string, err: any): void {\n const { statusCode, code: errCode, url } = err;\n if (statusCode === 404) {\n logger.debug({ datasource, packageName, url }, 'Datasource 404');\n } else if (statusCode === 401 || statusCode === 403) {\n logger.debug({ datasource, packageName, url }, 'Datasource unauthorized');\n } else if (errCode) {\n logger.debug(\n { datasource, packageName, url, errCode },\n 'Datasource connection error',\n );\n } else {\n logger.debug({ datasource, packageName, err }, 'Datasource unknown error');\n }\n}\n\nasync function getRegistryReleases(\n datasource: DatasourceApi,\n config: GetReleasesConfig,\n registryUrl: string,\n): Promise<ReleaseResult | null> {\n const cacheNamespace: PackageCacheNamespace = `datasource-releases-${datasource.id}`;\n const cacheKey = `${registryUrl}:${config.packageName}`;\n\n const cacheEnabled = !!datasource.caching; // tells if `isPrivate` flag is supported in datasource result\n const cacheForced = GlobalConfig.get('cachePrivatePackages'); // tells if caching is forced via admin config\n\n if (cacheEnabled || cacheForced) {\n const cachedResult = await packageCache.get<ReleaseResult>(\n cacheNamespace,\n cacheKey,\n );\n\n if (cachedResult) {\n logger.trace({ cacheKey }, 'Returning cached datasource response');\n DatasourceCacheStats.hit(datasource.id, registryUrl, config.packageName);\n return cachedResult;\n }\n\n DatasourceCacheStats.miss(datasource.id, registryUrl, config.packageName);\n }\n\n const res = await instrument(\n 'getReleases',\n () => datasource.getReleases({ ...config, registryUrl }),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: registryUrl,\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n if (res?.releases.length) {\n res.registryUrl ??= registryUrl;\n }\n\n if (!res) {\n return null;\n }\n\n let cache = false;\n if (cacheForced) {\n cache = true;\n } else if (cacheEnabled && !res.isPrivate) {\n cache = true;\n }\n\n if (cache) {\n logger.trace({ cacheKey }, 'Caching datasource response');\n await packageCache.set(cacheNamespace, cacheKey, res, 15);\n DatasourceCacheStats.set(datasource.id, registryUrl, config.packageName);\n } else {\n DatasourceCacheStats.skip(datasource.id, registryUrl, config.packageName);\n }\n\n return res;\n}\n\nfunction firstRegistry(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n if (registryUrls.length > 1) {\n logger.warn(\n {\n datasource: datasource.id,\n packageName: config.packageName,\n registryUrls,\n },\n 'Excess registryUrls found for datasource lookup - using first configured only',\n );\n }\n const registryUrl = registryUrls[0];\n return getRegistryReleases(datasource, config, registryUrl);\n}\n\nasync function huntRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let res: ReleaseResult | null = null;\n let caughtError: Error | undefined;\n for (const registryUrl of registryUrls) {\n try {\n res = await getRegistryReleases(datasource, config, registryUrl);\n if (res) {\n break;\n }\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // We'll always save the last-thrown error\n caughtError = err;\n logger.trace({ err }, 'datasource hunt failure');\n }\n }\n if (res) {\n return res;\n }\n if (caughtError) {\n throw caughtError;\n }\n return null;\n}\n\nasync function mergeRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let combinedRes: ReleaseResult | undefined;\n let lastErr: Error | undefined;\n let singleRegistry = true;\n const releaseVersioning = versioning.get(config.versioning);\n for (const registryUrl of registryUrls) {\n try {\n const res = await getRegistryReleases(datasource, config, registryUrl);\n if (!res) {\n continue;\n }\n\n if (!combinedRes) {\n // This is the first registry, so we can just use it and continue\n combinedRes = res;\n continue;\n }\n\n if (singleRegistry) {\n // This is the second registry\n // We need to move the registryUrl from the package level to the release level\n for (const release of coerceArray(combinedRes.releases)) {\n release.registryUrl ??= combinedRes.registryUrl;\n }\n singleRegistry = false;\n }\n\n const releases = coerceArray(res.releases);\n for (const release of releases) {\n // We have more than one registry, so we need to move the registryUrl\n // from the package level to the release level before merging\n release.registryUrl ??= res.registryUrl;\n }\n\n combinedRes.releases.push(...releases);\n\n // Merge the tags from the two results\n let tags = combinedRes.tags;\n if (tags) {\n if (res.tags) {\n // Both results had tags, so we need to compare them\n for (const tag of ['release', 'latest']) {\n const existingTag = combinedRes?.tags?.[tag];\n const newTag = res.tags?.[tag];\n if (isString(newTag) && releaseVersioning.isVersion(newTag)) {\n if (\n isString(existingTag) &&\n releaseVersioning.isVersion(existingTag)\n ) {\n // We need to compare them\n if (releaseVersioning.isGreaterThan(newTag, existingTag)) {\n // New tag is greater than the existing one\n tags[tag] = newTag;\n }\n } else {\n // Existing tag was not present or not a version\n // so we can just use the new one\n tags[tag] = newTag;\n }\n }\n }\n }\n } else {\n // Existing results had no tags, so we can just use the new ones\n tags = res.tags;\n }\n combinedRes = { ...res, ...combinedRes };\n if (tags) {\n combinedRes.tags = tags;\n }\n // Remove the registryUrl from the package level when more than one registry\n delete combinedRes.registryUrl;\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n\n lastErr = err;\n logger.trace({ err }, 'datasource merge failure');\n }\n }\n\n if (!combinedRes) {\n if (lastErr) {\n throw lastErr;\n }\n\n return null;\n }\n\n const seenVersions = new Set<string>();\n combinedRes.releases = filterMap(combinedRes.releases, (release) => {\n if (seenVersions.has(release.version)) {\n return null;\n }\n seenVersions.add(release.version);\n return release;\n });\n\n return combinedRes;\n}\n\nfunction massageRegistryUrls(registryUrls: string[]): string[] {\n return registryUrls.filter(Boolean).map(trimTrailingSlash);\n}\n\nfunction resolveRegistryUrls(\n datasource: DatasourceApi,\n defaultRegistryUrls: string[] | undefined,\n registryUrls: string[] | undefined | null,\n additionalRegistryUrls: string[] | undefined,\n): string[] {\n if (!datasource.customRegistrySupport) {\n if (\n isNonEmptyArray(registryUrls) ||\n isNonEmptyArray(defaultRegistryUrls) ||\n isNonEmptyArray(additionalRegistryUrls)\n ) {\n logger.warn(\n {\n datasource: datasource.id,\n registryUrls,\n defaultRegistryUrls,\n additionalRegistryUrls,\n },\n 'Custom registries are not allowed for this datasource and will be ignored',\n );\n }\n return isFunction(datasource.defaultRegistryUrls)\n ? datasource.defaultRegistryUrls()\n : (datasource.defaultRegistryUrls ?? []);\n }\n const customUrls = registryUrls?.filter(Boolean);\n let resolvedUrls: string[] = [];\n if (isNonEmptyArray(customUrls)) {\n resolvedUrls = [...customUrls];\n } else if (isNonEmptyArray(defaultRegistryUrls)) {\n resolvedUrls = [...defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isFunction(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls()];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isNonEmptyArray(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n }\n return massageRegistryUrls(resolvedUrls);\n}\n\nfunction applyReplacements(\n config: GetReleasesInternalConfig,\n): Pick<ReleaseResult, 'replacementName' | 'replacementVersion'> | undefined {\n if (config.replacementName && config.replacementVersion) {\n return {\n replacementName: config.replacementName,\n replacementVersion: config.replacementVersion,\n };\n }\n return undefined;\n}\n\nasync function fetchReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let { registryUrls } = config;\n // istanbul ignore if: need test\n if (!datasourceName || getDatasourceFor(datasourceName) === undefined) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n if (datasourceName === 'npm') {\n if (isString(config.npmrc)) {\n setNpmrc(config.npmrc);\n }\n if (!isNonEmptyArray(registryUrls)) {\n registryUrls = [resolveRegistryUrl(config.packageName)];\n }\n }\n const datasource = getDatasourceFor(datasourceName);\n // istanbul ignore if: needs test\n if (!datasource) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n registryUrls = resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n registryUrls,\n config.additionalRegistryUrls,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy ?? 'hunt';\n try {\n if (isNonEmptyArray(registryUrls)) {\n if (registryStrategy === 'first') {\n dep = await firstRegistry(config, datasource, registryUrls);\n } else if (registryStrategy === 'hunt') {\n dep = await huntRegistries(config, datasource, registryUrls);\n } else if (registryStrategy === 'merge') {\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await instrument(\n 'getReleases',\n () => datasource.getReleases(config),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: config.registryUrl ?? '',\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n }\n } catch (err) {\n if (err.message === HOST_DISABLED || err.err?.message === HOST_DISABLED) {\n return null;\n }\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logError(datasource.id, config.packageName, err);\n }\n if (!dep || dequal(dep, { releases: [] })) {\n return null;\n }\n addMetaData(dep, datasourceName, config.packageName);\n dep = { ...dep, ...applyReplacements(config) };\n return dep;\n}\n\nfunction fetchCachedReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource, packageName, registryUrls } = config;\n const cacheKey = `datasource-mem:releases:${datasource}:${packageName}:${config.registryStrategy}:${String(\n registryUrls,\n )}`;\n // By returning a Promise and reusing it, we should only fetch each package at most once\n const cachedResult = memCache.get<Promise<ReleaseResult | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = fetchReleases(config);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function getRawPkgReleases(\n config: GetPkgReleasesConfig,\n): AsyncResult<\n ReleaseResult,\n Error | 'no-datasource' | 'no-package-name' | 'no-result'\n> {\n if (!config.datasource) {\n logger.warn('No datasource found');\n return AsyncResult.err('no-datasource');\n }\n\n const packageName = config.packageName;\n if (!packageName) {\n logger.error({ config }, 'Datasource getReleases without packageName');\n return AsyncResult.err('no-package-name');\n }\n\n return Result.wrapNullable(fetchCachedReleases(config), 'no-result' as const)\n .catch((e) => {\n if (e instanceof ExternalHostError) {\n e.hostType = config.datasource;\n e.packageName = packageName;\n }\n return Result.err(e);\n })\n .transform(clone);\n}\n\nexport function applyDatasourceFilters(\n releaseResult: ReleaseResult,\n config: GetPkgReleasesConfig,\n): ReleaseResult {\n let res = releaseResult;\n res = applyExtractVersion(res, config.extractVersion);\n res = applyVersionCompatibility(\n res,\n config.versionCompatibility,\n config.currentCompatibility,\n );\n res = filterValidVersions(res, config);\n res = sortAndRemoveDuplicates(res, config);\n res = applyConstraintsFiltering(res, config);\n return res;\n}\n\nexport async function getPkgReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { val = null, err } = await getRawPkgReleases(config)\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (err instanceof Error) {\n throw err;\n }\n\n return val;\n}\n\nexport function supportsDigests(datasource: string | undefined): boolean {\n const ds = !!datasource && getDatasourceFor(datasource);\n return !!ds && 'getDigest' in ds;\n}\n\nfunction getDigestConfig(\n datasource: DatasourceApi,\n config: GetDigestInputConfig,\n): DigestConfig {\n const { lookupName, currentValue, currentDigest } = config;\n const packageName = config.replacementName ?? config.packageName;\n // Prefer registryUrl from getReleases() lookup if it has been passed\n const registryUrl =\n config.registryUrl ??\n resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n config.registryUrls,\n config.additionalRegistryUrls,\n )[0];\n return { lookupName, packageName, registryUrl, currentValue, currentDigest };\n}\n\nexport function getDigest(\n config: GetDigestInputConfig,\n value?: string,\n): Promise<string | null> {\n const datasource = getDatasourceFor(config.datasource);\n // istanbul ignore if: need test\n if (!datasource || !('getDigest' in datasource)) {\n return Promise.resolve(null);\n }\n const digestConfig = getDigestConfig(datasource, config);\n return datasource.getDigest!(digestConfig, value);\n}\n\nexport function getDefaultConfig(\n datasource: string,\n): Promise<Record<string, unknown>> {\n const loadedDatasource = getDatasourceFor(datasource);\n return Promise.resolve<Record<string, unknown>>(\n loadedDatasource?.defaultConfig ?? Object.create({}),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["datasources","packageCache.get","packageCache.set","versioning.get","memCache.get"],"sources":["../../../lib/modules/datasource/index.ts"],"sourcesContent":["import { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport {\n isFunction,\n isNonEmptyArray,\n isString,\n isTruthy,\n} from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport {\n ATTR_RENOVATE_DATASOURCE,\n ATTR_RENOVATE_PACKAGE_NAME,\n ATTR_RENOVATE_REGISTRY_URL,\n} from '../../instrumentation/types.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 * as packageCache from '../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport { clone } from '../../util/clone.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { AsyncResult, Result } from '../../util/result.ts';\nimport { DatasourceCacheStats } from '../../util/stats.ts';\nimport { trimTrailingSlash } from '../../util/url.ts';\nimport * as versioning from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport {\n applyConstraintsFiltering,\n applyExtractVersion,\n applyVersionCompatibility,\n filterValidVersions,\n getDatasourceFor,\n sortAndRemoveDuplicates,\n} from './common.ts';\nimport { addMetaData } from './metadata.ts';\nimport { setNpmrc } from './npm/index.ts';\nimport { resolveRegistryUrl } from './npm/npmrc.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetDigestInputConfig,\n GetPkgReleasesConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport { isGetPkgReleasesConfig } from './common.ts';\nexport * from './types.ts';\n\nexport function getDatasources(): Map<string, DatasourceApi> {\n return datasources;\n}\nexport function getDatasourceList(): string[] {\n return Array.from(datasources.keys());\n}\n\ntype GetReleasesInternalConfig = GetReleasesConfig & GetPkgReleasesConfig;\n\n// TODO: fix error Type\nfunction logError(datasource: string, packageName: string, err: any): void {\n const { statusCode, code: errCode, url } = err;\n if (statusCode === 404) {\n logger.debug({ datasource, packageName, url }, 'Datasource 404');\n } else if (statusCode === 401 || statusCode === 403) {\n logger.debug({ datasource, packageName, url }, 'Datasource unauthorized');\n } else if (errCode) {\n logger.debug(\n { datasource, packageName, url, errCode },\n 'Datasource connection error',\n );\n } else {\n logger.debug({ datasource, packageName, err }, 'Datasource unknown error');\n }\n}\n\nasync function getRegistryReleases(\n datasource: DatasourceApi,\n config: GetReleasesConfig,\n registryUrl: string,\n): Promise<ReleaseResult | null> {\n const cacheNamespace: PackageCacheNamespace = `datasource-releases-${datasource.id}`;\n const cacheKey = `${registryUrl}:${config.packageName}`;\n\n const cacheEnabled = !!datasource.caching; // tells if `isPrivate` flag is supported in datasource result\n const cacheForced = GlobalConfig.get('cachePrivatePackages'); // tells if caching is forced via admin config\n\n if (cacheEnabled || cacheForced) {\n const cachedResult = await packageCache.get<ReleaseResult>(\n cacheNamespace,\n cacheKey,\n );\n\n if (cachedResult) {\n logger.trace({ cacheKey }, 'Returning cached datasource response');\n DatasourceCacheStats.hit(datasource.id, registryUrl, config.packageName);\n return cachedResult;\n }\n\n DatasourceCacheStats.miss(datasource.id, registryUrl, config.packageName);\n }\n\n const res = await instrument(\n 'getReleases',\n () => datasource.getReleases({ ...config, registryUrl }),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: registryUrl,\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n if (res?.releases.length) {\n res.registryUrl ??= registryUrl;\n }\n\n if (!res) {\n return null;\n }\n\n let cache = false;\n if (cacheForced) {\n cache = true;\n } else if (cacheEnabled && !res.isPrivate) {\n cache = true;\n }\n\n if (cache) {\n logger.trace({ cacheKey }, 'Caching datasource response');\n await packageCache.set(cacheNamespace, cacheKey, res, 15);\n DatasourceCacheStats.set(datasource.id, registryUrl, config.packageName);\n } else {\n DatasourceCacheStats.skip(datasource.id, registryUrl, config.packageName);\n }\n\n return res;\n}\n\nfunction firstRegistry(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n if (registryUrls.length > 1) {\n logger.warn(\n {\n datasource: datasource.id,\n packageName: config.packageName,\n registryUrls,\n },\n 'Excess registryUrls found for datasource lookup - using first configured only',\n );\n }\n const registryUrl = registryUrls[0];\n return getRegistryReleases(datasource, config, registryUrl);\n}\n\nasync function huntRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let res: ReleaseResult | null = null;\n let caughtError: Error | undefined;\n for (const registryUrl of registryUrls) {\n try {\n res = await getRegistryReleases(datasource, config, registryUrl);\n if (res) {\n break;\n }\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // We'll always save the last-thrown error\n caughtError = err;\n logger.trace({ err }, 'datasource hunt failure');\n }\n }\n if (res) {\n return res;\n }\n if (caughtError) {\n throw caughtError;\n }\n return null;\n}\n\nasync function mergeRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let combinedRes: ReleaseResult | undefined;\n let lastErr: Error | undefined;\n let singleRegistry = true;\n const releaseVersioning = versioning.get(config.versioning);\n for (const registryUrl of registryUrls) {\n try {\n const res = await getRegistryReleases(datasource, config, registryUrl);\n if (!res) {\n continue;\n }\n\n if (!combinedRes) {\n // This is the first registry, so we can just use it and continue\n combinedRes = res;\n continue;\n }\n\n if (singleRegistry) {\n // This is the second registry\n // We need to move the registryUrl from the package level to the release level\n for (const release of coerceArray(combinedRes.releases)) {\n release.registryUrl ??= combinedRes.registryUrl;\n }\n singleRegistry = false;\n }\n\n const releases = coerceArray(res.releases);\n for (const release of releases) {\n // We have more than one registry, so we need to move the registryUrl\n // from the package level to the release level before merging\n release.registryUrl ??= res.registryUrl;\n }\n\n combinedRes.releases.push(...releases);\n\n // Merge the tags from the two results\n let tags = combinedRes.tags;\n if (tags) {\n if (res.tags) {\n // Both results had tags, so we need to compare them\n for (const tag of ['release', 'latest']) {\n const existingTag = combinedRes?.tags?.[tag];\n const newTag = res.tags?.[tag];\n if (isString(newTag) && releaseVersioning.isVersion(newTag)) {\n if (\n isString(existingTag) &&\n releaseVersioning.isVersion(existingTag)\n ) {\n // We need to compare them\n if (releaseVersioning.isGreaterThan(newTag, existingTag)) {\n // New tag is greater than the existing one\n tags[tag] = newTag;\n }\n } else {\n // Existing tag was not present or not a version\n // so we can just use the new one\n tags[tag] = newTag;\n }\n }\n }\n }\n } else {\n // Existing results had no tags, so we can just use the new ones\n tags = res.tags;\n }\n combinedRes = { ...res, ...combinedRes };\n if (tags) {\n combinedRes.tags = tags;\n }\n // Remove the registryUrl from the package level when more than one registry\n delete combinedRes.registryUrl;\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n\n lastErr = err;\n logger.trace({ err }, 'datasource merge failure');\n }\n }\n\n if (!combinedRes) {\n if (lastErr) {\n throw lastErr;\n }\n\n return null;\n }\n\n const seenVersions = new Set<string>();\n combinedRes.releases = filterMap(combinedRes.releases, (release) => {\n if (seenVersions.has(release.version)) {\n return null;\n }\n seenVersions.add(release.version);\n return release;\n });\n\n return combinedRes;\n}\n\nfunction massageRegistryUrls(registryUrls: string[]): string[] {\n return registryUrls.filter(isTruthy).map(trimTrailingSlash);\n}\n\nfunction resolveRegistryUrls(\n datasource: DatasourceApi,\n defaultRegistryUrls: string[] | undefined,\n registryUrls: string[] | undefined | null,\n additionalRegistryUrls: string[] | undefined,\n): string[] {\n if (!datasource.customRegistrySupport) {\n if (\n isNonEmptyArray(registryUrls) ||\n isNonEmptyArray(defaultRegistryUrls) ||\n isNonEmptyArray(additionalRegistryUrls)\n ) {\n logger.warn(\n {\n datasource: datasource.id,\n registryUrls,\n defaultRegistryUrls,\n additionalRegistryUrls,\n },\n 'Custom registries are not allowed for this datasource and will be ignored',\n );\n }\n return isFunction(datasource.defaultRegistryUrls)\n ? datasource.defaultRegistryUrls()\n : (datasource.defaultRegistryUrls ?? []);\n }\n const customUrls = registryUrls?.filter(isTruthy);\n let resolvedUrls: string[] = [];\n if (isNonEmptyArray(customUrls)) {\n resolvedUrls = [...customUrls];\n } else if (isNonEmptyArray(defaultRegistryUrls)) {\n resolvedUrls = [...defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isFunction(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls()];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isNonEmptyArray(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n }\n return massageRegistryUrls(resolvedUrls);\n}\n\nfunction applyReplacements(\n config: GetReleasesInternalConfig,\n): Pick<ReleaseResult, 'replacementName' | 'replacementVersion'> | undefined {\n if (config.replacementName && config.replacementVersion) {\n return {\n replacementName: config.replacementName,\n replacementVersion: config.replacementVersion,\n };\n }\n return undefined;\n}\n\nasync function fetchReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let { registryUrls } = config;\n // istanbul ignore if: need test\n if (!datasourceName || getDatasourceFor(datasourceName) === undefined) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n if (datasourceName === 'npm') {\n if (isString(config.npmrc)) {\n setNpmrc(config.npmrc);\n }\n if (!isNonEmptyArray(registryUrls)) {\n registryUrls = [resolveRegistryUrl(config.packageName)];\n }\n }\n const datasource = getDatasourceFor(datasourceName);\n // istanbul ignore if: needs test\n if (!datasource) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n registryUrls = resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n registryUrls,\n config.additionalRegistryUrls,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy ?? 'hunt';\n try {\n if (isNonEmptyArray(registryUrls)) {\n if (registryStrategy === 'first') {\n dep = await firstRegistry(config, datasource, registryUrls);\n } else if (registryStrategy === 'hunt') {\n dep = await huntRegistries(config, datasource, registryUrls);\n } else if (registryStrategy === 'merge') {\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await instrument(\n 'getReleases',\n () => datasource.getReleases(config),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: config.registryUrl ?? '',\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n }\n } catch (err) {\n if (err.message === HOST_DISABLED || err.err?.message === HOST_DISABLED) {\n return null;\n }\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logError(datasource.id, config.packageName, err);\n }\n if (!dep || dequal(dep, { releases: [] })) {\n return null;\n }\n addMetaData(dep, datasourceName, config.packageName);\n dep = { ...dep, ...applyReplacements(config) };\n return dep;\n}\n\nfunction fetchCachedReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource, packageName, registryUrls } = config;\n const cacheKey = `datasource-mem:releases:${datasource}:${packageName}:${config.registryStrategy}:${String(\n registryUrls,\n )}`;\n // By returning a Promise and reusing it, we should only fetch each package at most once\n const cachedResult = memCache.get<Promise<ReleaseResult | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = fetchReleases(config);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function getRawPkgReleases(\n config: GetPkgReleasesConfig,\n): AsyncResult<\n ReleaseResult,\n Error | 'no-datasource' | 'no-package-name' | 'no-result'\n> {\n if (!config.datasource) {\n logger.warn('No datasource found');\n return AsyncResult.err('no-datasource');\n }\n\n const packageName = config.packageName;\n if (!packageName) {\n logger.error({ config }, 'Datasource getReleases without packageName');\n return AsyncResult.err('no-package-name');\n }\n\n return Result.wrapNullable(fetchCachedReleases(config), 'no-result' as const)\n .catch((e) => {\n if (e instanceof ExternalHostError) {\n e.hostType = config.datasource;\n e.packageName = packageName;\n }\n return Result.err(e);\n })\n .transform(clone);\n}\n\nexport function applyDatasourceFilters(\n releaseResult: ReleaseResult,\n config: GetPkgReleasesConfig,\n): ReleaseResult {\n let res = releaseResult;\n res = applyExtractVersion(res, config.extractVersion);\n res = applyVersionCompatibility(\n res,\n config.versionCompatibility,\n config.currentCompatibility,\n );\n res = filterValidVersions(res, config);\n res = sortAndRemoveDuplicates(res, config);\n res = applyConstraintsFiltering(res, config);\n return res;\n}\n\nexport async function getPkgReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { val = null, err } = await getRawPkgReleases(config)\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (err instanceof Error) {\n throw err;\n }\n\n return val;\n}\n\nexport function supportsDigests(datasource: string | undefined): boolean {\n const ds = !!datasource && getDatasourceFor(datasource);\n return !!ds && 'getDigest' in ds;\n}\n\nfunction getDigestConfig(\n datasource: DatasourceApi,\n config: GetDigestInputConfig,\n): DigestConfig {\n const { lookupName, currentValue, currentDigest } = config;\n const packageName = config.replacementName ?? config.packageName;\n // Prefer registryUrl from getReleases() lookup if it has been passed\n const registryUrl =\n config.registryUrl ??\n resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n config.registryUrls,\n config.additionalRegistryUrls,\n )[0];\n return { lookupName, packageName, registryUrl, currentValue, currentDigest };\n}\n\nexport function getDigest(\n config: GetDigestInputConfig,\n value?: string,\n): Promise<string | null> {\n const datasource = getDatasourceFor(config.datasource);\n // istanbul ignore if: need test\n if (!datasource || !('getDigest' in datasource)) {\n return Promise.resolve(null);\n }\n const digestConfig = getDigestConfig(datasource, config);\n return datasource.getDigest!(digestConfig, value);\n}\n\nexport function getDefaultConfig(\n datasource: string,\n): Promise<Record<string, unknown>> {\n const loadedDatasource = getDatasourceFor(datasource);\n return Promise.resolve<Record<string, unknown>>(\n loadedDatasource?.defaultConfig ?? Object.create({}),\n );\n}\n"],"mappings":"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"}
@@ -2,6 +2,7 @@ import { regEx } from "../../../util/regex.js";
2
2
  import { logger } from "../../../logger/index.js";
3
3
  import { parseUrl } from "../../../util/url.js";
4
4
  import { api } from "../../versioning/nuget/index.js";
5
+ import { isNullOrUndefined } from "@sindresorhus/is";
5
6
  //#region lib/modules/datasource/nuget/common.ts
6
7
  const buildMetaRe = regEx(/\+.+$/g);
7
8
  function removeBuildMeta(version) {
@@ -9,7 +10,7 @@ function removeBuildMeta(version) {
9
10
  }
10
11
  const urlWhitespaceRe = regEx(/\s/g);
11
12
  function massageUrl(url) {
12
- if (url === null || url === void 0) return null;
13
+ if (isNullOrUndefined(url)) return null;
13
14
  let resultUrl = url;
14
15
  resultUrl = resultUrl.replace(urlWhitespaceRe, "%20");
15
16
  return resultUrl;
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":["versioning"],"sources":["../../../../lib/modules/datasource/nuget/common.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { api as versioning } from '../../versioning/nuget/index.ts';\nimport type { ParsedRegistryUrl } from './types.ts';\n\nconst buildMetaRe = regEx(/\\+.+$/g);\n\nexport function removeBuildMeta(version: string): string {\n return version.replace(buildMetaRe, '');\n}\n\nconst urlWhitespaceRe = regEx(/\\s/g);\n\nexport function massageUrl(url: string | null | undefined): string | null {\n if (url === null || url === undefined) {\n return null;\n }\n\n let resultUrl = url;\n\n // During `dotnet pack` certain URLs are being URL decoded which may introduce whitespace\n // and causes Markdown link generation problems.\n resultUrl = resultUrl.replace(urlWhitespaceRe, '%20');\n\n return resultUrl;\n}\n\nconst protocolVersionRegExp = regEx(/#protocolVersion=(?<protocol>2|3)/);\n\nexport function parseRegistryUrl(registryUrl: string): ParsedRegistryUrl {\n const parsedUrl = parseUrl(registryUrl);\n if (!parsedUrl) {\n logger.debug(\n { urL: registryUrl },\n `nuget registry failure: can't parse ${registryUrl}`,\n );\n return { feedUrl: registryUrl, protocolVersion: null };\n }\n let protocolVersion = 2;\n const protocolVersionMatch = protocolVersionRegExp.exec(\n parsedUrl.hash,\n )?.groups;\n if (protocolVersionMatch) {\n const { protocol } = protocolVersionMatch;\n parsedUrl.hash = '';\n protocolVersion = Number.parseInt(protocol, 10);\n } else if (parsedUrl.pathname.endsWith('.json')) {\n protocolVersion = 3;\n }\n\n const feedUrl = parsedUrl.href;\n return { feedUrl, protocolVersion };\n}\n\n/**\n * Compare two versions. Return:\n * - `1` if `a > b` or `b` is invalid\n * - `-1` if `a < b` or `a` is invalid\n * - `0` if `a == b` or both `a` and `b` are invalid\n */\nexport function sortNugetVersions(a: string, b: string): number {\n if (versioning.isValid(a)) {\n if (versioning.isValid(b)) {\n return versioning.sortVersions(a, b);\n }\n return 1;\n }\n if (versioning.isValid(b)) {\n return -1;\n }\n return 0;\n}\n"],"mappings":";;;;;AAMA,MAAM,cAAc,MAAM,QAAQ;AAElC,SAAgB,gBAAgB,SAAyB;CACvD,OAAO,QAAQ,QAAQ,aAAa,EAAE;AACxC;AAEA,MAAM,kBAAkB,MAAM,KAAK;AAEnC,SAAgB,WAAW,KAA+C;CACxE,IAAI,QAAQ,QAAQ,QAAQ,KAAA,GAC1B,OAAO;CAGT,IAAI,YAAY;CAIhB,YAAY,UAAU,QAAQ,iBAAiB,KAAK;CAEpD,OAAO;AACT;AAEA,MAAM,wBAAwB,MAAM,mCAAmC;AAEvE,SAAgB,iBAAiB,aAAwC;CACvE,MAAM,YAAY,SAAS,WAAW;CACtC,IAAI,CAAC,WAAW;EACd,OAAO,MACL,EAAE,KAAK,YAAY,GACnB,uCAAuC,aACzC;EACA,OAAO;GAAE,SAAS;GAAa,iBAAiB;EAAK;CACvD;CACA,IAAI,kBAAkB;CACtB,MAAM,uBAAuB,sBAAsB,KACjD,UAAU,IACZ,CAAC,EAAE;CACH,IAAI,sBAAsB;EACxB,MAAM,EAAE,aAAa;EACrB,UAAU,OAAO;EACjB,kBAAkB,OAAO,SAAS,UAAU,EAAE;CAChD,OAAO,IAAI,UAAU,SAAS,SAAS,OAAO,GAC5C,kBAAkB;CAIpB,OAAO;EAAE,SADO,UAAU;EACR;CAAgB;AACpC;;;;;;;AAQA,SAAgB,kBAAkB,GAAW,GAAmB;CAC9D,IAAIA,IAAW,QAAQ,CAAC,GAAG;EACzB,IAAIA,IAAW,QAAQ,CAAC,GACtB,OAAOA,IAAW,aAAa,GAAG,CAAC;EAErC,OAAO;CACT;CACA,IAAIA,IAAW,QAAQ,CAAC,GACtB,OAAO;CAET,OAAO;AACT"}
1
+ {"version":3,"file":"common.js","names":["versioning"],"sources":["../../../../lib/modules/datasource/nuget/common.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { api as versioning } from '../../versioning/nuget/index.ts';\nimport type { ParsedRegistryUrl } from './types.ts';\n\nconst buildMetaRe = regEx(/\\+.+$/g);\n\nexport function removeBuildMeta(version: string): string {\n return version.replace(buildMetaRe, '');\n}\n\nconst urlWhitespaceRe = regEx(/\\s/g);\n\nexport function massageUrl(url: string | null | undefined): string | null {\n if (isNullOrUndefined(url)) {\n return null;\n }\n\n let resultUrl = url;\n\n // During `dotnet pack` certain URLs are being URL decoded which may introduce whitespace\n // and causes Markdown link generation problems.\n resultUrl = resultUrl.replace(urlWhitespaceRe, '%20');\n\n return resultUrl;\n}\n\nconst protocolVersionRegExp = regEx(/#protocolVersion=(?<protocol>2|3)/);\n\nexport function parseRegistryUrl(registryUrl: string): ParsedRegistryUrl {\n const parsedUrl = parseUrl(registryUrl);\n if (!parsedUrl) {\n logger.debug(\n { urL: registryUrl },\n `nuget registry failure: can't parse ${registryUrl}`,\n );\n return { feedUrl: registryUrl, protocolVersion: null };\n }\n let protocolVersion = 2;\n const protocolVersionMatch = protocolVersionRegExp.exec(\n parsedUrl.hash,\n )?.groups;\n if (protocolVersionMatch) {\n const { protocol } = protocolVersionMatch;\n parsedUrl.hash = '';\n protocolVersion = Number.parseInt(protocol, 10);\n } else if (parsedUrl.pathname.endsWith('.json')) {\n protocolVersion = 3;\n }\n\n const feedUrl = parsedUrl.href;\n return { feedUrl, protocolVersion };\n}\n\n/**\n * Compare two versions. Return:\n * - `1` if `a > b` or `b` is invalid\n * - `-1` if `a < b` or `a` is invalid\n * - `0` if `a == b` or both `a` and `b` are invalid\n */\nexport function sortNugetVersions(a: string, b: string): number {\n if (versioning.isValid(a)) {\n if (versioning.isValid(b)) {\n return versioning.sortVersions(a, b);\n }\n return 1;\n }\n if (versioning.isValid(b)) {\n return -1;\n }\n return 0;\n}\n"],"mappings":";;;;;;AAOA,MAAM,cAAc,MAAM,QAAQ;AAElC,SAAgB,gBAAgB,SAAyB;CACvD,OAAO,QAAQ,QAAQ,aAAa,EAAE;AACxC;AAEA,MAAM,kBAAkB,MAAM,KAAK;AAEnC,SAAgB,WAAW,KAA+C;CACxE,IAAI,kBAAkB,GAAG,GACvB,OAAO;CAGT,IAAI,YAAY;CAIhB,YAAY,UAAU,QAAQ,iBAAiB,KAAK;CAEpD,OAAO;AACT;AAEA,MAAM,wBAAwB,MAAM,mCAAmC;AAEvE,SAAgB,iBAAiB,aAAwC;CACvE,MAAM,YAAY,SAAS,WAAW;CACtC,IAAI,CAAC,WAAW;EACd,OAAO,MACL,EAAE,KAAK,YAAY,GACnB,uCAAuC,aACzC;EACA,OAAO;GAAE,SAAS;GAAa,iBAAiB;EAAK;CACvD;CACA,IAAI,kBAAkB;CACtB,MAAM,uBAAuB,sBAAsB,KACjD,UAAU,IACZ,CAAC,EAAE;CACH,IAAI,sBAAsB;EACxB,MAAM,EAAE,aAAa;EACrB,UAAU,OAAO;EACjB,kBAAkB,OAAO,SAAS,UAAU,EAAE;CAChD,OAAO,IAAI,UAAU,SAAS,SAAS,OAAO,GAC5C,kBAAkB;CAIpB,OAAO;EAAE,SADO,UAAU;EACR;CAAgB;AACpC;;;;;;;AAQA,SAAgB,kBAAkB,GAAW,GAAmB;CAC9D,IAAIA,IAAW,QAAQ,CAAC,GAAG;EACzB,IAAIA,IAAW,QAAQ,CAAC,GACtB,OAAOA,IAAW,aAAa,GAAG,CAAC;EAErC,OAAO;CACT;CACA,IAAIA,IAAW,QAAQ,CAAC,GACtB,OAAO;CAET,OAAO;AACT"}
@@ -1,7 +1,7 @@
1
1
  import { logger } from "../../../logger/index.js";
2
2
  import { LooseArray, LooseRecord, Nullish } from "../../../util/schema-utils/index.js";
3
3
  import { MaybeTimestamp } from "../../../util/timestamp.js";
4
- import { isUndefined } from "@sindresorhus/is";
4
+ import { isString, isUndefined } from "@sindresorhus/is";
5
5
  import { z } from "zod/v4";
6
6
  //#region lib/modules/datasource/packagist/schema.ts
7
7
  const MinifiedArray = z.array(z.record(z.string(), z.unknown())).transform((xs) => {
@@ -86,7 +86,7 @@ function extractReleaseResult(...composerReleasesArrays) {
86
86
  }
87
87
  function getAbandonedMessage(abandoned) {
88
88
  const message = "This package is abandoned and no longer maintained.";
89
- if (typeof abandoned === "string") return `${message} The author suggests using the \`${abandoned}\` package instead.`;
89
+ if (isString(abandoned)) return `${message} The author suggests using the \`${abandoned}\` package instead.`;
90
90
  return message;
91
91
  }
92
92
  function extractDepReleases(composerReleases) {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/packagist/schema.ts"],"sourcesContent":["import { isUndefined } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport {\n LooseArray,\n LooseRecord,\n Nullish,\n} from '../../../util/schema-utils/index.ts';\nimport { MaybeTimestamp } from '../../../util/timestamp.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\n\nexport const MinifiedArray = z\n .array(z.record(z.string(), z.unknown()))\n .transform((xs) => {\n // Ported from: https://github.com/composer/metadata-minifier/blob/main/src/MetadataMinifier.php#L17\n if (xs.length === 0) {\n return xs;\n }\n\n const prevVals: Record<string, unknown> = {};\n for (const x of xs) {\n for (const key of Object.keys(x)) {\n prevVals[key] ??= undefined;\n }\n\n for (const key of Object.keys(prevVals)) {\n const val = x[key];\n if (val === '__unset') {\n delete x[key];\n prevVals[key] = undefined;\n continue;\n }\n\n if (!isUndefined(val)) {\n prevVals[key] = val;\n continue;\n }\n\n if (!isUndefined(prevVals[key])) {\n x[key] = prevVals[key];\n continue;\n }\n }\n }\n\n return xs;\n });\nexport type MinifiedArray = z.infer<typeof MinifiedArray>;\n\nexport const ComposerRelease = z.object({\n version: z.union([z.string(), z.number().transform((v) => v.toString())]),\n homepage: z.string().nullable().catch(null),\n source: z.object({ url: z.string() }).nullable().catch(null),\n time: MaybeTimestamp,\n ['published-time']: Nullish(MaybeTimestamp),\n require: z.object({ php: z.string() }).nullable().catch(null),\n abandoned: z.union([z.string(), z.boolean()]).optional().catch(undefined),\n});\nexport type ComposerRelease = z.infer<typeof ComposerRelease>;\n\nexport const ComposerReleases = z\n .union([\n MinifiedArray.pipe(LooseArray(ComposerRelease)),\n LooseRecord(ComposerRelease).transform((map) => Object.values(map)),\n ])\n .catch([]);\nexport type ComposerReleases = z.infer<typeof ComposerReleases>;\n\nexport const ComposerPackagesResponse = z\n .object({\n packageName: z.string(),\n packagesResponse: z.object({\n packages: z.record(z.string(), z.unknown()),\n }),\n })\n .transform(\n ({ packageName, packagesResponse }) =>\n packagesResponse.packages[packageName],\n )\n .transform((xs) => ComposerReleases.parse(xs));\nexport type ComposerPackagesResponse = z.infer<typeof ComposerPackagesResponse>;\n\nexport function parsePackagesResponse(\n packageName: string,\n packagesResponse: unknown,\n): ComposerReleases {\n try {\n return ComposerPackagesResponse.parse({ packageName, packagesResponse });\n } catch (err) {\n logger.debug(\n { packageName, err },\n `Error parsing packagist response for ${packageName}`,\n );\n return [];\n }\n}\n\nexport function extractReleaseResult(\n ...composerReleasesArrays: ComposerReleases[]\n): ReleaseResult | null {\n const releases: Release[] = [];\n let homepage: string | null | undefined;\n let sourceUrl: string | null | undefined;\n let deprecationMessage: string | undefined;\n\n for (const composerReleasesArray of composerReleasesArrays) {\n for (const composerRelease of composerReleasesArray) {\n const version = composerRelease.version.replace(/^v/, '');\n const gitRef = composerRelease.version;\n\n const dep: Release = { version, gitRef };\n\n // Packagist's `published-time` reflects when the version was actually published to the registry;\n // prefer it over `time` (the git tag's `releasedAt`, which could be when the commit that the tag points at was pushed, not the time the release itself was made public to the world), falling back when absent.\n const releaseTimestamp =\n composerRelease['published-time'] ?? composerRelease.time;\n if (releaseTimestamp) {\n dep.releaseTimestamp = releaseTimestamp;\n }\n\n if (composerRelease.require?.php) {\n dep.constraints = { php: [composerRelease.require.php] };\n }\n\n if (composerRelease.abandoned) {\n dep.isDeprecated = true;\n deprecationMessage ??= getAbandonedMessage(composerRelease.abandoned);\n // TODO #44060 when `abandoned` is a package name, emit replacementName/replacementVersion to open a replacement PR\n }\n\n releases.push(dep);\n\n if (!homepage && composerRelease.homepage) {\n homepage = composerRelease.homepage;\n }\n\n if (!sourceUrl && composerRelease.source?.url) {\n sourceUrl = composerRelease.source.url;\n }\n }\n }\n\n if (releases.length === 0) {\n return null;\n }\n\n const result: ReleaseResult = { releases };\n\n if (homepage) {\n result.homepage = homepage;\n }\n\n if (sourceUrl) {\n result.sourceUrl = sourceUrl;\n }\n\n if (deprecationMessage) {\n result.deprecationMessage = deprecationMessage;\n }\n\n return result;\n}\n\nfunction getAbandonedMessage(abandoned: string | boolean): string {\n const message = 'This package is abandoned and no longer maintained.';\n if (typeof abandoned === 'string') {\n return `${message} The author suggests using the \\`${abandoned}\\` package instead.`;\n }\n return message;\n}\n\nexport function extractDepReleases(\n composerReleases: unknown,\n): ReleaseResult | null {\n const parsedReleases = ComposerReleases.parse(composerReleases);\n return extractReleaseResult(parsedReleases);\n}\n\nexport function parsePackagesResponses(\n packageName: string,\n packagesResponses: unknown[],\n): ReleaseResult | null {\n const releaseArrays = packagesResponses.map((pkgResp) =>\n parsePackagesResponse(packageName, pkgResp),\n );\n return extractReleaseResult(...releaseArrays);\n}\n\nexport const HashSpec = z.union([\n z\n .object({ sha256: z.string().nullable() })\n .transform(({ sha256 }) => ({ hash: sha256 })),\n z\n .object({ sha1: z.string().nullable() })\n .transform(({ sha1 }) => ({ hash: sha1 })),\n]);\nexport type HashSpec = z.infer<typeof HashSpec>;\n\nexport const RegistryFile = z.intersection(\n HashSpec,\n z.object({ key: z.string() }),\n);\nexport type RegistryFile = z.infer<typeof RegistryFile>;\n\nexport const PackagesResponse = z.object({\n packages: LooseRecord(ComposerReleases).catch({}),\n});\nexport type PackagesResponse = z.infer<typeof PackagesResponse>;\n\nexport const PackagistFile = PackagesResponse.merge(\n z.object({\n providers: LooseRecord(HashSpec)\n .transform((x) =>\n Object.fromEntries(\n Object.entries(x).map(([key, { hash }]) => [key, hash]),\n ),\n )\n .catch({}),\n }),\n);\nexport type PackagistFile = z.infer<typeof PackagistFile>;\n\nexport const RegistryMeta = z\n .record(z.string(), z.unknown())\n .catch({})\n .pipe(\n PackagistFile.merge(\n z.object({\n ['includes']: LooseRecord(HashSpec)\n .transform((x) =>\n Object.entries(x).map(([name, { hash }]) => ({ key: name, hash })),\n )\n .catch([]),\n ['provider-includes']: LooseRecord(HashSpec)\n .transform((x) =>\n Object.entries(x).map(([key, { hash }]) => ({ key, hash })),\n )\n .catch([]),\n ['providers-lazy-url']: z.string().nullable().catch(null),\n ['providers-url']: z.string().nullable().catch(null),\n ['metadata-url']: z.string().nullable().catch(null),\n ['available-packages']: z.array(z.string()).nullable().catch(null),\n }),\n ),\n )\n .transform(\n ({\n ['includes']: includesFiles,\n ['packages']: packages,\n ['provider-includes']: files,\n ['providers']: providerPackages,\n ['providers-lazy-url']: providersLazyUrl,\n ['providers-url']: providersUrl,\n ['metadata-url']: metadataUrl,\n ['available-packages']: availablePackages,\n }) => {\n const includesPackages: Record<string, ReleaseResult | null> = {};\n return {\n packages,\n includesFiles,\n providerPackages,\n files,\n providersUrl,\n providersLazyUrl,\n metadataUrl,\n includesPackages,\n availablePackages,\n };\n },\n );\nexport type RegistryMeta = z.infer<typeof RegistryMeta>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/packagist/schema.ts"],"sourcesContent":["import { isString, isUndefined } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport {\n LooseArray,\n LooseRecord,\n Nullish,\n} from '../../../util/schema-utils/index.ts';\nimport { MaybeTimestamp } from '../../../util/timestamp.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\n\nexport const MinifiedArray = z\n .array(z.record(z.string(), z.unknown()))\n .transform((xs) => {\n // Ported from: https://github.com/composer/metadata-minifier/blob/main/src/MetadataMinifier.php#L17\n if (xs.length === 0) {\n return xs;\n }\n\n const prevVals: Record<string, unknown> = {};\n for (const x of xs) {\n for (const key of Object.keys(x)) {\n prevVals[key] ??= undefined;\n }\n\n for (const key of Object.keys(prevVals)) {\n const val = x[key];\n if (val === '__unset') {\n delete x[key];\n prevVals[key] = undefined;\n continue;\n }\n\n if (!isUndefined(val)) {\n prevVals[key] = val;\n continue;\n }\n\n if (!isUndefined(prevVals[key])) {\n x[key] = prevVals[key];\n continue;\n }\n }\n }\n\n return xs;\n });\nexport type MinifiedArray = z.infer<typeof MinifiedArray>;\n\nexport const ComposerRelease = z.object({\n version: z.union([z.string(), z.number().transform((v) => v.toString())]),\n homepage: z.string().nullable().catch(null),\n source: z.object({ url: z.string() }).nullable().catch(null),\n time: MaybeTimestamp,\n ['published-time']: Nullish(MaybeTimestamp),\n require: z.object({ php: z.string() }).nullable().catch(null),\n abandoned: z.union([z.string(), z.boolean()]).optional().catch(undefined),\n});\nexport type ComposerRelease = z.infer<typeof ComposerRelease>;\n\nexport const ComposerReleases = z\n .union([\n MinifiedArray.pipe(LooseArray(ComposerRelease)),\n LooseRecord(ComposerRelease).transform((map) => Object.values(map)),\n ])\n .catch([]);\nexport type ComposerReleases = z.infer<typeof ComposerReleases>;\n\nexport const ComposerPackagesResponse = z\n .object({\n packageName: z.string(),\n packagesResponse: z.object({\n packages: z.record(z.string(), z.unknown()),\n }),\n })\n .transform(\n ({ packageName, packagesResponse }) =>\n packagesResponse.packages[packageName],\n )\n .transform((xs) => ComposerReleases.parse(xs));\nexport type ComposerPackagesResponse = z.infer<typeof ComposerPackagesResponse>;\n\nexport function parsePackagesResponse(\n packageName: string,\n packagesResponse: unknown,\n): ComposerReleases {\n try {\n return ComposerPackagesResponse.parse({ packageName, packagesResponse });\n } catch (err) {\n logger.debug(\n { packageName, err },\n `Error parsing packagist response for ${packageName}`,\n );\n return [];\n }\n}\n\nexport function extractReleaseResult(\n ...composerReleasesArrays: ComposerReleases[]\n): ReleaseResult | null {\n const releases: Release[] = [];\n let homepage: string | null | undefined;\n let sourceUrl: string | null | undefined;\n let deprecationMessage: string | undefined;\n\n for (const composerReleasesArray of composerReleasesArrays) {\n for (const composerRelease of composerReleasesArray) {\n const version = composerRelease.version.replace(/^v/, '');\n const gitRef = composerRelease.version;\n\n const dep: Release = { version, gitRef };\n\n // Packagist's `published-time` reflects when the version was actually published to the registry;\n // prefer it over `time` (the git tag's `releasedAt`, which could be when the commit that the tag points at was pushed, not the time the release itself was made public to the world), falling back when absent.\n const releaseTimestamp =\n composerRelease['published-time'] ?? composerRelease.time;\n if (releaseTimestamp) {\n dep.releaseTimestamp = releaseTimestamp;\n }\n\n if (composerRelease.require?.php) {\n dep.constraints = { php: [composerRelease.require.php] };\n }\n\n if (composerRelease.abandoned) {\n dep.isDeprecated = true;\n deprecationMessage ??= getAbandonedMessage(composerRelease.abandoned);\n // TODO #44060 when `abandoned` is a package name, emit replacementName/replacementVersion to open a replacement PR\n }\n\n releases.push(dep);\n\n if (!homepage && composerRelease.homepage) {\n homepage = composerRelease.homepage;\n }\n\n if (!sourceUrl && composerRelease.source?.url) {\n sourceUrl = composerRelease.source.url;\n }\n }\n }\n\n if (releases.length === 0) {\n return null;\n }\n\n const result: ReleaseResult = { releases };\n\n if (homepage) {\n result.homepage = homepage;\n }\n\n if (sourceUrl) {\n result.sourceUrl = sourceUrl;\n }\n\n if (deprecationMessage) {\n result.deprecationMessage = deprecationMessage;\n }\n\n return result;\n}\n\nfunction getAbandonedMessage(abandoned: string | boolean): string {\n const message = 'This package is abandoned and no longer maintained.';\n if (isString(abandoned)) {\n return `${message} The author suggests using the \\`${abandoned}\\` package instead.`;\n }\n return message;\n}\n\nexport function extractDepReleases(\n composerReleases: unknown,\n): ReleaseResult | null {\n const parsedReleases = ComposerReleases.parse(composerReleases);\n return extractReleaseResult(parsedReleases);\n}\n\nexport function parsePackagesResponses(\n packageName: string,\n packagesResponses: unknown[],\n): ReleaseResult | null {\n const releaseArrays = packagesResponses.map((pkgResp) =>\n parsePackagesResponse(packageName, pkgResp),\n );\n return extractReleaseResult(...releaseArrays);\n}\n\nexport const HashSpec = z.union([\n z\n .object({ sha256: z.string().nullable() })\n .transform(({ sha256 }) => ({ hash: sha256 })),\n z\n .object({ sha1: z.string().nullable() })\n .transform(({ sha1 }) => ({ hash: sha1 })),\n]);\nexport type HashSpec = z.infer<typeof HashSpec>;\n\nexport const RegistryFile = z.intersection(\n HashSpec,\n z.object({ key: z.string() }),\n);\nexport type RegistryFile = z.infer<typeof RegistryFile>;\n\nexport const PackagesResponse = z.object({\n packages: LooseRecord(ComposerReleases).catch({}),\n});\nexport type PackagesResponse = z.infer<typeof PackagesResponse>;\n\nexport const PackagistFile = PackagesResponse.merge(\n z.object({\n providers: LooseRecord(HashSpec)\n .transform((x) =>\n Object.fromEntries(\n Object.entries(x).map(([key, { hash }]) => [key, hash]),\n ),\n )\n .catch({}),\n }),\n);\nexport type PackagistFile = z.infer<typeof PackagistFile>;\n\nexport const RegistryMeta = z\n .record(z.string(), z.unknown())\n .catch({})\n .pipe(\n PackagistFile.merge(\n z.object({\n ['includes']: LooseRecord(HashSpec)\n .transform((x) =>\n Object.entries(x).map(([name, { hash }]) => ({ key: name, hash })),\n )\n .catch([]),\n ['provider-includes']: LooseRecord(HashSpec)\n .transform((x) =>\n Object.entries(x).map(([key, { hash }]) => ({ key, hash })),\n )\n .catch([]),\n ['providers-lazy-url']: z.string().nullable().catch(null),\n ['providers-url']: z.string().nullable().catch(null),\n ['metadata-url']: z.string().nullable().catch(null),\n ['available-packages']: z.array(z.string()).nullable().catch(null),\n }),\n ),\n )\n .transform(\n ({\n ['includes']: includesFiles,\n ['packages']: packages,\n ['provider-includes']: files,\n ['providers']: providerPackages,\n ['providers-lazy-url']: providersLazyUrl,\n ['providers-url']: providersUrl,\n ['metadata-url']: metadataUrl,\n ['available-packages']: availablePackages,\n }) => {\n const includesPackages: Record<string, ReleaseResult | null> = {};\n return {\n packages,\n includesFiles,\n providerPackages,\n files,\n providersUrl,\n providersLazyUrl,\n metadataUrl,\n includesPackages,\n availablePackages,\n };\n },\n );\nexport type RegistryMeta = z.infer<typeof RegistryMeta>;\n"],"mappings":"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"}
@@ -2,15 +2,16 @@ import { logger } from "../../../../logger/index.js";
2
2
  import { toSha256 } from "../../../../util/hash.js";
3
3
  import { cachePathExists, createCacheReadStream, createCacheWriteStream, ensureCacheDir, pipeline, renameCacheFile, rmCache, statCacheFile } from "../../../../util/fs/index.js";
4
4
  import { acquireLock } from "../../../../util/mutex.js";
5
+ import { isNullOrUndefined } from "@sindresorhus/is";
5
6
  import { randomUUID } from "node:crypto";
6
7
  import upath from "upath";
7
8
  import { createGunzip } from "node:zlib";
8
9
  //#region lib/modules/datasource/rpm/providers/common.ts
9
10
  const cacheSubDir = "rpm";
10
11
  function formatRpmVersion(ver, rel) {
11
- if (ver === void 0 || ver === null) return null;
12
+ if (isNullOrUndefined(ver)) return null;
12
13
  const version = String(ver);
13
- if (rel === void 0 || rel === null) return version;
14
+ if (isNullOrUndefined(rel)) return version;
14
15
  return `${version}-${String(rel)}`;
15
16
  }
16
17
  function buildReleaseResult(versions) {
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":["fs.statCacheFile","fs.createCacheWriteStream","fs.pipeline","fs.createCacheReadStream","fs.ensureCacheDir","fs.renameCacheFile","fs.cachePathExists","fs.rmCache"],"sources":["../../../../../lib/modules/datasource/rpm/providers/common.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { createGunzip } from 'node:zlib';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport * as fs from '../../../../util/fs/index.ts';\nimport { toSha256 } from '../../../../util/hash.ts';\nimport type { Http, HttpOptions } from '../../../../util/http/index.ts';\nimport { acquireLock } from '../../../../util/mutex.ts';\nimport type { ReleaseResult } from '../../types.ts';\nimport { datasource } from '../common.ts';\n\nconst cacheSubDir = datasource;\n\ntype RpmVersionValue = boolean | number | string | null | undefined;\n\nexport function formatRpmVersion(\n ver: RpmVersionValue,\n rel?: RpmVersionValue,\n): string | null {\n if (ver === undefined || ver === null) {\n return null;\n }\n\n const version = String(ver);\n\n if (rel === undefined || rel === null) {\n return version;\n }\n\n return `${version}-${String(rel)}`;\n}\n\nexport function buildReleaseResult(\n versions: Iterable<string>,\n): ReleaseResult | null {\n const uniqueVersions = [...new Set(versions)];\n\n if (uniqueVersions.length === 0) {\n return null;\n }\n\n return {\n releases: uniqueVersions.map((version) => ({ version })),\n };\n}\n\nasync function getFileCreationTime(\n filePath: string,\n): Promise<Date | undefined> {\n const stats = await fs.statCacheFile(filePath);\n return stats?.ctime;\n}\n\nasync function checkIfModified(\n url: string,\n lastDownloadTimestamp: Date,\n http: Http,\n): Promise<boolean> {\n const options: HttpOptions = {\n headers: {\n 'If-Modified-Since': lastDownloadTimestamp.toUTCString(),\n },\n };\n\n try {\n const response = await http.head(url, options);\n return response.statusCode !== 304;\n } catch (err) {\n logger.warn(\n {\n err,\n lastDownloadTimestamp,\n url,\n },\n 'Could not determine if metadata file is modified since last download',\n );\n return true;\n }\n}\n\nasync function downloadGzipFile(\n url: string,\n compressedFile: string,\n http: Http,\n lastDownloadTimestamp?: Date,\n): Promise<boolean> {\n let needsToDownload = true;\n\n if (lastDownloadTimestamp) {\n needsToDownload = await checkIfModified(url, lastDownloadTimestamp, http);\n }\n\n if (!needsToDownload) {\n logger.debug(`No need to download ${url}, file is up to date.`);\n return false;\n }\n\n const readStream = http.stream(url);\n const writeStream = fs.createCacheWriteStream(compressedFile);\n await fs.pipeline(readStream, writeStream);\n\n const compressedStats = await fs.statCacheFile(compressedFile);\n if (!compressedStats || compressedStats.size === 0) {\n logger.debug(`Empty response body from getting ${url}.`);\n throw new Error(`Empty response body from getting ${url}.`);\n }\n\n return true;\n}\n\nasync function extractGzipFile(\n compressedFile: string,\n extractedFile: string,\n): Promise<void> {\n await fs.pipeline(\n fs.createCacheReadStream(compressedFile),\n createGunzip(),\n fs.createCacheWriteStream(extractedFile),\n );\n}\n\nexport async function getCachedGunzippedFile(\n http: Http,\n url: string,\n extension: 'xml',\n): Promise<string> {\n const releaseLock = await acquireLock(\n `gunzipped-file:${url}:${extension}`,\n 'datasource-rpm',\n );\n\n try {\n const cacheDir = await fs.ensureCacheDir(cacheSubDir);\n const urlHash = toSha256(url);\n const extractedFile = upath.join(cacheDir, `${urlHash}.${extension}`);\n let lastTimestamp = await getFileCreationTime(extractedFile);\n\n const compressedFile = upath.join(\n cacheDir,\n `${randomUUID()}_${urlHash}.gz`,\n );\n const extractedTempFile = upath.join(\n cacheDir,\n `${randomUUID()}_${urlHash}.${extension}`,\n );\n\n try {\n const wasUpdated = await downloadGzipFile(\n url,\n compressedFile,\n http,\n lastTimestamp,\n );\n\n if (wasUpdated || !lastTimestamp) {\n try {\n // Only replace the shared cache file after a successful extract.\n await extractGzipFile(compressedFile, extractedTempFile);\n await fs.renameCacheFile(extractedTempFile, extractedFile);\n lastTimestamp = await getFileCreationTime(extractedFile);\n } catch (err) {\n logger.warn(\n {\n compressedFile,\n err,\n extension,\n extractedFile,\n url,\n },\n 'Failed to extract RPM metadata file from compressed file',\n );\n }\n }\n\n if (!lastTimestamp) {\n throw new Error('Missing metadata in extracted RPM metadata file!');\n }\n\n return extractedFile;\n } finally {\n if (await fs.cachePathExists(compressedFile)) {\n await fs.rmCache(compressedFile);\n }\n if (await fs.cachePathExists(extractedTempFile)) {\n await fs.rmCache(extractedTempFile);\n }\n }\n } finally {\n releaseLock();\n }\n}\n"],"mappings":";;;;;;;;AAWA,MAAM,cAAA;AAIN,SAAgB,iBACd,KACA,KACe;CACf,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAC/B,OAAO;CAGT,MAAM,UAAU,OAAO,GAAG;CAE1B,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAC/B,OAAO;CAGT,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG;AACjC;AAEA,SAAgB,mBACd,UACsB;CACtB,MAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;CAE5C,IAAI,eAAe,WAAW,GAC5B,OAAO;CAGT,OAAO,EACL,UAAU,eAAe,KAAK,aAAa,EAAE,QAAQ,EAAE,EACzD;AACF;AAEA,eAAe,oBACb,UAC2B;CAE3B,QAAO,MADaA,cAAiB,QAAQ,EAAA,EAC/B;AAChB;AAEA,eAAe,gBACb,KACA,uBACA,MACkB;CAClB,MAAM,UAAuB,EAC3B,SAAS,EACP,qBAAqB,sBAAsB,YAAY,EACzD,EACF;CAEA,IAAI;EAEF,QAAO,MADgB,KAAK,KAAK,KAAK,OAAO,EAAA,CAC7B,eAAe;CACjC,SAAS,KAAK;EACZ,OAAO,KACL;GACE;GACA;GACA;EACF,GACA,sEACF;EACA,OAAO;CACT;AACF;AAEA,eAAe,iBACb,KACA,gBACA,MACA,uBACkB;CAClB,IAAI,kBAAkB;CAEtB,IAAI,uBACF,kBAAkB,MAAM,gBAAgB,KAAK,uBAAuB,IAAI;CAG1E,IAAI,CAAC,iBAAiB;EACpB,OAAO,MAAM,uBAAuB,IAAI,sBAAsB;EAC9D,OAAO;CACT;CAEA,MAAM,aAAa,KAAK,OAAO,GAAG;CAClC,MAAM,cAAcC,uBAA0B,cAAc;CAC5D,MAAMC,SAAY,YAAY,WAAW;CAEzC,MAAM,kBAAkB,MAAMF,cAAiB,cAAc;CAC7D,IAAI,CAAC,mBAAmB,gBAAgB,SAAS,GAAG;EAClD,OAAO,MAAM,oCAAoC,IAAI,EAAE;EACvD,MAAM,IAAI,MAAM,oCAAoC,IAAI,EAAE;CAC5D;CAEA,OAAO;AACT;AAEA,eAAe,gBACb,gBACA,eACe;CACf,MAAME,SACJC,sBAAyB,cAAc,GACvC,aAAa,GACbF,uBAA0B,aAAa,CACzC;AACF;AAEA,eAAsB,uBACpB,MACA,KACA,WACiB;CACjB,MAAM,cAAc,MAAM,YACxB,kBAAkB,IAAI,GAAG,aACzB,gBACF;CAEA,IAAI;EACF,MAAM,WAAW,MAAMG,eAAkB,WAAW;EACpD,MAAM,UAAU,SAAS,GAAG;EAC5B,MAAM,gBAAgB,MAAM,KAAK,UAAU,GAAG,QAAQ,GAAG,WAAW;EACpE,IAAI,gBAAgB,MAAM,oBAAoB,aAAa;EAE3D,MAAM,iBAAiB,MAAM,KAC3B,UACA,GAAG,WAAW,EAAE,GAAG,QAAQ,IAC7B;EACA,MAAM,oBAAoB,MAAM,KAC9B,UACA,GAAG,WAAW,EAAE,GAAG,QAAQ,GAAG,WAChC;EAEA,IAAI;GAQF,IAAI,MAPqB,iBACvB,KACA,gBACA,MACA,aACF,KAEkB,CAAC,eACjB,IAAI;IAEF,MAAM,gBAAgB,gBAAgB,iBAAiB;IACvD,MAAMC,gBAAmB,mBAAmB,aAAa;IACzD,gBAAgB,MAAM,oBAAoB,aAAa;GACzD,SAAS,KAAK;IACZ,OAAO,KACL;KACE;KACA;KACA;KACA;KACA;IACF,GACA,0DACF;GACF;GAGF,IAAI,CAAC,eACH,MAAM,IAAI,MAAM,kDAAkD;GAGpE,OAAO;EACT,UAAU;GACR,IAAI,MAAMC,gBAAmB,cAAc,GACzC,MAAMC,QAAW,cAAc;GAEjC,IAAI,MAAMD,gBAAmB,iBAAiB,GAC5C,MAAMC,QAAW,iBAAiB;EAEtC;CACF,UAAU;EACR,YAAY;CACd;AACF"}
1
+ {"version":3,"file":"common.js","names":["fs.statCacheFile","fs.createCacheWriteStream","fs.pipeline","fs.createCacheReadStream","fs.ensureCacheDir","fs.renameCacheFile","fs.cachePathExists","fs.rmCache"],"sources":["../../../../../lib/modules/datasource/rpm/providers/common.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { createGunzip } from 'node:zlib';\nimport { isNullOrUndefined } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport * as fs from '../../../../util/fs/index.ts';\nimport { toSha256 } from '../../../../util/hash.ts';\nimport type { Http, HttpOptions } from '../../../../util/http/index.ts';\nimport { acquireLock } from '../../../../util/mutex.ts';\nimport type { ReleaseResult } from '../../types.ts';\nimport { datasource } from '../common.ts';\n\nconst cacheSubDir = datasource;\n\ntype RpmVersionValue = boolean | number | string | null | undefined;\n\nexport function formatRpmVersion(\n ver: RpmVersionValue,\n rel?: RpmVersionValue,\n): string | null {\n if (isNullOrUndefined(ver)) {\n return null;\n }\n\n const version = String(ver);\n\n if (isNullOrUndefined(rel)) {\n return version;\n }\n\n return `${version}-${String(rel)}`;\n}\n\nexport function buildReleaseResult(\n versions: Iterable<string>,\n): ReleaseResult | null {\n const uniqueVersions = [...new Set(versions)];\n\n if (uniqueVersions.length === 0) {\n return null;\n }\n\n return {\n releases: uniqueVersions.map((version) => ({ version })),\n };\n}\n\nasync function getFileCreationTime(\n filePath: string,\n): Promise<Date | undefined> {\n const stats = await fs.statCacheFile(filePath);\n return stats?.ctime;\n}\n\nasync function checkIfModified(\n url: string,\n lastDownloadTimestamp: Date,\n http: Http,\n): Promise<boolean> {\n const options: HttpOptions = {\n headers: {\n 'If-Modified-Since': lastDownloadTimestamp.toUTCString(),\n },\n };\n\n try {\n const response = await http.head(url, options);\n return response.statusCode !== 304;\n } catch (err) {\n logger.warn(\n {\n err,\n lastDownloadTimestamp,\n url,\n },\n 'Could not determine if metadata file is modified since last download',\n );\n return true;\n }\n}\n\nasync function downloadGzipFile(\n url: string,\n compressedFile: string,\n http: Http,\n lastDownloadTimestamp?: Date,\n): Promise<boolean> {\n let needsToDownload = true;\n\n if (lastDownloadTimestamp) {\n needsToDownload = await checkIfModified(url, lastDownloadTimestamp, http);\n }\n\n if (!needsToDownload) {\n logger.debug(`No need to download ${url}, file is up to date.`);\n return false;\n }\n\n const readStream = http.stream(url);\n const writeStream = fs.createCacheWriteStream(compressedFile);\n await fs.pipeline(readStream, writeStream);\n\n const compressedStats = await fs.statCacheFile(compressedFile);\n if (!compressedStats || compressedStats.size === 0) {\n logger.debug(`Empty response body from getting ${url}.`);\n throw new Error(`Empty response body from getting ${url}.`);\n }\n\n return true;\n}\n\nasync function extractGzipFile(\n compressedFile: string,\n extractedFile: string,\n): Promise<void> {\n await fs.pipeline(\n fs.createCacheReadStream(compressedFile),\n createGunzip(),\n fs.createCacheWriteStream(extractedFile),\n );\n}\n\nexport async function getCachedGunzippedFile(\n http: Http,\n url: string,\n extension: 'xml',\n): Promise<string> {\n const releaseLock = await acquireLock(\n `gunzipped-file:${url}:${extension}`,\n 'datasource-rpm',\n );\n\n try {\n const cacheDir = await fs.ensureCacheDir(cacheSubDir);\n const urlHash = toSha256(url);\n const extractedFile = upath.join(cacheDir, `${urlHash}.${extension}`);\n let lastTimestamp = await getFileCreationTime(extractedFile);\n\n const compressedFile = upath.join(\n cacheDir,\n `${randomUUID()}_${urlHash}.gz`,\n );\n const extractedTempFile = upath.join(\n cacheDir,\n `${randomUUID()}_${urlHash}.${extension}`,\n );\n\n try {\n const wasUpdated = await downloadGzipFile(\n url,\n compressedFile,\n http,\n lastTimestamp,\n );\n\n if (wasUpdated || !lastTimestamp) {\n try {\n // Only replace the shared cache file after a successful extract.\n await extractGzipFile(compressedFile, extractedTempFile);\n await fs.renameCacheFile(extractedTempFile, extractedFile);\n lastTimestamp = await getFileCreationTime(extractedFile);\n } catch (err) {\n logger.warn(\n {\n compressedFile,\n err,\n extension,\n extractedFile,\n url,\n },\n 'Failed to extract RPM metadata file from compressed file',\n );\n }\n }\n\n if (!lastTimestamp) {\n throw new Error('Missing metadata in extracted RPM metadata file!');\n }\n\n return extractedFile;\n } finally {\n if (await fs.cachePathExists(compressedFile)) {\n await fs.rmCache(compressedFile);\n }\n if (await fs.cachePathExists(extractedTempFile)) {\n await fs.rmCache(extractedTempFile);\n }\n }\n } finally {\n releaseLock();\n }\n}\n"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { logger } from "../../../logger/index.js";
2
+ import { isNullOrUndefined } from "@sindresorhus/is";
2
3
  //#region lib/modules/manager/ant/update.ts
3
4
  /** For external .properties files: updateDependency is necessary because extractPackageFile can't reconstruct dep metadata from a .properties file alone */
4
5
  function updateDependency({ fileContent, upgrade }) {
5
6
  const { depName, currentValue, newValue, fileReplacePosition } = upgrade;
6
- if (fileReplacePosition === void 0 || fileReplacePosition === null) {
7
+ if (isNullOrUndefined(fileReplacePosition)) {
7
8
  logger.debug({ depName }, "No fileReplacePosition for ant dependency");
8
9
  return null;
9
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","names":[],"sources":["../../../../lib/modules/manager/ant/update.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport type { UpdateDependencyConfig } from '../types.ts';\n\n/** For external .properties files: updateDependency is necessary because extractPackageFile can't reconstruct dep metadata from a .properties file alone */\nexport function updateDependency({\n fileContent,\n upgrade,\n}: UpdateDependencyConfig): string | null {\n const { depName, currentValue, newValue, fileReplacePosition } = upgrade;\n\n if (fileReplacePosition === undefined || fileReplacePosition === null) {\n logger.debug({ depName }, 'No fileReplacePosition for ant dependency');\n return null;\n }\n\n const leftPart = fileContent.slice(0, fileReplacePosition);\n const rightPart = fileContent.slice(fileReplacePosition);\n\n // Find the end of the value (closing quote or end of line for .properties files)\n let endIndex: number;\n const quoteChar = leftPart.at(-1);\n if (quoteChar === '\"' || quoteChar === \"'\") {\n endIndex = rightPart.indexOf(quoteChar);\n } else {\n // Could be a .properties file or a substring inside a coords attribute\n const newlineIndex = rightPart.indexOf('\\n');\n const lineEnd = newlineIndex === -1 ? rightPart.length : newlineIndex;\n\n // Check for closing quote before newline (indicates coords attribute)\n const nearestQuote = [\n rightPart.indexOf('\"'),\n rightPart.indexOf(\"'\"),\n ].filter((i) => i !== -1 && i < lineEnd);\n\n if (nearestQuote.length > 0) {\n // Inside a quoted attribute (coords) - version ends at : or closing quote\n const quoteEnd = Math.min(...nearestQuote);\n const colonIndex = rightPart.indexOf(':');\n endIndex =\n colonIndex !== -1 && colonIndex < quoteEnd ? colonIndex : quoteEnd;\n } else {\n // .properties file: value ends at newline or EOF\n endIndex = lineEnd;\n }\n }\n\n const currentFound = rightPart.slice(0, endIndex);\n\n if (currentFound === newValue) {\n return fileContent;\n }\n\n if (currentFound === currentValue || upgrade.sharedVariableName) {\n return `${leftPart}${newValue}${rightPart.slice(endIndex)}`;\n }\n\n logger.debug(\n { depName, currentFound, currentValue, newValue },\n 'ant: unexpected value at fileReplacePosition',\n );\n return null;\n}\n"],"mappings":";;;AAIA,SAAgB,iBAAiB,EAC/B,aACA,WACwC;CACxC,MAAM,EAAE,SAAS,cAAc,UAAU,wBAAwB;CAEjE,IAAI,wBAAwB,KAAA,KAAa,wBAAwB,MAAM;EACrE,OAAO,MAAM,EAAE,QAAQ,GAAG,2CAA2C;EACrE,OAAO;CACT;CAEA,MAAM,WAAW,YAAY,MAAM,GAAG,mBAAmB;CACzD,MAAM,YAAY,YAAY,MAAM,mBAAmB;CAGvD,IAAI;CACJ,MAAM,YAAY,SAAS,GAAG,EAAE;CAChC,IAAI,cAAc,QAAO,cAAc,KACrC,WAAW,UAAU,QAAQ,SAAS;MACjC;EAEL,MAAM,eAAe,UAAU,QAAQ,IAAI;EAC3C,MAAM,UAAU,iBAAiB,KAAK,UAAU,SAAS;EAGzD,MAAM,eAAe,CACnB,UAAU,QAAQ,IAAG,GACrB,UAAU,QAAQ,GAAG,CACvB,CAAC,CAAC,QAAQ,MAAM,MAAM,MAAM,IAAI,OAAO;EAEvC,IAAI,aAAa,SAAS,GAAG;GAE3B,MAAM,WAAW,KAAK,IAAI,GAAG,YAAY;GACzC,MAAM,aAAa,UAAU,QAAQ,GAAG;GACxC,WACE,eAAe,MAAM,aAAa,WAAW,aAAa;EAC9D,OAEE,WAAW;CAEf;CAEA,MAAM,eAAe,UAAU,MAAM,GAAG,QAAQ;CAEhD,IAAI,iBAAiB,UACnB,OAAO;CAGT,IAAI,iBAAiB,gBAAgB,QAAQ,oBAC3C,OAAO,GAAG,WAAW,WAAW,UAAU,MAAM,QAAQ;CAG1D,OAAO,MACL;EAAE;EAAS;EAAc;EAAc;CAAS,GAChD,8CACF;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"update.js","names":[],"sources":["../../../../lib/modules/manager/ant/update.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport type { UpdateDependencyConfig } from '../types.ts';\n\n/** For external .properties files: updateDependency is necessary because extractPackageFile can't reconstruct dep metadata from a .properties file alone */\nexport function updateDependency({\n fileContent,\n upgrade,\n}: UpdateDependencyConfig): string | null {\n const { depName, currentValue, newValue, fileReplacePosition } = upgrade;\n\n if (isNullOrUndefined(fileReplacePosition)) {\n logger.debug({ depName }, 'No fileReplacePosition for ant dependency');\n return null;\n }\n\n const leftPart = fileContent.slice(0, fileReplacePosition);\n const rightPart = fileContent.slice(fileReplacePosition);\n\n // Find the end of the value (closing quote or end of line for .properties files)\n let endIndex: number;\n const quoteChar = leftPart.at(-1);\n if (quoteChar === '\"' || quoteChar === \"'\") {\n endIndex = rightPart.indexOf(quoteChar);\n } else {\n // Could be a .properties file or a substring inside a coords attribute\n const newlineIndex = rightPart.indexOf('\\n');\n const lineEnd = newlineIndex === -1 ? rightPart.length : newlineIndex;\n\n // Check for closing quote before newline (indicates coords attribute)\n const nearestQuote = [\n rightPart.indexOf('\"'),\n rightPart.indexOf(\"'\"),\n ].filter((i) => i !== -1 && i < lineEnd);\n\n if (nearestQuote.length > 0) {\n // Inside a quoted attribute (coords) - version ends at : or closing quote\n const quoteEnd = Math.min(...nearestQuote);\n const colonIndex = rightPart.indexOf(':');\n endIndex =\n colonIndex !== -1 && colonIndex < quoteEnd ? colonIndex : quoteEnd;\n } else {\n // .properties file: value ends at newline or EOF\n endIndex = lineEnd;\n }\n }\n\n const currentFound = rightPart.slice(0, endIndex);\n\n if (currentFound === newValue) {\n return fileContent;\n }\n\n if (currentFound === currentValue || upgrade.sharedVariableName) {\n return `${leftPart}${newValue}${rightPart.slice(endIndex)}`;\n }\n\n logger.debug(\n { depName, currentFound, currentValue, newValue },\n 'ant: unexpected value at fileReplacePosition',\n );\n return null;\n}\n"],"mappings":";;;;AAKA,SAAgB,iBAAiB,EAC/B,aACA,WACwC;CACxC,MAAM,EAAE,SAAS,cAAc,UAAU,wBAAwB;CAEjE,IAAI,kBAAkB,mBAAmB,GAAG;EAC1C,OAAO,MAAM,EAAE,QAAQ,GAAG,2CAA2C;EACrE,OAAO;CACT;CAEA,MAAM,WAAW,YAAY,MAAM,GAAG,mBAAmB;CACzD,MAAM,YAAY,YAAY,MAAM,mBAAmB;CAGvD,IAAI;CACJ,MAAM,YAAY,SAAS,GAAG,EAAE;CAChC,IAAI,cAAc,QAAO,cAAc,KACrC,WAAW,UAAU,QAAQ,SAAS;MACjC;EAEL,MAAM,eAAe,UAAU,QAAQ,IAAI;EAC3C,MAAM,UAAU,iBAAiB,KAAK,UAAU,SAAS;EAGzD,MAAM,eAAe,CACnB,UAAU,QAAQ,IAAG,GACrB,UAAU,QAAQ,GAAG,CACvB,CAAC,CAAC,QAAQ,MAAM,MAAM,MAAM,IAAI,OAAO;EAEvC,IAAI,aAAa,SAAS,GAAG;GAE3B,MAAM,WAAW,KAAK,IAAI,GAAG,YAAY;GACzC,MAAM,aAAa,UAAU,QAAQ,GAAG;GACxC,WACE,eAAe,MAAM,aAAa,WAAW,aAAa;EAC9D,OAEE,WAAW;CAEf;CAEA,MAAM,eAAe,UAAU,MAAM,GAAG,QAAQ;CAEhD,IAAI,iBAAiB,UACnB,OAAO;CAGT,IAAI,iBAAiB,gBAAgB,QAAQ,oBAC3C,OAAO,GAAG,WAAW,WAAW,UAAU,MAAM,QAAQ;CAG1D,OAAO,MACL;EAAE;EAAS;EAAc;EAAc;CAAS,GAChD,8CACF;CACA,OAAO;AACT"}
@@ -1,5 +1,6 @@
1
1
  import { LooseArray, LooseRecord } from "../../../../util/schema-utils/index.js";
2
2
  import { asBoolean } from "./starlark.js";
3
+ import { isString } from "@sindresorhus/is";
3
4
  import { z } from "zod/v4";
4
5
  //#region lib/modules/manager/bazel-module/parser/fragments.ts
5
6
  const StringFragment = z.object({
@@ -94,7 +95,7 @@ function boolean(value) {
94
95
  return {
95
96
  type: "boolean",
96
97
  isComplete: true,
97
- value: typeof value === "string" ? asBoolean(value) : value
98
+ value: isString(value) ? asBoolean(value) : value
98
99
  };
99
100
  }
100
101
  function rule(rule, children = {}, isComplete = false) {
@@ -163,10 +164,10 @@ function array(items = [], isComplete = false) {
163
164
  function isValue(data) {
164
165
  return ValueFragments.safeParse(data).success;
165
166
  }
166
- function isPrimitive(data) {
167
+ function isPrimitive$1(data) {
167
168
  return PrimitiveFragments.safeParse(data).success;
168
169
  }
169
170
  //#endregion
170
- export { ArrayFragment, AttributeFragment, BooleanFragment, ExtensionTagFragment, PreparedExtensionTagFragment, RepoRuleCallFragment, RuleFragment, StringArrayFragment, StringFragment, UseRepoRuleFragment, array, attribute, boolean, extensionTag, isPrimitive, isValue, preparedExtensionTag, repoRuleCall, rule, string, useRepoRule };
171
+ export { ArrayFragment, AttributeFragment, BooleanFragment, ExtensionTagFragment, PreparedExtensionTagFragment, RepoRuleCallFragment, RuleFragment, StringArrayFragment, StringFragment, UseRepoRuleFragment, array, attribute, boolean, extensionTag, isPrimitive$1 as isPrimitive, isValue, preparedExtensionTag, repoRuleCall, rule, string, useRepoRule };
171
172
 
172
173
  //# sourceMappingURL=fragments.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fragments.js","names":["starlark.asBoolean"],"sources":["../../../../../lib/modules/manager/bazel-module/parser/fragments.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport {\n LooseArray,\n LooseRecord,\n} from '../../../../util/schema-utils/index.ts';\nimport * as starlark from './starlark.ts';\n\nexport const StringFragment = z.object({\n type: z.literal('string'),\n value: z.string(),\n isComplete: z.literal(true),\n});\nexport const BooleanFragment = z.object({\n type: z.literal('boolean'),\n value: z.boolean(),\n isComplete: z.literal(true),\n});\nconst PrimitiveFragments = z.discriminatedUnion('type', [\n StringFragment,\n BooleanFragment,\n]);\nexport const ArrayFragment = z.object({\n type: z.literal('array'),\n items: LooseArray(PrimitiveFragments),\n isComplete: z.boolean(),\n});\nexport const StringArrayFragment = z.object({\n type: z.literal('array'),\n items: LooseArray(StringFragment),\n isComplete: z.boolean(),\n});\nconst ValueFragments = z.discriminatedUnion('type', [\n StringFragment,\n BooleanFragment,\n ArrayFragment,\n]);\nexport const RuleFragment = z.object({\n type: z.literal('rule'),\n rule: z.string(),\n children: LooseRecord(ValueFragments),\n isComplete: z.boolean(),\n});\nexport const PreparedExtensionTagFragment = z.object({\n type: z.literal('preparedExtensionTag'),\n // See ExtensionTagFragment for documentation of the fields.\n extension: z.string(),\n rawExtension: z.string(),\n offset: z.number(), // start offset in the source string\n isComplete: z.literal(false), // never complete, parser internal type.\n});\nexport const ExtensionTagFragment = z.object({\n type: z.literal('extensionTag'),\n // The \"logical\" name of the extension (e.g. `oci` or `maven`).\n extension: z.string(),\n // The \"raw\" name of the extension as it appears in the MODULE file (e.g. `maven_01` or `maven`)\n rawExtension: z.string(),\n tag: z.string(),\n children: LooseRecord(ValueFragments),\n isComplete: z.boolean(),\n offset: z.number(), // start offset in the source string\n rawString: z.string().optional(), // raw source string\n});\nexport const UseRepoRuleFragment = z.object({\n type: z.literal('useRepoRule'),\n variableName: z.string(),\n bzlFile: z.string(),\n ruleName: z.string(),\n isComplete: z.boolean(),\n});\nexport const RepoRuleCallFragment = z.object({\n type: z.literal('repoRuleCall'),\n functionName: z.string(),\n children: LooseRecord(ValueFragments),\n isComplete: z.boolean(),\n offset: z.number(),\n rawString: z.string().optional(),\n});\nexport const AttributeFragment = z.object({\n type: z.literal('attribute'),\n name: z.string(),\n value: ValueFragments.optional(),\n isComplete: z.boolean(),\n});\nexport const AllFragments = z.discriminatedUnion('type', [\n ArrayFragment,\n AttributeFragment,\n BooleanFragment,\n RuleFragment,\n PreparedExtensionTagFragment,\n ExtensionTagFragment,\n UseRepoRuleFragment,\n RepoRuleCallFragment,\n StringFragment,\n]);\n\nexport type AllFragments = z.infer<typeof AllFragments>;\nexport type ArrayFragment = z.infer<typeof ArrayFragment>;\nexport type AttributeFragment = z.infer<typeof AttributeFragment>;\nexport type BooleanFragment = z.infer<typeof BooleanFragment>;\nexport type ChildFragments = Record<string, ValueFragments>;\nexport type PrimitiveFragments = z.infer<typeof PrimitiveFragments>;\nexport type RuleFragment = z.infer<typeof RuleFragment>;\nexport type PreparedExtensionTagFragment = z.infer<\n typeof PreparedExtensionTagFragment\n>;\nexport type ExtensionTagFragment = z.infer<typeof ExtensionTagFragment>;\nexport type UseRepoRuleFragment = z.infer<typeof UseRepoRuleFragment>;\nexport type RepoRuleCallFragment = z.infer<typeof RepoRuleCallFragment>;\nexport type StringFragment = z.infer<typeof StringFragment>;\nexport type ValueFragments = z.infer<typeof ValueFragments>;\nexport type ResultFragment =\n | RuleFragment\n | ExtensionTagFragment\n | UseRepoRuleFragment\n | RepoRuleCallFragment;\n\nexport function string(value: string): StringFragment {\n return {\n type: 'string',\n isComplete: true,\n value,\n };\n}\n\nexport function boolean(value: string | boolean): BooleanFragment {\n return {\n type: 'boolean',\n isComplete: true,\n value: typeof value === 'string' ? starlark.asBoolean(value) : value,\n };\n}\n\nexport function rule(\n rule: string,\n children: ChildFragments = {},\n isComplete = false,\n): RuleFragment {\n return {\n type: 'rule',\n rule,\n isComplete,\n children,\n };\n}\n\nexport function preparedExtensionTag(\n extension: string,\n rawExtension: string,\n offset: number,\n): PreparedExtensionTagFragment {\n return {\n type: 'preparedExtensionTag',\n extension,\n rawExtension,\n offset,\n isComplete: false, // never complete\n };\n}\n\nexport function extensionTag(\n extension: string,\n rawExtension: string,\n tag: string,\n offset: number,\n children: ChildFragments = {},\n rawString?: string,\n isComplete = false,\n): ExtensionTagFragment {\n return {\n type: 'extensionTag',\n extension,\n rawExtension,\n tag,\n offset,\n rawString,\n isComplete,\n children,\n };\n}\n\nexport function useRepoRule(\n variableName: string,\n bzlFile: string,\n ruleName: string,\n isComplete = false,\n): UseRepoRuleFragment {\n return {\n type: 'useRepoRule',\n variableName,\n bzlFile,\n ruleName,\n isComplete,\n };\n}\n\nexport function repoRuleCall(\n functionName: string,\n offset: number,\n children: ChildFragments = {},\n rawString?: string,\n isComplete = false,\n): RepoRuleCallFragment {\n return {\n type: 'repoRuleCall',\n functionName,\n offset,\n rawString,\n isComplete,\n children,\n };\n}\n\nexport function attribute(\n name: string,\n value?: ValueFragments,\n isComplete = false,\n): AttributeFragment {\n return {\n type: 'attribute',\n name,\n value,\n isComplete,\n };\n}\n\nexport function array(\n items: PrimitiveFragments[] = [],\n isComplete = false,\n): ArrayFragment {\n return {\n type: 'array',\n items,\n isComplete,\n };\n}\n\nexport function isValue(data: unknown): data is ValueFragments {\n const result = ValueFragments.safeParse(data);\n return result.success;\n}\n\nexport function isPrimitive(data: unknown): data is PrimitiveFragments {\n const result = PrimitiveFragments.safeParse(data);\n return result.success;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"fragments.js","names":["starlark.asBoolean","isPrimitive"],"sources":["../../../../../lib/modules/manager/bazel-module/parser/fragments.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport {\n LooseArray,\n LooseRecord,\n} from '../../../../util/schema-utils/index.ts';\nimport * as starlark from './starlark.ts';\n\nexport const StringFragment = z.object({\n type: z.literal('string'),\n value: z.string(),\n isComplete: z.literal(true),\n});\nexport const BooleanFragment = z.object({\n type: z.literal('boolean'),\n value: z.boolean(),\n isComplete: z.literal(true),\n});\nconst PrimitiveFragments = z.discriminatedUnion('type', [\n StringFragment,\n BooleanFragment,\n]);\nexport const ArrayFragment = z.object({\n type: z.literal('array'),\n items: LooseArray(PrimitiveFragments),\n isComplete: z.boolean(),\n});\nexport const StringArrayFragment = z.object({\n type: z.literal('array'),\n items: LooseArray(StringFragment),\n isComplete: z.boolean(),\n});\nconst ValueFragments = z.discriminatedUnion('type', [\n StringFragment,\n BooleanFragment,\n ArrayFragment,\n]);\nexport const RuleFragment = z.object({\n type: z.literal('rule'),\n rule: z.string(),\n children: LooseRecord(ValueFragments),\n isComplete: z.boolean(),\n});\nexport const PreparedExtensionTagFragment = z.object({\n type: z.literal('preparedExtensionTag'),\n // See ExtensionTagFragment for documentation of the fields.\n extension: z.string(),\n rawExtension: z.string(),\n offset: z.number(), // start offset in the source string\n isComplete: z.literal(false), // never complete, parser internal type.\n});\nexport const ExtensionTagFragment = z.object({\n type: z.literal('extensionTag'),\n // The \"logical\" name of the extension (e.g. `oci` or `maven`).\n extension: z.string(),\n // The \"raw\" name of the extension as it appears in the MODULE file (e.g. `maven_01` or `maven`)\n rawExtension: z.string(),\n tag: z.string(),\n children: LooseRecord(ValueFragments),\n isComplete: z.boolean(),\n offset: z.number(), // start offset in the source string\n rawString: z.string().optional(), // raw source string\n});\nexport const UseRepoRuleFragment = z.object({\n type: z.literal('useRepoRule'),\n variableName: z.string(),\n bzlFile: z.string(),\n ruleName: z.string(),\n isComplete: z.boolean(),\n});\nexport const RepoRuleCallFragment = z.object({\n type: z.literal('repoRuleCall'),\n functionName: z.string(),\n children: LooseRecord(ValueFragments),\n isComplete: z.boolean(),\n offset: z.number(),\n rawString: z.string().optional(),\n});\nexport const AttributeFragment = z.object({\n type: z.literal('attribute'),\n name: z.string(),\n value: ValueFragments.optional(),\n isComplete: z.boolean(),\n});\nexport const AllFragments = z.discriminatedUnion('type', [\n ArrayFragment,\n AttributeFragment,\n BooleanFragment,\n RuleFragment,\n PreparedExtensionTagFragment,\n ExtensionTagFragment,\n UseRepoRuleFragment,\n RepoRuleCallFragment,\n StringFragment,\n]);\n\nexport type AllFragments = z.infer<typeof AllFragments>;\nexport type ArrayFragment = z.infer<typeof ArrayFragment>;\nexport type AttributeFragment = z.infer<typeof AttributeFragment>;\nexport type BooleanFragment = z.infer<typeof BooleanFragment>;\nexport type ChildFragments = Record<string, ValueFragments>;\nexport type PrimitiveFragments = z.infer<typeof PrimitiveFragments>;\nexport type RuleFragment = z.infer<typeof RuleFragment>;\nexport type PreparedExtensionTagFragment = z.infer<\n typeof PreparedExtensionTagFragment\n>;\nexport type ExtensionTagFragment = z.infer<typeof ExtensionTagFragment>;\nexport type UseRepoRuleFragment = z.infer<typeof UseRepoRuleFragment>;\nexport type RepoRuleCallFragment = z.infer<typeof RepoRuleCallFragment>;\nexport type StringFragment = z.infer<typeof StringFragment>;\nexport type ValueFragments = z.infer<typeof ValueFragments>;\nexport type ResultFragment =\n | RuleFragment\n | ExtensionTagFragment\n | UseRepoRuleFragment\n | RepoRuleCallFragment;\n\nexport function string(value: string): StringFragment {\n return {\n type: 'string',\n isComplete: true,\n value,\n };\n}\n\nexport function boolean(value: string | boolean): BooleanFragment {\n return {\n type: 'boolean',\n isComplete: true,\n value: isString(value) ? starlark.asBoolean(value) : value,\n };\n}\n\nexport function rule(\n rule: string,\n children: ChildFragments = {},\n isComplete = false,\n): RuleFragment {\n return {\n type: 'rule',\n rule,\n isComplete,\n children,\n };\n}\n\nexport function preparedExtensionTag(\n extension: string,\n rawExtension: string,\n offset: number,\n): PreparedExtensionTagFragment {\n return {\n type: 'preparedExtensionTag',\n extension,\n rawExtension,\n offset,\n isComplete: false, // never complete\n };\n}\n\nexport function extensionTag(\n extension: string,\n rawExtension: string,\n tag: string,\n offset: number,\n children: ChildFragments = {},\n rawString?: string,\n isComplete = false,\n): ExtensionTagFragment {\n return {\n type: 'extensionTag',\n extension,\n rawExtension,\n tag,\n offset,\n rawString,\n isComplete,\n children,\n };\n}\n\nexport function useRepoRule(\n variableName: string,\n bzlFile: string,\n ruleName: string,\n isComplete = false,\n): UseRepoRuleFragment {\n return {\n type: 'useRepoRule',\n variableName,\n bzlFile,\n ruleName,\n isComplete,\n };\n}\n\nexport function repoRuleCall(\n functionName: string,\n offset: number,\n children: ChildFragments = {},\n rawString?: string,\n isComplete = false,\n): RepoRuleCallFragment {\n return {\n type: 'repoRuleCall',\n functionName,\n offset,\n rawString,\n isComplete,\n children,\n };\n}\n\nexport function attribute(\n name: string,\n value?: ValueFragments,\n isComplete = false,\n): AttributeFragment {\n return {\n type: 'attribute',\n name,\n value,\n isComplete,\n };\n}\n\nexport function array(\n items: PrimitiveFragments[] = [],\n isComplete = false,\n): ArrayFragment {\n return {\n type: 'array',\n items,\n isComplete,\n };\n}\n\nexport function isValue(data: unknown): data is ValueFragments {\n const result = ValueFragments.safeParse(data);\n return result.success;\n}\n\nexport function isPrimitive(data: unknown): data is PrimitiveFragments {\n const result = PrimitiveFragments.safeParse(data);\n return result.success;\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { getParentDir, getSiblingFileName, readLocalFile } from "../../../util/f
3
3
  import { resolveNpmrc } from "../npm/npmrc.js";
4
4
  import { extractPackageJson } from "../npm/extract/common/package-file.js";
5
5
  import { filesMatchingWorkspaces } from "./utils.js";
6
- import { isArray, isString } from "@sindresorhus/is";
6
+ import { isArray, isObject, isString } from "@sindresorhus/is";
7
7
  //#region lib/modules/manager/bun/extract.ts
8
8
  function matchesFileName(fileNameWithPath, fileName) {
9
9
  return fileNameWithPath === fileName || fileNameWithPath.endsWith(`/${fileName}`);
@@ -49,7 +49,7 @@ async function extractAllPackageFiles(config, matchedFiles) {
49
49
  lockFiles: [lockFile]
50
50
  });
51
51
  let workspaces = res?.managerData?.workspaces;
52
- if (typeof workspaces === "object" && "packages" in workspaces) workspaces = workspaces.packages;
52
+ if (isObject(workspaces) && "packages" in workspaces) workspaces = workspaces.packages;
53
53
  if (!isArray(workspaces, isString)) continue;
54
54
  logger.debug(`Found bun workspaces in ${packageFile}`);
55
55
  const pwd = getParentDir(packageFile);
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/bun/extract.ts"],"sourcesContent":["import { isArray, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport {\n getParentDir,\n getSiblingFileName,\n readLocalFile,\n} from '../../../util/fs/index.ts';\n\nimport { extractPackageJson } from '../npm/extract/common/package-file.ts';\nimport type { NpmPackage } from '../npm/extract/types.ts';\nimport { resolveNpmrc } from '../npm/npmrc.ts';\nimport type { NpmManagerData } from '../npm/types.ts';\nimport type { ExtractConfig, PackageFile } from '../types.ts';\nimport { filesMatchingWorkspaces } from './utils.ts';\n\nfunction matchesFileName(fileNameWithPath: string, fileName: string): boolean {\n return (\n fileNameWithPath === fileName || fileNameWithPath.endsWith(`/${fileName}`)\n );\n}\n\nexport async function processPackageFile(\n packageFile: string,\n config: ExtractConfig,\n): Promise<PackageFile | null> {\n const fileContent = await readLocalFile(packageFile, 'utf8');\n if (!fileContent) {\n logger.warn({ fileName: packageFile }, 'Could not read file content');\n return null;\n }\n let packageJson: NpmPackage;\n try {\n packageJson = JSON.parse(fileContent);\n } catch (err) {\n logger.debug({ err }, 'Error parsing package.json');\n return null;\n }\n const result = extractPackageJson(packageJson, packageFile);\n if (!result) {\n logger.debug({ packageFile }, 'No dependencies found');\n return null;\n }\n\n const { npmrc } = await resolveNpmrc(packageFile, config);\n\n return {\n ...result,\n packageFile,\n npmrc,\n };\n}\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n matchedFiles: string[],\n): Promise<PackageFile[]> {\n const packageFiles: PackageFile<NpmManagerData>[] = [];\n const allLockFiles = matchedFiles.filter(\n (file) =>\n matchesFileName(file, 'bun.lock') || matchesFileName(file, 'bun.lockb'),\n );\n if (allLockFiles.length === 0) {\n logger.debug('No bun lockfiles found');\n return packageFiles;\n }\n const allPackageJson = matchedFiles.filter((file) =>\n matchesFileName(file, 'package.json'),\n );\n for (const lockFile of allLockFiles) {\n const packageFile = getSiblingFileName(lockFile, 'package.json');\n const res = await processPackageFile(packageFile, config);\n if (res) {\n packageFiles.push({ ...res, lockFiles: [lockFile] });\n }\n // Check if package.json contains workspaces\n let workspaces = res?.managerData?.workspaces;\n\n // Check for nested packages property https://bun.com/docs/pm/catalogs#1-define-catalogs-in-root-package-json\n if (typeof workspaces === 'object' && 'packages' in workspaces) {\n workspaces = workspaces.packages;\n }\n\n if (!isArray(workspaces, isString)) {\n continue;\n }\n\n logger.debug(`Found bun workspaces in ${packageFile}`);\n const pwd = getParentDir(packageFile);\n const workspacePackageFiles = filesMatchingWorkspaces(\n pwd,\n allPackageJson,\n workspaces,\n );\n if (workspacePackageFiles.length) {\n logger.debug({ workspacePackageFiles }, 'Found bun workspace files');\n for (const workspaceFile of workspacePackageFiles) {\n const res = await processPackageFile(workspaceFile, config);\n if (res) {\n packageFiles.push({ ...res, lockFiles: [lockFile] });\n }\n }\n }\n }\n\n return packageFiles;\n}\n"],"mappings":";;;;;;;AAeA,SAAS,gBAAgB,kBAA0B,UAA2B;CAC5E,OACE,qBAAqB,YAAY,iBAAiB,SAAS,IAAI,UAAU;AAE7E;AAEA,eAAsB,mBACpB,aACA,QAC6B;CAC7B,MAAM,cAAc,MAAM,cAAc,aAAa,MAAM;CAC3D,IAAI,CAAC,aAAa;EAChB,OAAO,KAAK,EAAE,UAAU,YAAY,GAAG,6BAA6B;EACpE,OAAO;CACT;CACA,IAAI;CACJ,IAAI;EACF,cAAc,KAAK,MAAM,WAAW;CACtC,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,4BAA4B;EAClD,OAAO;CACT;CACA,MAAM,SAAS,mBAAmB,aAAa,WAAW;CAC1D,IAAI,CAAC,QAAQ;EACX,OAAO,MAAM,EAAE,YAAY,GAAG,uBAAuB;EACrD,OAAO;CACT;CAEA,MAAM,EAAE,UAAU,MAAM,aAAa,aAAa,MAAM;CAExD,OAAO;EACL,GAAG;EACH;EACA;CACF;AACF;AACA,eAAsB,uBACpB,QACA,cACwB;CACxB,MAAM,eAA8C,CAAC;CACrD,MAAM,eAAe,aAAa,QAC/B,SACC,gBAAgB,MAAM,UAAU,KAAK,gBAAgB,MAAM,WAAW,CAC1E;CACA,IAAI,aAAa,WAAW,GAAG;EAC7B,OAAO,MAAM,wBAAwB;EACrC,OAAO;CACT;CACA,MAAM,iBAAiB,aAAa,QAAQ,SAC1C,gBAAgB,MAAM,cAAc,CACtC;CACA,KAAK,MAAM,YAAY,cAAc;EACnC,MAAM,cAAc,mBAAmB,UAAU,cAAc;EAC/D,MAAM,MAAM,MAAM,mBAAmB,aAAa,MAAM;EACxD,IAAI,KACF,aAAa,KAAK;GAAE,GAAG;GAAK,WAAW,CAAC,QAAQ;EAAE,CAAC;EAGrD,IAAI,aAAa,KAAK,aAAa;EAGnC,IAAI,OAAO,eAAe,YAAY,cAAc,YAClD,aAAa,WAAW;EAG1B,IAAI,CAAC,QAAQ,YAAY,QAAQ,GAC/B;EAGF,OAAO,MAAM,2BAA2B,aAAa;EACrD,MAAM,MAAM,aAAa,WAAW;EACpC,MAAM,wBAAwB,wBAC5B,KACA,gBACA,UACF;EACA,IAAI,sBAAsB,QAAQ;GAChC,OAAO,MAAM,EAAE,sBAAsB,GAAG,2BAA2B;GACnE,KAAK,MAAM,iBAAiB,uBAAuB;IACjD,MAAM,MAAM,MAAM,mBAAmB,eAAe,MAAM;IAC1D,IAAI,KACF,aAAa,KAAK;KAAE,GAAG;KAAK,WAAW,CAAC,QAAQ;IAAE,CAAC;GAEvD;EACF;CACF;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/bun/extract.ts"],"sourcesContent":["import { isArray, isObject, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport {\n getParentDir,\n getSiblingFileName,\n readLocalFile,\n} from '../../../util/fs/index.ts';\n\nimport { extractPackageJson } from '../npm/extract/common/package-file.ts';\nimport type { NpmPackage } from '../npm/extract/types.ts';\nimport { resolveNpmrc } from '../npm/npmrc.ts';\nimport type { NpmManagerData } from '../npm/types.ts';\nimport type { ExtractConfig, PackageFile } from '../types.ts';\nimport { filesMatchingWorkspaces } from './utils.ts';\n\nfunction matchesFileName(fileNameWithPath: string, fileName: string): boolean {\n return (\n fileNameWithPath === fileName || fileNameWithPath.endsWith(`/${fileName}`)\n );\n}\n\nexport async function processPackageFile(\n packageFile: string,\n config: ExtractConfig,\n): Promise<PackageFile | null> {\n const fileContent = await readLocalFile(packageFile, 'utf8');\n if (!fileContent) {\n logger.warn({ fileName: packageFile }, 'Could not read file content');\n return null;\n }\n let packageJson: NpmPackage;\n try {\n packageJson = JSON.parse(fileContent);\n } catch (err) {\n logger.debug({ err }, 'Error parsing package.json');\n return null;\n }\n const result = extractPackageJson(packageJson, packageFile);\n if (!result) {\n logger.debug({ packageFile }, 'No dependencies found');\n return null;\n }\n\n const { npmrc } = await resolveNpmrc(packageFile, config);\n\n return {\n ...result,\n packageFile,\n npmrc,\n };\n}\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n matchedFiles: string[],\n): Promise<PackageFile[]> {\n const packageFiles: PackageFile<NpmManagerData>[] = [];\n const allLockFiles = matchedFiles.filter(\n (file) =>\n matchesFileName(file, 'bun.lock') || matchesFileName(file, 'bun.lockb'),\n );\n if (allLockFiles.length === 0) {\n logger.debug('No bun lockfiles found');\n return packageFiles;\n }\n const allPackageJson = matchedFiles.filter((file) =>\n matchesFileName(file, 'package.json'),\n );\n for (const lockFile of allLockFiles) {\n const packageFile = getSiblingFileName(lockFile, 'package.json');\n const res = await processPackageFile(packageFile, config);\n if (res) {\n packageFiles.push({ ...res, lockFiles: [lockFile] });\n }\n // Check if package.json contains workspaces\n let workspaces = res?.managerData?.workspaces;\n\n // Check for nested packages property https://bun.com/docs/pm/catalogs#1-define-catalogs-in-root-package-json\n if (isObject(workspaces) && 'packages' in workspaces) {\n workspaces = workspaces.packages;\n }\n\n if (!isArray(workspaces, isString)) {\n continue;\n }\n\n logger.debug(`Found bun workspaces in ${packageFile}`);\n const pwd = getParentDir(packageFile);\n const workspacePackageFiles = filesMatchingWorkspaces(\n pwd,\n allPackageJson,\n workspaces,\n );\n if (workspacePackageFiles.length) {\n logger.debug({ workspacePackageFiles }, 'Found bun workspace files');\n for (const workspaceFile of workspacePackageFiles) {\n const res = await processPackageFile(workspaceFile, config);\n if (res) {\n packageFiles.push({ ...res, lockFiles: [lockFile] });\n }\n }\n }\n }\n\n return packageFiles;\n}\n"],"mappings":";;;;;;;AAeA,SAAS,gBAAgB,kBAA0B,UAA2B;CAC5E,OACE,qBAAqB,YAAY,iBAAiB,SAAS,IAAI,UAAU;AAE7E;AAEA,eAAsB,mBACpB,aACA,QAC6B;CAC7B,MAAM,cAAc,MAAM,cAAc,aAAa,MAAM;CAC3D,IAAI,CAAC,aAAa;EAChB,OAAO,KAAK,EAAE,UAAU,YAAY,GAAG,6BAA6B;EACpE,OAAO;CACT;CACA,IAAI;CACJ,IAAI;EACF,cAAc,KAAK,MAAM,WAAW;CACtC,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,4BAA4B;EAClD,OAAO;CACT;CACA,MAAM,SAAS,mBAAmB,aAAa,WAAW;CAC1D,IAAI,CAAC,QAAQ;EACX,OAAO,MAAM,EAAE,YAAY,GAAG,uBAAuB;EACrD,OAAO;CACT;CAEA,MAAM,EAAE,UAAU,MAAM,aAAa,aAAa,MAAM;CAExD,OAAO;EACL,GAAG;EACH;EACA;CACF;AACF;AACA,eAAsB,uBACpB,QACA,cACwB;CACxB,MAAM,eAA8C,CAAC;CACrD,MAAM,eAAe,aAAa,QAC/B,SACC,gBAAgB,MAAM,UAAU,KAAK,gBAAgB,MAAM,WAAW,CAC1E;CACA,IAAI,aAAa,WAAW,GAAG;EAC7B,OAAO,MAAM,wBAAwB;EACrC,OAAO;CACT;CACA,MAAM,iBAAiB,aAAa,QAAQ,SAC1C,gBAAgB,MAAM,cAAc,CACtC;CACA,KAAK,MAAM,YAAY,cAAc;EACnC,MAAM,cAAc,mBAAmB,UAAU,cAAc;EAC/D,MAAM,MAAM,MAAM,mBAAmB,aAAa,MAAM;EACxD,IAAI,KACF,aAAa,KAAK;GAAE,GAAG;GAAK,WAAW,CAAC,QAAQ;EAAE,CAAC;EAGrD,IAAI,aAAa,KAAK,aAAa;EAGnC,IAAI,SAAS,UAAU,KAAK,cAAc,YACxC,aAAa,WAAW;EAG1B,IAAI,CAAC,QAAQ,YAAY,QAAQ,GAC/B;EAGF,OAAO,MAAM,2BAA2B,aAAa;EACrD,MAAM,MAAM,aAAa,WAAW;EACpC,MAAM,wBAAwB,wBAC5B,KACA,gBACA,UACF;EACA,IAAI,sBAAsB,QAAQ;GAChC,OAAO,MAAM,EAAE,sBAAsB,GAAG,2BAA2B;GACnE,KAAK,MAAM,iBAAiB,uBAAuB;IACjD,MAAM,MAAM,MAAM,mBAAmB,eAAe,MAAM;IAC1D,IAAI,KACF,aAAa,KAAK;KAAE,GAAG;KAAK,WAAW,CAAC,QAAQ;IAAE,CAAC;GAEvD;EACF;CACF;CAEA,OAAO;AACT"}
@@ -5,9 +5,10 @@ import { Result } from "../../../util/result.js";
5
5
  import { OrbDatasource } from "../../datasource/orb/index.js";
6
6
  import { getDep } from "../dockerfile/extract.js";
7
7
  import { CircleCiFile } from "./schema.js";
8
+ import { isString } from "@sindresorhus/is";
8
9
  //#region lib/modules/manager/circleci/extract.ts
9
10
  function extractDefinition(deps, definition, registryAliases) {
10
- for (const [key, orb] of Object.entries(definition.orbs)) if (typeof orb === "string") {
11
+ for (const [key, orb] of Object.entries(definition.orbs)) if (isString(orb)) {
11
12
  const [packageName, currentValue] = orb.split("@");
12
13
  deps.push({
13
14
  depName: key,
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/circleci/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { Result } from '../../../util/result.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { OrbDatasource } from '../../datasource/orb/index.ts';\nimport * as npmVersioning from '../../versioning/npm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { CircleCiFile, type CircleCiOrb } from './schema.ts';\n\nfunction extractDefinition(\n deps: PackageDependency[],\n definition: CircleCiOrb | CircleCiFile,\n registryAliases: Record<string, string>,\n): void {\n for (const [key, orb] of Object.entries(definition.orbs)) {\n if (typeof orb === 'string') {\n const [packageName, currentValue] = orb.split('@');\n\n deps.push({\n depName: key,\n packageName,\n depType: 'orb',\n currentValue,\n versioning: npmVersioning.id,\n datasource: OrbDatasource.id,\n });\n } else {\n extractDefinition(deps, orb, registryAliases);\n }\n }\n\n // extract environments\n const environments = [...definition.executors, ...definition.jobs];\n for (const dockerImage of environments) {\n deps.push({\n ...getDep(dockerImage, true, registryAliases),\n depType: 'docker',\n });\n }\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile?: string,\n config?: ExtractConfig,\n): PackageFileContent | null {\n const { val: parsed, err } = Result.wrap(() =>\n // Parse as YAML 1.1 so anchor merge keys (`<<`) work, matching CircleCI's\n // own behavior. Under YAML 1.2 a mapping with multiple `<<` keys is\n // rejected as a duplicate key, which causes the whole file to be skipped.\n CircleCiFile.parse(parseSingleYaml(content, { version: '1.1' })),\n ).unwrap();\n\n if (err) {\n logger.debug({ err, packageFile }, 'Error extracting circleci images');\n return null;\n }\n\n const registryAliases = config?.registryAliases ?? {};\n const deps: PackageDependency[] = [];\n extractDefinition(deps, parsed, registryAliases);\n\n for (const alias of parsed.aliases) {\n deps.push({\n ...getDep(alias, true, registryAliases),\n depType: 'docker',\n });\n }\n\n if (!deps.length) {\n return null;\n }\n\n return { deps };\n}\n"],"mappings":";;;;;;;;AAaA,SAAS,kBACP,MACA,YACA,iBACM;CACN,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,WAAW,IAAI,GACrD,IAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,CAAC,aAAa,gBAAgB,IAAI,MAAM,GAAG;EAEjD,KAAK,KAAK;GACR,SAAS;GACT;GACA,SAAS;GACT;GACA,YAAY;GACZ,YAAY,cAAc;EAC5B,CAAC;CACH,OACE,kBAAkB,MAAM,KAAK,eAAe;CAKhD,MAAM,eAAe,CAAC,GAAG,WAAW,WAAW,GAAG,WAAW,IAAI;CACjE,KAAK,MAAM,eAAe,cACxB,KAAK,KAAK;EACR,GAAG,OAAO,aAAa,MAAM,eAAe;EAC5C,SAAS;CACX,CAAC;AAEL;AAEA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,MAAM,EAAE,KAAK,QAAQ,QAAQ,OAAO,WAIlC,aAAa,MAAM,gBAAgB,SAAS,EAAE,SAAS,MAAM,CAAC,CAAC,CACjE,CAAC,CAAC,OAAO;CAET,IAAI,KAAK;EACP,OAAO,MAAM;GAAE;GAAK;EAAY,GAAG,kCAAkC;EACrE,OAAO;CACT;CAEA,MAAM,kBAAkB,QAAQ,mBAAmB,CAAC;CACpD,MAAM,OAA4B,CAAC;CACnC,kBAAkB,MAAM,QAAQ,eAAe;CAE/C,KAAK,MAAM,SAAS,OAAO,SACzB,KAAK,KAAK;EACR,GAAG,OAAO,OAAO,MAAM,eAAe;EACtC,SAAS;CACX,CAAC;CAGH,IAAI,CAAC,KAAK,QACR,OAAO;CAGT,OAAO,EAAE,KAAK;AAChB"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/circleci/extract.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { Result } from '../../../util/result.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { OrbDatasource } from '../../datasource/orb/index.ts';\nimport * as npmVersioning from '../../versioning/npm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { CircleCiFile, type CircleCiOrb } from './schema.ts';\n\nfunction extractDefinition(\n deps: PackageDependency[],\n definition: CircleCiOrb | CircleCiFile,\n registryAliases: Record<string, string>,\n): void {\n for (const [key, orb] of Object.entries(definition.orbs)) {\n if (isString(orb)) {\n const [packageName, currentValue] = orb.split('@');\n\n deps.push({\n depName: key,\n packageName,\n depType: 'orb',\n currentValue,\n versioning: npmVersioning.id,\n datasource: OrbDatasource.id,\n });\n } else {\n extractDefinition(deps, orb, registryAliases);\n }\n }\n\n // extract environments\n const environments = [...definition.executors, ...definition.jobs];\n for (const dockerImage of environments) {\n deps.push({\n ...getDep(dockerImage, true, registryAliases),\n depType: 'docker',\n });\n }\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile?: string,\n config?: ExtractConfig,\n): PackageFileContent | null {\n const { val: parsed, err } = Result.wrap(() =>\n // Parse as YAML 1.1 so anchor merge keys (`<<`) work, matching CircleCI's\n // own behavior. Under YAML 1.2 a mapping with multiple `<<` keys is\n // rejected as a duplicate key, which causes the whole file to be skipped.\n CircleCiFile.parse(parseSingleYaml(content, { version: '1.1' })),\n ).unwrap();\n\n if (err) {\n logger.debug({ err, packageFile }, 'Error extracting circleci images');\n return null;\n }\n\n const registryAliases = config?.registryAliases ?? {};\n const deps: PackageDependency[] = [];\n extractDefinition(deps, parsed, registryAliases);\n\n for (const alias of parsed.aliases) {\n deps.push({\n ...getDep(alias, true, registryAliases),\n depType: 'docker',\n });\n }\n\n if (!deps.length) {\n return null;\n }\n\n return { deps };\n}\n"],"mappings":";;;;;;;;;AAcA,SAAS,kBACP,MACA,YACA,iBACM;CACN,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,WAAW,IAAI,GACrD,IAAI,SAAS,GAAG,GAAG;EACjB,MAAM,CAAC,aAAa,gBAAgB,IAAI,MAAM,GAAG;EAEjD,KAAK,KAAK;GACR,SAAS;GACT;GACA,SAAS;GACT;GACA,YAAY;GACZ,YAAY,cAAc;EAC5B,CAAC;CACH,OACE,kBAAkB,MAAM,KAAK,eAAe;CAKhD,MAAM,eAAe,CAAC,GAAG,WAAW,WAAW,GAAG,WAAW,IAAI;CACjE,KAAK,MAAM,eAAe,cACxB,KAAK,KAAK;EACR,GAAG,OAAO,aAAa,MAAM,eAAe;EAC5C,SAAS;CACX,CAAC;AAEL;AAEA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,MAAM,EAAE,KAAK,QAAQ,QAAQ,OAAO,WAIlC,aAAa,MAAM,gBAAgB,SAAS,EAAE,SAAS,MAAM,CAAC,CAAC,CACjE,CAAC,CAAC,OAAO;CAET,IAAI,KAAK;EACP,OAAO,MAAM;GAAE;GAAK;EAAY,GAAG,kCAAkC;EACrE,OAAO;CACT;CAEA,MAAM,kBAAkB,QAAQ,mBAAmB,CAAC;CACpD,MAAM,OAA4B,CAAC;CACnC,kBAAkB,MAAM,QAAQ,eAAe;CAE/C,KAAK,MAAM,SAAS,OAAO,SACzB,KAAK,KAAK;EACR,GAAG,OAAO,OAAO,MAAM,eAAe;EACtC,SAAS;CACX,CAAC;CAGH,IAAI,CAAC,KAAK,QACR,OAAO;CAGT,OAAO,EAAE,KAAK;AAChB"}
@@ -5,7 +5,7 @@ import { api } from "../../versioning/deno/index.js";
5
5
  import { detectNodeCompatWorkspaces, extractDenoCompatiblePackageJson } from "./compat.js";
6
6
  import { denoLandRegex, depValueRegex } from "./utils.js";
7
7
  import { DenoLock } from "./schema.js";
8
- import { isEmptyObject, isNonEmptyArray, isNonEmptyObject } from "@sindresorhus/is";
8
+ import { isEmptyObject, isNonEmptyArray, isNonEmptyObject, isString } from "@sindresorhus/is";
9
9
  import upath from "upath";
10
10
  //#region lib/modules/manager/deno/post.ts
11
11
  async function getDenoLock(filePath) {
@@ -42,7 +42,7 @@ function getLockedVersion(deps, lockFileContent) {
42
42
  if (currentRawValue && lockFileContent.lockedVersions[`${currentRawValue}@*`]) return lockFileContent.lockedVersions[`${currentRawValue}@*`];
43
43
  for (const [key, value] of Object.entries(lockFileContent.lockedVersions)) {
44
44
  const match = depValueRegex.exec(key);
45
- if (typeof depName === "string" && match?.groups?.depName === depName && match?.groups?.datasource === datasource && currentValue && match?.groups?.currentValue && api.intersects(match.groups.currentValue, currentValue)) return value;
45
+ if (isString(depName) && match?.groups?.depName === depName && match?.groups?.datasource === datasource && currentValue && match?.groups?.currentValue && api.intersects(match.groups.currentValue, currentValue)) return value;
46
46
  }
47
47
  return null;
48
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"post.js","names":["semver"],"sources":["../../../../lib/modules/manager/deno/post.ts"],"sourcesContent":["import {\n isEmptyObject,\n isNonEmptyArray,\n isNonEmptyObject,\n} from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { minimatch } from '../../../util/minimatch.ts';\nimport { api as semver } from '../../versioning/deno/index.ts';\nimport type { PackageDependency, PackageFile } from '../types.ts';\nimport {\n detectNodeCompatWorkspaces,\n extractDenoCompatiblePackageJson,\n} from './compat.ts';\nimport { DenoLock } from './schema.ts';\nimport type { DenoManagerData, LockFile, WorkspaceContext } from './types.ts';\nimport { denoLandRegex, depValueRegex } from './utils.ts';\n\nexport async function getDenoLock(filePath: string): Promise<LockFile> {\n const lockfileContent = await readLocalFile(filePath, 'utf8');\n if (!lockfileContent) {\n logger.debug({ filePath }, 'Deno: unable to read lockfile');\n return { lockedVersions: {} };\n }\n const parsedLockfile = DenoLock.safeParse(lockfileContent);\n if (!parsedLockfile.success) {\n logger.debug(\n { filePath, err: parsedLockfile.error },\n 'Deno: unable to parse lockfile',\n );\n return { lockedVersions: {} };\n }\n if (parsedLockfile.data.lockfileVersion < 5) {\n logger.warn(\n { filePath },\n 'Deno: unsupported lockfile version. Please update the lock file on your own.',\n );\n return { lockedVersions: {} };\n }\n\n return parsedLockfile.data;\n}\n\nexport function getLockedVersion(\n deps: PackageDependency<DenoManagerData>,\n lockFileContent: LockFile,\n): string | undefined | null {\n if (isEmptyObject(lockFileContent)) {\n return null;\n }\n const { datasource, currentRawValue, currentValue, depName } = deps;\n\n if (datasource === 'deno') {\n // \"remote\": {\n // \"https://deno.land/std@0.223.0/fs/mod.ts\": \"c25e6802cbf27f3050f60b26b00c2d8dba1cb7fcdafe34c66006a7473b7b34d4\",\n // },\n if (\n lockFileContent.remoteVersions &&\n lockFileContent.remoteVersions.size > 0 &&\n currentRawValue &&\n lockFileContent.remoteVersions.has(currentRawValue)\n ) {\n const match = denoLandRegex.exec(currentRawValue);\n return match?.groups?.currentValue;\n }\n\n // \"redirects\": {\n // \"https://deno.land/std\": \"https://deno.land/std@0.224.0\"\n // },\n const key =\n currentValue && depName ? `${depName}@${currentValue}` : depName;\n if (\n lockFileContent.redirectVersions &&\n isNonEmptyObject(lockFileContent.redirectVersions) &&\n key &&\n lockFileContent.redirectVersions[key]\n ) {\n const match = denoLandRegex.exec(\n // SAFETY: checked above\n lockFileContent.redirectVersions[key],\n );\n return match?.groups?.currentValue;\n }\n }\n\n // jsr and npm datasource\n if (datasource === 'jsr' || datasource === 'npm') {\n if (\n !lockFileContent.lockedVersions ||\n isEmptyObject(lockFileContent.lockedVersions)\n ) {\n return null;\n }\n\n // find \"jsr:@scope/name@1.2.3\" from \"jsr:@scope/name@1.2.3\"\n if (currentRawValue && lockFileContent.lockedVersions[currentRawValue]) {\n return lockFileContent.lockedVersions[currentRawValue];\n }\n\n // find \"jsr:@scope/name@*\" from \"jsr:@scope/name\"\n if (\n currentRawValue &&\n lockFileContent.lockedVersions[`${currentRawValue}@*`]\n ) {\n return lockFileContent.lockedVersions[`${currentRawValue}@*`];\n }\n\n for (const [key, value] of Object.entries(lockFileContent.lockedVersions)) {\n const match = depValueRegex.exec(key);\n // find \"jsr:@scope/name@1\" intersects \"jsr:@scope/name@^1.0.0\"\n if (\n typeof depName === 'string' &&\n match?.groups?.depName === depName &&\n match?.groups?.datasource === datasource &&\n currentValue &&\n match?.groups?.currentValue &&\n // SAFETY: npm semver define it\n semver.intersects!(match.groups.currentValue, currentValue)\n ) {\n return value;\n }\n }\n return null;\n }\n\n return null;\n}\n\nexport async function collectPackageJsonAsWorkspaceMember(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n // detect package.json as members of a deno workspace\n const workspaceRoots = packageFiles.filter(\n (pkg) =>\n isNonEmptyArray(pkg.managerData?.workspaces) &&\n upath.basename(pkg.packageFile).startsWith('deno.json'),\n );\n for (const workspaceRoot of workspaceRoots) {\n const result = await detectNodeCompatWorkspaces(workspaceRoot);\n const { packagePaths } = result;\n for (const packagePath of packagePaths) {\n const packageFile = await extractDenoCompatiblePackageJson(packagePath);\n if (packageFile) {\n const pkg = {\n ...packageFile,\n lockFiles: workspaceRoot.lockFiles,\n };\n packageFiles.push(pkg);\n }\n }\n }\n}\n\nexport function normalizeWorkspace(\n packageFiles: PackageFile<DenoManagerData>[],\n): void {\n // determine workspace root to collect lock files of workspace members\n const workspaceContexts: WorkspaceContext[] = [];\n\n // create reference map for packageFile object\n const packageMap: Record<string, PackageFile<DenoManagerData>> = {};\n for (const pkg of packageFiles) {\n packageMap[pkg.packageFile] = pkg;\n }\n\n for (const pkg of packageFiles) {\n const workspaces = pkg.managerData?.workspaces;\n if (isNonEmptyArray(workspaces)) {\n const rootDir = upath.dirname(pkg.packageFile);\n const matchers = workspaces.map((pattern) =>\n // allow ./sub/* to match sub\n minimatch(upath.normalize(pattern), {\n dot: true,\n partial: true,\n }),\n );\n workspaceContexts.push({\n lockFiles: pkg.lockFiles,\n rootDir,\n packageFile: pkg.packageFile,\n matchers,\n });\n }\n }\n\n // remove nested workspace\n // if the workspace is a subdirectory of another workspace, the nested is invalid\n const validContexts: typeof workspaceContexts = [];\n const invalidPackageFiles = new Set<string>();\n for (const [i, currentContext] of workspaceContexts.entries()) {\n let isNested = false;\n\n for (const [j, otherContext] of workspaceContexts.entries()) {\n if (i === j) {\n continue;\n }\n\n const found = otherContext.matchers.some((matcher) =>\n matcher.match(currentContext.rootDir),\n );\n if (found) {\n isNested = true;\n invalidPackageFiles.add(currentContext.packageFile);\n break;\n }\n }\n\n if (!isNested) {\n validContexts.push(currentContext);\n }\n }\n for (const packageFile of invalidPackageFiles) {\n const pkg = packageMap[packageFile];\n // remove invalid workspace\n delete pkg?.managerData?.workspaces;\n }\n\n // supply lock files to workspace members from their root\n const workspaceRootFiles = new Set<string>();\n for (const pkg of packageFiles) {\n const workspaces = pkg.managerData?.workspaces;\n if (isNonEmptyArray(workspaces)) {\n workspaceRootFiles.add(pkg.packageFile);\n }\n }\n\n for (const pkg of packageFiles) {\n if (workspaceRootFiles.has(pkg.packageFile)) {\n continue;\n }\n\n for (const context of workspaceContexts) {\n const { rootDir, matchers, lockFiles } = context;\n const pkgRelativePath = upath.relative(rootDir, pkg.packageFile);\n const pkgDir = upath.dirname(pkgRelativePath);\n const isMatch = matchers.some((matcher) => matcher.match(pkgDir));\n if (isMatch) {\n pkg.lockFiles = lockFiles;\n break;\n }\n }\n }\n}\n\nasync function applyLockedVersion(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n // apply locked versions from lock files\n // use cache to avoid reading the same lock file multiple times\n const lockFileCache: Record<string, LockFile> = {};\n for (const pkg of packageFiles) {\n if (!isNonEmptyArray(pkg.lockFiles)) {\n continue;\n }\n const lockFile = pkg.lockFiles[0];\n let lockFileContent = lockFileCache[lockFile];\n\n if (!lockFileContent) {\n lockFileContent = await getDenoLock(lockFile);\n lockFileCache[lockFile] = lockFileContent;\n }\n\n const withLockedVersionDeps = pkg.deps.map((dep) => {\n const lockedVersion = getLockedVersion(dep, lockFileContent);\n return lockedVersion\n ? {\n ...dep,\n lockedVersion,\n }\n : dep;\n });\n\n pkg.deps = withLockedVersionDeps;\n }\n}\n\nexport async function postExtract(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n await collectPackageJsonAsWorkspaceMember(packageFiles);\n normalizeWorkspace(packageFiles);\n await applyLockedVersion(packageFiles);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"post.js","names":["semver"],"sources":["../../../../lib/modules/manager/deno/post.ts"],"sourcesContent":["import {\n isEmptyObject,\n isNonEmptyArray,\n isNonEmptyObject,\n isString,\n} from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { minimatch } from '../../../util/minimatch.ts';\nimport { api as semver } from '../../versioning/deno/index.ts';\nimport type { PackageDependency, PackageFile } from '../types.ts';\nimport {\n detectNodeCompatWorkspaces,\n extractDenoCompatiblePackageJson,\n} from './compat.ts';\nimport { DenoLock } from './schema.ts';\nimport type { DenoManagerData, LockFile, WorkspaceContext } from './types.ts';\nimport { denoLandRegex, depValueRegex } from './utils.ts';\n\nexport async function getDenoLock(filePath: string): Promise<LockFile> {\n const lockfileContent = await readLocalFile(filePath, 'utf8');\n if (!lockfileContent) {\n logger.debug({ filePath }, 'Deno: unable to read lockfile');\n return { lockedVersions: {} };\n }\n const parsedLockfile = DenoLock.safeParse(lockfileContent);\n if (!parsedLockfile.success) {\n logger.debug(\n { filePath, err: parsedLockfile.error },\n 'Deno: unable to parse lockfile',\n );\n return { lockedVersions: {} };\n }\n if (parsedLockfile.data.lockfileVersion < 5) {\n logger.warn(\n { filePath },\n 'Deno: unsupported lockfile version. Please update the lock file on your own.',\n );\n return { lockedVersions: {} };\n }\n\n return parsedLockfile.data;\n}\n\nexport function getLockedVersion(\n deps: PackageDependency<DenoManagerData>,\n lockFileContent: LockFile,\n): string | undefined | null {\n if (isEmptyObject(lockFileContent)) {\n return null;\n }\n const { datasource, currentRawValue, currentValue, depName } = deps;\n\n if (datasource === 'deno') {\n // \"remote\": {\n // \"https://deno.land/std@0.223.0/fs/mod.ts\": \"c25e6802cbf27f3050f60b26b00c2d8dba1cb7fcdafe34c66006a7473b7b34d4\",\n // },\n if (\n lockFileContent.remoteVersions &&\n lockFileContent.remoteVersions.size > 0 &&\n currentRawValue &&\n lockFileContent.remoteVersions.has(currentRawValue)\n ) {\n const match = denoLandRegex.exec(currentRawValue);\n return match?.groups?.currentValue;\n }\n\n // \"redirects\": {\n // \"https://deno.land/std\": \"https://deno.land/std@0.224.0\"\n // },\n const key =\n currentValue && depName ? `${depName}@${currentValue}` : depName;\n if (\n lockFileContent.redirectVersions &&\n isNonEmptyObject(lockFileContent.redirectVersions) &&\n key &&\n lockFileContent.redirectVersions[key]\n ) {\n const match = denoLandRegex.exec(\n // SAFETY: checked above\n lockFileContent.redirectVersions[key],\n );\n return match?.groups?.currentValue;\n }\n }\n\n // jsr and npm datasource\n if (datasource === 'jsr' || datasource === 'npm') {\n if (\n !lockFileContent.lockedVersions ||\n isEmptyObject(lockFileContent.lockedVersions)\n ) {\n return null;\n }\n\n // find \"jsr:@scope/name@1.2.3\" from \"jsr:@scope/name@1.2.3\"\n if (currentRawValue && lockFileContent.lockedVersions[currentRawValue]) {\n return lockFileContent.lockedVersions[currentRawValue];\n }\n\n // find \"jsr:@scope/name@*\" from \"jsr:@scope/name\"\n if (\n currentRawValue &&\n lockFileContent.lockedVersions[`${currentRawValue}@*`]\n ) {\n return lockFileContent.lockedVersions[`${currentRawValue}@*`];\n }\n\n for (const [key, value] of Object.entries(lockFileContent.lockedVersions)) {\n const match = depValueRegex.exec(key);\n // find \"jsr:@scope/name@1\" intersects \"jsr:@scope/name@^1.0.0\"\n if (\n isString(depName) &&\n match?.groups?.depName === depName &&\n match?.groups?.datasource === datasource &&\n currentValue &&\n match?.groups?.currentValue &&\n // SAFETY: npm semver define it\n semver.intersects!(match.groups.currentValue, currentValue)\n ) {\n return value;\n }\n }\n return null;\n }\n\n return null;\n}\n\nexport async function collectPackageJsonAsWorkspaceMember(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n // detect package.json as members of a deno workspace\n const workspaceRoots = packageFiles.filter(\n (pkg) =>\n isNonEmptyArray(pkg.managerData?.workspaces) &&\n upath.basename(pkg.packageFile).startsWith('deno.json'),\n );\n for (const workspaceRoot of workspaceRoots) {\n const result = await detectNodeCompatWorkspaces(workspaceRoot);\n const { packagePaths } = result;\n for (const packagePath of packagePaths) {\n const packageFile = await extractDenoCompatiblePackageJson(packagePath);\n if (packageFile) {\n const pkg = {\n ...packageFile,\n lockFiles: workspaceRoot.lockFiles,\n };\n packageFiles.push(pkg);\n }\n }\n }\n}\n\nexport function normalizeWorkspace(\n packageFiles: PackageFile<DenoManagerData>[],\n): void {\n // determine workspace root to collect lock files of workspace members\n const workspaceContexts: WorkspaceContext[] = [];\n\n // create reference map for packageFile object\n const packageMap: Record<string, PackageFile<DenoManagerData>> = {};\n for (const pkg of packageFiles) {\n packageMap[pkg.packageFile] = pkg;\n }\n\n for (const pkg of packageFiles) {\n const workspaces = pkg.managerData?.workspaces;\n if (isNonEmptyArray(workspaces)) {\n const rootDir = upath.dirname(pkg.packageFile);\n const matchers = workspaces.map((pattern) =>\n // allow ./sub/* to match sub\n minimatch(upath.normalize(pattern), {\n dot: true,\n partial: true,\n }),\n );\n workspaceContexts.push({\n lockFiles: pkg.lockFiles,\n rootDir,\n packageFile: pkg.packageFile,\n matchers,\n });\n }\n }\n\n // remove nested workspace\n // if the workspace is a subdirectory of another workspace, the nested is invalid\n const validContexts: typeof workspaceContexts = [];\n const invalidPackageFiles = new Set<string>();\n for (const [i, currentContext] of workspaceContexts.entries()) {\n let isNested = false;\n\n for (const [j, otherContext] of workspaceContexts.entries()) {\n if (i === j) {\n continue;\n }\n\n const found = otherContext.matchers.some((matcher) =>\n matcher.match(currentContext.rootDir),\n );\n if (found) {\n isNested = true;\n invalidPackageFiles.add(currentContext.packageFile);\n break;\n }\n }\n\n if (!isNested) {\n validContexts.push(currentContext);\n }\n }\n for (const packageFile of invalidPackageFiles) {\n const pkg = packageMap[packageFile];\n // remove invalid workspace\n delete pkg?.managerData?.workspaces;\n }\n\n // supply lock files to workspace members from their root\n const workspaceRootFiles = new Set<string>();\n for (const pkg of packageFiles) {\n const workspaces = pkg.managerData?.workspaces;\n if (isNonEmptyArray(workspaces)) {\n workspaceRootFiles.add(pkg.packageFile);\n }\n }\n\n for (const pkg of packageFiles) {\n if (workspaceRootFiles.has(pkg.packageFile)) {\n continue;\n }\n\n for (const context of workspaceContexts) {\n const { rootDir, matchers, lockFiles } = context;\n const pkgRelativePath = upath.relative(rootDir, pkg.packageFile);\n const pkgDir = upath.dirname(pkgRelativePath);\n const isMatch = matchers.some((matcher) => matcher.match(pkgDir));\n if (isMatch) {\n pkg.lockFiles = lockFiles;\n break;\n }\n }\n }\n}\n\nasync function applyLockedVersion(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n // apply locked versions from lock files\n // use cache to avoid reading the same lock file multiple times\n const lockFileCache: Record<string, LockFile> = {};\n for (const pkg of packageFiles) {\n if (!isNonEmptyArray(pkg.lockFiles)) {\n continue;\n }\n const lockFile = pkg.lockFiles[0];\n let lockFileContent = lockFileCache[lockFile];\n\n if (!lockFileContent) {\n lockFileContent = await getDenoLock(lockFile);\n lockFileCache[lockFile] = lockFileContent;\n }\n\n const withLockedVersionDeps = pkg.deps.map((dep) => {\n const lockedVersion = getLockedVersion(dep, lockFileContent);\n return lockedVersion\n ? {\n ...dep,\n lockedVersion,\n }\n : dep;\n });\n\n pkg.deps = withLockedVersionDeps;\n }\n}\n\nexport async function postExtract(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n await collectPackageJsonAsWorkspaceMember(packageFiles);\n normalizeWorkspace(packageFiles);\n await applyLockedVersion(packageFiles);\n}\n"],"mappings":"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"}
@@ -93,7 +93,7 @@ hashMap.set("pub", "a2ded51959d48e053b811b3b9330b2460fc61d0fc2e74a400a546e4f82d2
93
93
  hashMap.set("puppet", "ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45");
94
94
  hashMap.set("pyenv", "9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182");
95
95
  hashMap.set("quadlet", "e1fc88a4e14cd595e89bb3d79b4adf2add3ce5eb80f75276e712c32598cca53d");
96
- hashMap.set("renovate-config", "2a4e4fb671aed5d0c900b8d54c31bfef46ca36d0f4e16b00ff73377b9c09fb69");
96
+ hashMap.set("renovate-config", "ca60beee2e3b871ea1216fa9df9a501f7ed355fe7da29e12509e56a124a78e69");
97
97
  hashMap.set("ruby-version", "2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97");
98
98
  hashMap.set("runtime-version", "b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160");
99
99
  hashMap.set("rust-toolchain", "6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720");