renovate 44.221.4 → 44.221.5
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.
- package/dist/modules/datasource/github-release-attachments/index.js +3 -2
- package/dist/modules/datasource/github-release-attachments/index.js.map +1 -1
- package/dist/modules/datasource/hexpm-bob/index.js +2 -1
- package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
- package/dist/modules/datasource/packagist/schema.js +2 -2
- package/dist/modules/datasource/packagist/schema.js.map +1 -1
- package/dist/modules/datasource/terraform-module/schema.js +2 -2
- package/dist/modules/datasource/terraform-module/schema.js.map +1 -1
- package/dist/modules/datasource/terraform-provider/schema.js +2 -2
- package/dist/modules/datasource/terraform-provider/schema.js.map +1 -1
- package/dist/modules/manager/bazel/artifacts.js +3 -2
- package/dist/modules/manager/bazel/artifacts.js.map +1 -1
- package/dist/modules/manager/composer/schema.js +2 -1
- package/dist/modules/manager/composer/schema.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts.js +2 -1
- package/dist/modules/manager/gomod/artifacts.js.map +1 -1
- package/dist/modules/manager/mise/backends.js +2 -1
- package/dist/modules/manager/mise/backends.js.map +1 -1
- package/dist/modules/manager/npm/post-update/node-version.js +3 -2
- package/dist/modules/manager/npm/post-update/node-version.js.map +1 -1
- package/dist/modules/manager/swift/artifacts.js +3 -2
- package/dist/modules/manager/swift/artifacts.js.map +1 -1
- package/dist/modules/versioning/bazel-module/index.js +2 -2
- package/dist/modules/versioning/bazel-module/index.js.map +1 -1
- package/dist/modules/versioning/docker/index.js +2 -2
- package/dist/modules/versioning/docker/index.js.map +1 -1
- package/dist/modules/versioning/generic.js +2 -2
- package/dist/modules/versioning/generic.js.map +1 -1
- package/dist/modules/versioning/github-actions/index.js +2 -1
- package/dist/modules/versioning/github-actions/index.js.map +1 -1
- package/dist/modules/versioning/gradle/index.js +5 -5
- package/dist/modules/versioning/gradle/index.js.map +1 -1
- package/dist/modules/versioning/npm/range.js +2 -1
- package/dist/modules/versioning/npm/range.js.map +1 -1
- package/dist/modules/versioning/ruby/index.js +2 -1
- package/dist/modules/versioning/ruby/index.js.map +1 -1
- package/dist/modules/versioning/semver/index.js +2 -2
- package/dist/modules/versioning/semver/index.js.map +1 -1
- package/dist/modules/versioning/semver-coerced/index.js +2 -2
- package/dist/modules/versioning/semver-coerced/index.js.map +1 -1
- package/dist/modules/versioning/semver-extended/index.js +2 -3
- package/dist/modules/versioning/semver-extended/index.js.map +1 -1
- package/dist/modules/versioning/semver-partial/index.js +2 -1
- package/dist/modules/versioning/semver-partial/index.js.map +1 -1
- package/dist/modules/versioning/swift/index.js +3 -3
- package/dist/modules/versioning/swift/index.js.map +1 -1
- package/dist/util/string.js +9 -1
- package/dist/util/string.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { newlineRegex, regEx } from "../../../util/regex.js";
|
|
2
|
+
import { stripVersionPrefix } from "../../../util/string.js";
|
|
2
3
|
import { logger } from "../../../logger/index.js";
|
|
3
4
|
import { buildCacheKey } from "../../../util/cache/package/key.js";
|
|
4
5
|
import { hashStream } from "../../../util/hash.js";
|
|
@@ -77,8 +78,8 @@ var GithubReleaseAttachmentsDatasource = class GithubReleaseAttachmentsDatasourc
|
|
|
77
78
|
}
|
|
78
79
|
/** Given a digest asset, find the equivalent digest in a different release. */
|
|
79
80
|
async mapDigestAssetToRelease(digestAsset, release) {
|
|
80
|
-
const current = digestAsset.currentVersion
|
|
81
|
-
const next = release.tag_name
|
|
81
|
+
const current = stripVersionPrefix(digestAsset.currentVersion);
|
|
82
|
+
const next = stripVersionPrefix(release.tag_name);
|
|
82
83
|
if (digestAsset.digestedFileName) {
|
|
83
84
|
const checksumAssetName = digestAsset.assetName.replace(current, next);
|
|
84
85
|
const checksumAsset = release.assets.find((a) => a.name === checksumAssetName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/github-release-attachments/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport type {\n GithubDigestFile,\n GithubRestAsset,\n GithubRestRelease,\n} from '../../../util/github/types.ts';\nimport { getApiBaseUrl } from '../../../util/github/url.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { GithubReleasesDatasource } from '../github-releases/index.ts';\nimport type { DigestConfig } from '../types.ts';\n\nfunction inferHashAlg(digest: string): string {\n switch (digest.length) {\n case 64:\n return 'sha256';\n default:\n case 96:\n return 'sha512';\n }\n}\n\nexport class GithubReleaseAttachmentsDatasource extends GithubReleasesDatasource {\n static override readonly id = 'github-release-attachments';\n\n constructor() {\n super(GithubReleaseAttachmentsDatasource.id);\n }\n\n private async _findDigestFile(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const smallAssets = release.assets.filter(\n (a: GithubRestAsset) => a.size < 5 * 1024,\n );\n for (const asset of smallAssets) {\n const res = await this.http.getText(asset.browser_download_url);\n for (const line of res.body.split(newlineRegex)) {\n const [lineDigest, lineFilename] = line.split(regEx(/\\s+/), 2);\n if (lineDigest === digest) {\n return {\n assetName: asset.name,\n digestedFileName: lineFilename,\n currentVersion: release.tag_name,\n currentDigest: lineDigest,\n };\n }\n }\n }\n return null;\n }\n\n findDigestFile(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n return withCache(\n {\n ttlMinutes: 1440,\n namespace: `datasource-${GithubReleaseAttachmentsDatasource.id}`,\n key: buildCacheKey('findDigestFile', release.html_url, digest),\n },\n () => this._findDigestFile(release, digest),\n );\n }\n\n private async _downloadAndDigest(\n asset: GithubRestAsset,\n algorithm: string,\n ): Promise<string> {\n const res = this.http.stream(asset.browser_download_url);\n const digest = await hashStream(res, algorithm);\n return digest;\n }\n\n downloadAndDigest(\n asset: GithubRestAsset,\n algorithm: string,\n ): Promise<string> {\n return withCache(\n {\n ttlMinutes: 1440,\n namespace: `datasource-${GithubReleaseAttachmentsDatasource.id}`,\n key: buildCacheKey(\n 'downloadAndDigest',\n asset.browser_download_url,\n algorithm,\n ),\n },\n () => this._downloadAndDigest(asset, algorithm),\n );\n }\n\n async findAssetWithDigest(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const algorithm = inferHashAlg(digest);\n const assetsBySize = release.assets.sort(\n (a: GithubRestAsset, b: GithubRestAsset) => {\n if (a.size < b.size) {\n return -1;\n }\n if (a.size > b.size) {\n return 1;\n }\n return 0;\n },\n );\n\n for (const asset of assetsBySize) {\n const assetDigest = await this.downloadAndDigest(asset, algorithm);\n if (assetDigest === digest) {\n return {\n assetName: asset.name,\n currentVersion: release.tag_name,\n currentDigest: assetDigest,\n };\n }\n }\n return null;\n }\n\n /** Identify the asset associated with a known digest. */\n async findDigestAsset(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const digestFile = await this.findDigestFile(release, digest);\n if (digestFile) {\n return digestFile;\n }\n\n const asset = await this.findAssetWithDigest(release, digest);\n return asset;\n }\n\n /** Given a digest asset, find the equivalent digest in a different release. */\n async mapDigestAssetToRelease(\n digestAsset: GithubDigestFile,\n release: GithubRestRelease,\n ): Promise<string | null> {\n const current = digestAsset.currentVersion.replace(regEx(/^v/), '');\n const next = release.tag_name.replace(regEx(/^v/), '');\n\n if (digestAsset.digestedFileName) {\n const checksumAssetName = digestAsset.assetName.replace(current, next);\n const checksumAsset = release.assets.find(\n (a: GithubRestAsset) => a.name === checksumAssetName,\n );\n\n // If the checksum asset is not found in the new release, fall back to the download method\n if (checksumAsset) {\n const releaseFilename = digestAsset.digestedFileName.replace(\n current,\n next,\n );\n const res = await this.http.getText(checksumAsset.browser_download_url);\n for (const line of res.body.split(newlineRegex)) {\n const [lineDigest, lineFn] = line.split(regEx(/\\s+/), 2);\n if (lineFn === releaseFilename) {\n return lineDigest;\n }\n }\n return null;\n }\n }\n\n const oldFileName = digestAsset.digestedFileName ?? digestAsset.assetName;\n const fileName = oldFileName.replace(current, next);\n\n const asset = release.assets.find(\n (a: GithubRestAsset) => a.name === fileName,\n );\n\n if (!asset) {\n return null;\n }\n\n const algorithm = inferHashAlg(digestAsset.currentDigest);\n const newDigest = await this.downloadAndDigest(asset, algorithm);\n return newDigest;\n }\n\n /**\n * Attempts to resolve the digest for the specified package.\n *\n * The `newValue` supplied here should be a valid tag for the GitHub release.\n * Requires `currentValue` and `currentDigest`.\n *\n * There may be many assets attached to the release. This function will:\n * - Identify the asset pinned by `currentDigest` in the `currentValue` release\n * - Download small release assets, parse as checksum manifests (e.g. `SHASUMS.txt`).\n * - Download individual assets until `currentDigest` is encountered. This is limited to sha256 and sha512.\n * - Map the hashed asset to `newValue` and return the updated digest as a string\n */\n override async getDigest(\n {\n packageName: repo,\n currentValue,\n currentDigest,\n registryUrl,\n }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n logger.debug(\n { repo, currentValue, currentDigest, registryUrl, newValue },\n 'getDigest',\n );\n if (!currentDigest) {\n return null;\n }\n if (!currentValue) {\n return currentDigest;\n }\n if (!newValue) {\n return null;\n }\n\n const apiBaseUrl = getApiBaseUrl(registryUrl);\n const { body: currentRelease } =\n await this.http.getJsonUnchecked<GithubRestRelease>(\n `${apiBaseUrl}repos/${repo}/releases/tags/${currentValue}`,\n );\n const digestAsset = await this.findDigestAsset(\n currentRelease,\n currentDigest,\n );\n let newDigest: string | null;\n if (!digestAsset || newValue === currentValue) {\n newDigest = currentDigest;\n } else {\n const { body: newRelease } =\n await this.http.getJsonUnchecked<GithubRestRelease>(\n `${apiBaseUrl}repos/${repo}/releases/tags/${newValue}`,\n );\n newDigest = await this.mapDigestAssetToRelease(digestAsset, newRelease);\n }\n return newDigest;\n }\n}\n"],"mappings":";;;;;;;;AAcA,SAAS,aAAa,QAAwB;CAC5C,QAAQ,OAAO,QAAf;EACE,KAAK,IACH,OAAO;EACT;EACA,KAAK,IACH,OAAO;CACX;AACF;AAEA,IAAa,qCAAb,MAAa,2CAA2C,yBAAyB;CAC/E,OAAyB,KAAK;CAE9B,cAAc;EACZ,MAAM,mCAAmC,EAAE;CAC7C;CAEA,MAAc,gBACZ,SACA,QACkC;EAClC,MAAM,cAAc,QAAQ,OAAO,QAChC,MAAuB,EAAE,OAAO,IACnC;EACA,KAAK,MAAM,SAAS,aAAa;GAC/B,MAAM,MAAM,MAAM,KAAK,KAAK,QAAQ,MAAM,oBAAoB;GAC9D,KAAK,MAAM,QAAQ,IAAI,KAAK,MAAM,YAAY,GAAG;IAC/C,MAAM,CAAC,YAAY,gBAAgB,KAAK,MAAM,MAAM,KAAK,GAAG,CAAC;IAC7D,IAAI,eAAe,QACjB,OAAO;KACL,WAAW,MAAM;KACjB,kBAAkB;KAClB,gBAAgB,QAAQ;KACxB,eAAe;IACjB;GAEJ;EACF;EACA,OAAO;CACT;CAEA,eACE,SACA,QACkC;EAClC,OAAO,UACL;GACE,YAAY;GACZ,WAAW,cAAc,mCAAmC;GAC5D,KAAK,cAAc,kBAAkB,QAAQ,UAAU,MAAM;EAC/D,SACM,KAAK,gBAAgB,SAAS,MAAM,CAC5C;CACF;CAEA,MAAc,mBACZ,OACA,WACiB;EACjB,MAAM,MAAM,KAAK,KAAK,OAAO,MAAM,oBAAoB;EAEvD,OAAO,MADc,WAAW,KAAK,SAAS;CAEhD;CAEA,kBACE,OACA,WACiB;EACjB,OAAO,UACL;GACE,YAAY;GACZ,WAAW,cAAc,mCAAmC;GAC5D,KAAK,cACH,qBACA,MAAM,sBACN,SACF;EACF,SACM,KAAK,mBAAmB,OAAO,SAAS,CAChD;CACF;CAEA,MAAM,oBACJ,SACA,QACkC;EAClC,MAAM,YAAY,aAAa,MAAM;EACrC,MAAM,eAAe,QAAQ,OAAO,MACjC,GAAoB,MAAuB;GAC1C,IAAI,EAAE,OAAO,EAAE,MACb,OAAO;GAET,IAAI,EAAE,OAAO,EAAE,MACb,OAAO;GAET,OAAO;EACT,CACF;EAEA,KAAK,MAAM,SAAS,cAAc;GAChC,MAAM,cAAc,MAAM,KAAK,kBAAkB,OAAO,SAAS;GACjE,IAAI,gBAAgB,QAClB,OAAO;IACL,WAAW,MAAM;IACjB,gBAAgB,QAAQ;IACxB,eAAe;GACjB;EAEJ;EACA,OAAO;CACT;;CAGA,MAAM,gBACJ,SACA,QACkC;EAClC,MAAM,aAAa,MAAM,KAAK,eAAe,SAAS,MAAM;EAC5D,IAAI,YACF,OAAO;EAIT,OAAO,MADa,KAAK,oBAAoB,SAAS,MAAM;CAE9D;;CAGA,MAAM,wBACJ,aACA,SACwB;EACxB,MAAM,UAAU,YAAY,eAAe,QAAQ,MAAM,IAAI,GAAG,EAAE;EAClE,MAAM,OAAO,QAAQ,SAAS,QAAQ,MAAM,IAAI,GAAG,EAAE;EAErD,IAAI,YAAY,kBAAkB;GAChC,MAAM,oBAAoB,YAAY,UAAU,QAAQ,SAAS,IAAI;GACrE,MAAM,gBAAgB,QAAQ,OAAO,MAClC,MAAuB,EAAE,SAAS,iBACrC;GAGA,IAAI,eAAe;IACjB,MAAM,kBAAkB,YAAY,iBAAiB,QACnD,SACA,IACF;IACA,MAAM,MAAM,MAAM,KAAK,KAAK,QAAQ,cAAc,oBAAoB;IACtE,KAAK,MAAM,QAAQ,IAAI,KAAK,MAAM,YAAY,GAAG;KAC/C,MAAM,CAAC,YAAY,UAAU,KAAK,MAAM,MAAM,KAAK,GAAG,CAAC;KACvD,IAAI,WAAW,iBACb,OAAO;IAEX;IACA,OAAO;GACT;EACF;EAGA,MAAM,YADc,YAAY,oBAAoB,YAAY,UAAA,CACnC,QAAQ,SAAS,IAAI;EAElD,MAAM,QAAQ,QAAQ,OAAO,MAC1B,MAAuB,EAAE,SAAS,QACrC;EAEA,IAAI,CAAC,OACH,OAAO;EAGT,MAAM,YAAY,aAAa,YAAY,aAAa;EAExD,OAAO,MADiB,KAAK,kBAAkB,OAAO,SAAS;CAEjE;;;;;;;;;;;;;CAcA,MAAe,UACb,EACE,aAAa,MACb,cACA,eACA,eAEF,UACwB;EACxB,OAAO,MACL;GAAE;GAAM;GAAc;GAAe;GAAa;EAAS,GAC3D,WACF;EACA,IAAI,CAAC,eACH,OAAO;EAET,IAAI,CAAC,cACH,OAAO;EAET,IAAI,CAAC,UACH,OAAO;EAGT,MAAM,aAAa,cAAc,WAAW;EAC5C,MAAM,EAAE,MAAM,mBACZ,MAAM,KAAK,KAAK,iBACd,GAAG,WAAW,QAAQ,KAAK,iBAAiB,cAC9C;EACF,MAAM,cAAc,MAAM,KAAK,gBAC7B,gBACA,aACF;EACA,IAAI;EACJ,IAAI,CAAC,eAAe,aAAa,cAC/B,YAAY;OACP;GACL,MAAM,EAAE,MAAM,eACZ,MAAM,KAAK,KAAK,iBACd,GAAG,WAAW,QAAQ,KAAK,iBAAiB,UAC9C;GACF,YAAY,MAAM,KAAK,wBAAwB,aAAa,UAAU;EACxE;EACA,OAAO;CACT;AACF"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/github-release-attachments/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport type {\n GithubDigestFile,\n GithubRestAsset,\n GithubRestRelease,\n} from '../../../util/github/types.ts';\nimport { getApiBaseUrl } from '../../../util/github/url.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { stripVersionPrefix } from '../../../util/string.ts';\nimport { GithubReleasesDatasource } from '../github-releases/index.ts';\nimport type { DigestConfig } from '../types.ts';\n\nfunction inferHashAlg(digest: string): string {\n switch (digest.length) {\n case 64:\n return 'sha256';\n default:\n case 96:\n return 'sha512';\n }\n}\n\nexport class GithubReleaseAttachmentsDatasource extends GithubReleasesDatasource {\n static override readonly id = 'github-release-attachments';\n\n constructor() {\n super(GithubReleaseAttachmentsDatasource.id);\n }\n\n private async _findDigestFile(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const smallAssets = release.assets.filter(\n (a: GithubRestAsset) => a.size < 5 * 1024,\n );\n for (const asset of smallAssets) {\n const res = await this.http.getText(asset.browser_download_url);\n for (const line of res.body.split(newlineRegex)) {\n const [lineDigest, lineFilename] = line.split(regEx(/\\s+/), 2);\n if (lineDigest === digest) {\n return {\n assetName: asset.name,\n digestedFileName: lineFilename,\n currentVersion: release.tag_name,\n currentDigest: lineDigest,\n };\n }\n }\n }\n return null;\n }\n\n findDigestFile(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n return withCache(\n {\n ttlMinutes: 1440,\n namespace: `datasource-${GithubReleaseAttachmentsDatasource.id}`,\n key: buildCacheKey('findDigestFile', release.html_url, digest),\n },\n () => this._findDigestFile(release, digest),\n );\n }\n\n private async _downloadAndDigest(\n asset: GithubRestAsset,\n algorithm: string,\n ): Promise<string> {\n const res = this.http.stream(asset.browser_download_url);\n const digest = await hashStream(res, algorithm);\n return digest;\n }\n\n downloadAndDigest(\n asset: GithubRestAsset,\n algorithm: string,\n ): Promise<string> {\n return withCache(\n {\n ttlMinutes: 1440,\n namespace: `datasource-${GithubReleaseAttachmentsDatasource.id}`,\n key: buildCacheKey(\n 'downloadAndDigest',\n asset.browser_download_url,\n algorithm,\n ),\n },\n () => this._downloadAndDigest(asset, algorithm),\n );\n }\n\n async findAssetWithDigest(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const algorithm = inferHashAlg(digest);\n const assetsBySize = release.assets.sort(\n (a: GithubRestAsset, b: GithubRestAsset) => {\n if (a.size < b.size) {\n return -1;\n }\n if (a.size > b.size) {\n return 1;\n }\n return 0;\n },\n );\n\n for (const asset of assetsBySize) {\n const assetDigest = await this.downloadAndDigest(asset, algorithm);\n if (assetDigest === digest) {\n return {\n assetName: asset.name,\n currentVersion: release.tag_name,\n currentDigest: assetDigest,\n };\n }\n }\n return null;\n }\n\n /** Identify the asset associated with a known digest. */\n async findDigestAsset(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const digestFile = await this.findDigestFile(release, digest);\n if (digestFile) {\n return digestFile;\n }\n\n const asset = await this.findAssetWithDigest(release, digest);\n return asset;\n }\n\n /** Given a digest asset, find the equivalent digest in a different release. */\n async mapDigestAssetToRelease(\n digestAsset: GithubDigestFile,\n release: GithubRestRelease,\n ): Promise<string | null> {\n const current = stripVersionPrefix(digestAsset.currentVersion);\n const next = stripVersionPrefix(release.tag_name);\n\n if (digestAsset.digestedFileName) {\n const checksumAssetName = digestAsset.assetName.replace(current, next);\n const checksumAsset = release.assets.find(\n (a: GithubRestAsset) => a.name === checksumAssetName,\n );\n\n // If the checksum asset is not found in the new release, fall back to the download method\n if (checksumAsset) {\n const releaseFilename = digestAsset.digestedFileName.replace(\n current,\n next,\n );\n const res = await this.http.getText(checksumAsset.browser_download_url);\n for (const line of res.body.split(newlineRegex)) {\n const [lineDigest, lineFn] = line.split(regEx(/\\s+/), 2);\n if (lineFn === releaseFilename) {\n return lineDigest;\n }\n }\n return null;\n }\n }\n\n const oldFileName = digestAsset.digestedFileName ?? digestAsset.assetName;\n const fileName = oldFileName.replace(current, next);\n\n const asset = release.assets.find(\n (a: GithubRestAsset) => a.name === fileName,\n );\n\n if (!asset) {\n return null;\n }\n\n const algorithm = inferHashAlg(digestAsset.currentDigest);\n const newDigest = await this.downloadAndDigest(asset, algorithm);\n return newDigest;\n }\n\n /**\n * Attempts to resolve the digest for the specified package.\n *\n * The `newValue` supplied here should be a valid tag for the GitHub release.\n * Requires `currentValue` and `currentDigest`.\n *\n * There may be many assets attached to the release. This function will:\n * - Identify the asset pinned by `currentDigest` in the `currentValue` release\n * - Download small release assets, parse as checksum manifests (e.g. `SHASUMS.txt`).\n * - Download individual assets until `currentDigest` is encountered. This is limited to sha256 and sha512.\n * - Map the hashed asset to `newValue` and return the updated digest as a string\n */\n override async getDigest(\n {\n packageName: repo,\n currentValue,\n currentDigest,\n registryUrl,\n }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n logger.debug(\n { repo, currentValue, currentDigest, registryUrl, newValue },\n 'getDigest',\n );\n if (!currentDigest) {\n return null;\n }\n if (!currentValue) {\n return currentDigest;\n }\n if (!newValue) {\n return null;\n }\n\n const apiBaseUrl = getApiBaseUrl(registryUrl);\n const { body: currentRelease } =\n await this.http.getJsonUnchecked<GithubRestRelease>(\n `${apiBaseUrl}repos/${repo}/releases/tags/${currentValue}`,\n );\n const digestAsset = await this.findDigestAsset(\n currentRelease,\n currentDigest,\n );\n let newDigest: string | null;\n if (!digestAsset || newValue === currentValue) {\n newDigest = currentDigest;\n } else {\n const { body: newRelease } =\n await this.http.getJsonUnchecked<GithubRestRelease>(\n `${apiBaseUrl}repos/${repo}/releases/tags/${newValue}`,\n );\n newDigest = await this.mapDigestAssetToRelease(digestAsset, newRelease);\n }\n return newDigest;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { regEx } from "../../../util/regex.js";
|
|
2
|
+
import { stripVersionPrefix } from "../../../util/string.js";
|
|
2
3
|
import { logger } from "../../../logger/index.js";
|
|
3
4
|
import { buildCacheKey } from "../../../util/cache/package/key.js";
|
|
4
5
|
import { isNotFound } from "../../../util/http/status.js";
|
|
@@ -69,7 +70,7 @@ var HexpmBobDatasource = class HexpmBobDatasource extends Datasource {
|
|
|
69
70
|
}
|
|
70
71
|
static cleanVersion(version, packageType) {
|
|
71
72
|
switch (packageType) {
|
|
72
|
-
case "elixir": return version
|
|
73
|
+
case "elixir": return stripVersionPrefix(version);
|
|
73
74
|
case "erlang": return version.replace(regEx(/^OTP-/), "");
|
|
74
75
|
}
|
|
75
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["semverId","HttpError","semver"],"sources":["../../../../lib/modules/datasource/hexpm-bob/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { isNotFound } from '../../../util/http/status.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport {\n api as semver,\n id as semverId,\n} from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport type { PackageType } from './types.ts';\n\nexport class HexpmBobDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [defaultRegistryUrl];\n }\n\n override readonly defaultVersioning = semverId;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `buildDate` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL https://github.com/elixir-lang/elixir.git for the `elixir` package and the https://github.com/erlang/otp.git URL for the `erlang` package.';\n\n private async fetchReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const packageType = HexpmBobDatasource.getPackageType(packageName);\n\n if (!packageType) {\n return null;\n }\n\n logger.trace(\n { registryUrl, packageName },\n `fetching hex.pm bob ${packageName} release`,\n );\n\n const url = `${registryUrl!}/builds/${packageName}/builds.txt`;\n\n const result: ReleaseResult = {\n releases: [],\n ...HexpmBobDatasource.getPackageDetails(packageType),\n };\n try {\n const { body } = await this.http.getText(url);\n result.releases = body\n .split('\\n')\n .map((line) => line.trim())\n .filter(isNonEmptyString)\n .map((line) => {\n const [version, gitRef, buildDate] = line.split(' ');\n\n return {\n gitRef,\n isStable: HexpmBobDatasource.isStable(version, packageType),\n releaseTimestamp: asTimestamp(buildDate),\n version: HexpmBobDatasource.cleanVersion(version, packageType),\n };\n });\n } catch (err) {\n if (err instanceof HttpError && !isNotFound(err)) {\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length > 0 ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: buildCacheKey(config.registryUrl, config.packageName),\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n\n private static getPackageType(packageName: string): PackageType | null {\n if (packageName === 'elixir') {\n return 'elixir';\n }\n if (regEx(/^otp\\/\\w+-\\d+\\.\\d+$/).test(packageName)) {\n return 'erlang';\n }\n return null;\n }\n\n private static cleanVersion(\n version: string,\n packageType: PackageType,\n ): string {\n switch (packageType) {\n case 'elixir':\n return version
|
|
1
|
+
{"version":3,"file":"index.js","names":["semverId","HttpError","semver"],"sources":["../../../../lib/modules/datasource/hexpm-bob/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { isNotFound } from '../../../util/http/status.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { stripVersionPrefix } from '../../../util/string.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport {\n api as semver,\n id as semverId,\n} from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport type { PackageType } from './types.ts';\n\nexport class HexpmBobDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [defaultRegistryUrl];\n }\n\n override readonly defaultVersioning = semverId;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `buildDate` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL https://github.com/elixir-lang/elixir.git for the `elixir` package and the https://github.com/erlang/otp.git URL for the `erlang` package.';\n\n private async fetchReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const packageType = HexpmBobDatasource.getPackageType(packageName);\n\n if (!packageType) {\n return null;\n }\n\n logger.trace(\n { registryUrl, packageName },\n `fetching hex.pm bob ${packageName} release`,\n );\n\n const url = `${registryUrl!}/builds/${packageName}/builds.txt`;\n\n const result: ReleaseResult = {\n releases: [],\n ...HexpmBobDatasource.getPackageDetails(packageType),\n };\n try {\n const { body } = await this.http.getText(url);\n result.releases = body\n .split('\\n')\n .map((line) => line.trim())\n .filter(isNonEmptyString)\n .map((line) => {\n const [version, gitRef, buildDate] = line.split(' ');\n\n return {\n gitRef,\n isStable: HexpmBobDatasource.isStable(version, packageType),\n releaseTimestamp: asTimestamp(buildDate),\n version: HexpmBobDatasource.cleanVersion(version, packageType),\n };\n });\n } catch (err) {\n if (err instanceof HttpError && !isNotFound(err)) {\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length > 0 ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: buildCacheKey(config.registryUrl, config.packageName),\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n\n private static getPackageType(packageName: string): PackageType | null {\n if (packageName === 'elixir') {\n return 'elixir';\n }\n if (regEx(/^otp\\/\\w+-\\d+\\.\\d+$/).test(packageName)) {\n return 'erlang';\n }\n return null;\n }\n\n private static cleanVersion(\n version: string,\n packageType: PackageType,\n ): string {\n switch (packageType) {\n case 'elixir':\n return stripVersionPrefix(version);\n case 'erlang':\n return version.replace(regEx(/^OTP-/), '');\n }\n }\n\n private static isStable(version: string, packageType: PackageType): boolean {\n switch (packageType) {\n case 'elixir': {\n // `-otp-<n>` builds of a stable release are stable too\n const release = version.split('-otp')[0];\n return (\n release.startsWith('v') &&\n semver.isVersion(release) &&\n semver.isStable(release)\n );\n }\n case 'erlang':\n return version.startsWith('OTP-');\n }\n }\n\n private static getPackageDetails(\n packageType: PackageType,\n ): Omit<ReleaseResult, 'releases'> {\n switch (packageType) {\n case 'elixir':\n return {\n homepage: 'https://elixir-lang.org/',\n sourceUrl: 'https://github.com/elixir-lang/elixir.git',\n };\n case 'erlang':\n return {\n homepage: 'https://www.erlang.org/',\n sourceUrl: 'https://github.com/erlang/otp.git',\n };\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAkBA,IAAa,qBAAb,MAAa,2BAA2B,WAAW;CACjD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,kBAAkB;CAC5B;CAEA,oBAAsCA;CAEtC,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,cAAc,EAC1B,aACA,eACmD;EACnD,MAAM,cAAc,mBAAmB,eAAe,WAAW;EAEjE,IAAI,CAAC,aACH,OAAO;EAGT,OAAO,MACL;GAAE;GAAa;EAAY,GAC3B,uBAAuB,YAAY,SACrC;EAEA,MAAM,MAAM,GAAG,YAAa,UAAU,YAAY;EAElD,MAAM,SAAwB;GAC5B,UAAU,CAAC;GACX,GAAG,mBAAmB,kBAAkB,WAAW;EACrD;EACA,IAAI;GACF,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG;GAC5C,OAAO,WAAW,KACf,MAAM,IAAI,CAAC,CACX,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,gBAAgB,CAAC,CACxB,KAAK,SAAS;IACb,MAAM,CAAC,SAAS,QAAQ,aAAa,KAAK,MAAM,GAAG;IAEnD,OAAO;KACL;KACA,UAAU,mBAAmB,SAAS,SAAS,WAAW;KAC1D,kBAAkB,YAAY,SAAS;KACvC,SAAS,mBAAmB,aAAa,SAAS,WAAW;IAC/D;GACF,CAAC;EACL,SAAS,KAAK;GACZ,IAAI,eAAeC,gBAAa,CAAC,WAAW,GAAG,GAC7C,MAAM,IAAI,kBAAkB,GAAG;GAEjC,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,IAAI,SAAS;CAC/C;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,cAAc,OAAO,aAAa,OAAO,WAAW;GACzD,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;CAEA,OAAe,eAAe,aAAyC;EACrE,IAAI,gBAAgB,UAClB,OAAO;EAET,IAAI,MAAM,qBAAqB,CAAC,CAAC,KAAK,WAAW,GAC/C,OAAO;EAET,OAAO;CACT;CAEA,OAAe,aACb,SACA,aACQ;EACR,QAAQ,aAAR;GACE,KAAK,UACH,OAAO,mBAAmB,OAAO;GACnC,KAAK,UACH,OAAO,QAAQ,QAAQ,MAAM,OAAO,GAAG,EAAE;EAC7C;CACF;CAEA,OAAe,SAAS,SAAiB,aAAmC;EAC1E,QAAQ,aAAR;GACE,KAAK,UAAU;IAEb,MAAM,UAAU,QAAQ,MAAM,MAAM,CAAC,CAAC;IACtC,OACE,QAAQ,WAAW,GAAG,KACtBC,IAAO,UAAU,OAAO,KACxBA,IAAO,SAAS,OAAO;GAE3B;GACA,KAAK,UACH,OAAO,QAAQ,WAAW,MAAM;EACpC;CACF;CAEA,OAAe,kBACb,aACiC;EACjC,QAAQ,aAAR;GACE,KAAK,UACH,OAAO;IACL,UAAU;IACV,WAAW;GACb;GACF,KAAK,UACH,OAAO;IACL,UAAU;IACV,WAAW;GACb;EACJ;CACF;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { stripVersionPrefix } from "../../../util/string.js";
|
|
2
2
|
import { logger } from "../../../logger/index.js";
|
|
3
3
|
import { LooseArray, LooseRecord, Nullish } from "../../../util/schema-utils/index.js";
|
|
4
4
|
import { MaybeTimestamp } from "../../../util/timestamp.js";
|
|
@@ -64,7 +64,7 @@ function extractReleaseResult(...composerReleasesArrays) {
|
|
|
64
64
|
let deprecationMessage;
|
|
65
65
|
for (const composerReleasesArray of composerReleasesArrays) for (const composerRelease of composerReleasesArray) {
|
|
66
66
|
const dep = {
|
|
67
|
-
version: composerRelease.version
|
|
67
|
+
version: stripVersionPrefix(composerRelease.version),
|
|
68
68
|
gitRef: composerRelease.version
|
|
69
69
|
};
|
|
70
70
|
const releaseTimestamp = composerRelease["published-time"] ?? composerRelease.time;
|
|
@@ -1 +1 @@
|
|
|
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 { regEx } from '../../../util/regex.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(regEx(/^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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"}
|
|
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 { stripVersionPrefix } from '../../../util/string.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 = stripVersionPrefix(composerRelease.version);\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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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { stripVersionPrefix } from "../../../util/string.js";
|
|
2
2
|
import { LooseArray } from "../../../util/schema-utils/index.js";
|
|
3
3
|
import { MaybeTimestamp } from "../../../util/timestamp.js";
|
|
4
4
|
import { isNonEmptyArray } from "@sindresorhus/is";
|
|
@@ -42,7 +42,7 @@ const OpenTofuModuleVersion = z.object({
|
|
|
42
42
|
id: z.string(),
|
|
43
43
|
published: MaybeTimestamp
|
|
44
44
|
}).transform((version) => ({
|
|
45
|
-
version: version.id
|
|
45
|
+
version: stripVersionPrefix(version.id),
|
|
46
46
|
releaseTimestamp: version.published
|
|
47
47
|
}));
|
|
48
48
|
const OpenTofuModuleDocsResponse = z.object({ versions: LooseArray(OpenTofuModuleVersion).catch([]) }).transform((response) => ({ releases: response.versions }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/terraform-module/schema.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport {
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/terraform-module/schema.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\nimport { stripVersionPrefix } from '../../../util/string.ts';\nimport { MaybeTimestamp } from '../../../util/timestamp.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\n\nexport const ServiceDiscoveryResponse = z.object({\n 'modules.v1': z.string().optional(),\n 'providers.v1': z.string().optional(),\n});\n\nexport type ServiceDiscoveryResponse = z.infer<typeof ServiceDiscoveryResponse>;\nexport type ServiceDiscoveryEndpointType = keyof ServiceDiscoveryResponse;\n\nexport const TerraformModuleResponse = z\n .object({\n source: z.string().optional(),\n versions: z.array(z.string()),\n version: z.string(),\n published_at: MaybeTimestamp,\n })\n .transform((resource) => ({\n source: resource.source,\n versions: resource.versions.map((version): Release => ({\n version,\n ...(version === resource.version && {\n releaseTimestamp: resource.published_at,\n }),\n })),\n }));\n\nexport type TerraformModuleResponse = z.infer<typeof TerraformModuleResponse>;\n\nconst ModuleAttributes = z.object({\n source: z.string().optional(),\n});\n\nconst ModuleVersion = z\n .object({\n type: z.literal('module-versions'),\n attributes: z.object({\n version: z.string(),\n 'published-at': MaybeTimestamp,\n }),\n })\n .transform((resource): Release => ({\n version: resource.attributes.version,\n releaseTimestamp: resource.attributes['published-at'],\n }));\n\nexport const TerraformModuleV2Response = z\n .object({\n data: z.object({\n attributes: ModuleAttributes,\n }),\n included: LooseArray(ModuleVersion).catch([]),\n })\n .transform((response): ReleaseResult => ({\n sourceUrl: response.data.attributes.source,\n releases: response.included,\n }));\n\nexport type TerraformModuleV2Response = z.infer<\n typeof TerraformModuleV2Response\n>;\n\nconst OpenTofuModuleVersion = z\n .object({\n id: z.string(),\n published: MaybeTimestamp,\n })\n .transform((version): Release => ({\n version: stripVersionPrefix(version.id),\n releaseTimestamp: version.published,\n }));\n\nexport const OpenTofuModuleDocsResponse = z\n .object({\n versions: LooseArray(OpenTofuModuleVersion).catch([]),\n })\n .transform((response): ReleaseResult => ({\n releases: response.versions,\n }));\n\nexport type OpenTofuModuleDocsResponse = z.infer<\n typeof OpenTofuModuleDocsResponse\n>;\n\nexport const TerraformModuleVersion = z\n .object({ version: z.string() })\n .transform(({ version }): Release => ({ version }));\n\nexport const TerraformModule = z\n .object({\n versions: LooseArray(TerraformModuleVersion),\n source: z.string().optional(),\n })\n .refine(\n ({ versions }) => isNonEmptyArray(versions),\n 'Empty versions array in module response',\n );\n\nexport const ProtocolModuleResponse = z\n .object({ modules: LooseArray(TerraformModule) })\n .refine(\n ({ modules }) => isNonEmptyArray(modules),\n 'Empty response from `/v1/modules` endpoint',\n )\n .transform(({ modules: [module] }) => module);\n\nexport type ProtocolModuleResponse = z.infer<typeof ProtocolModuleResponse>;\n"],"mappings":";;;;;;AAOA,MAAa,2BAA2B,EAAE,OAAO;CAC/C,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,gBAAgB,EAAE,OAAO,CAAC,CAAC,SAAS;AACtC,CAAC;AAKD,MAAa,0BAA0B,EACpC,OAAO;CACN,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;CAC5B,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC;CAC5B,SAAS,EAAE,OAAO;CAClB,cAAc;AAChB,CAAC,CAAC,CACD,WAAW,cAAc;CACxB,QAAQ,SAAS;CACjB,UAAU,SAAS,SAAS,KAAK,aAAsB;EACrD;EACA,GAAI,YAAY,SAAS,WAAW,EAClC,kBAAkB,SAAS,aAC7B;CACF,EAAE;AACJ,EAAE;AAIJ,MAAM,mBAAmB,EAAE,OAAO,EAChC,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS,EAC9B,CAAC;AAED,MAAM,gBAAgB,EACnB,OAAO;CACN,MAAM,EAAE,QAAQ,iBAAiB;CACjC,YAAY,EAAE,OAAO;EACnB,SAAS,EAAE,OAAO;EAClB,gBAAgB;CAClB,CAAC;AACH,CAAC,CAAC,CACD,WAAW,cAAuB;CACjC,SAAS,SAAS,WAAW;CAC7B,kBAAkB,SAAS,WAAW;AACxC,EAAE;AAEJ,MAAa,4BAA4B,EACtC,OAAO;CACN,MAAM,EAAE,OAAO,EACb,YAAY,iBACd,CAAC;CACD,UAAU,WAAW,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC,CAAC,CACD,WAAW,cAA6B;CACvC,WAAW,SAAS,KAAK,WAAW;CACpC,UAAU,SAAS;AACrB,EAAE;AAMJ,MAAM,wBAAwB,EAC3B,OAAO;CACN,IAAI,EAAE,OAAO;CACb,WAAW;AACb,CAAC,CAAC,CACD,WAAW,aAAsB;CAChC,SAAS,mBAAmB,QAAQ,EAAE;CACtC,kBAAkB,QAAQ;AAC5B,EAAE;AAEJ,MAAa,6BAA6B,EACvC,OAAO,EACN,UAAU,WAAW,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC,EACtD,CAAC,CAAC,CACD,WAAW,cAA6B,EACvC,UAAU,SAAS,SACrB,EAAE;AAMJ,MAAa,yBAAyB,EACnC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAC/B,WAAW,EAAE,eAAwB,EAAE,QAAQ,EAAE;AAEpD,MAAa,kBAAkB,EAC5B,OAAO;CACN,UAAU,WAAW,sBAAsB;CAC3C,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;AAC9B,CAAC,CAAC,CACD,QACE,EAAE,eAAe,gBAAgB,QAAQ,GAC1C,yCACF;AAEF,MAAa,yBAAyB,EACnC,OAAO,EAAE,SAAS,WAAW,eAAe,EAAE,CAAC,CAAC,CAChD,QACE,EAAE,cAAc,gBAAgB,OAAO,GACxC,4CACF,CAAC,CACA,WAAW,EAAE,SAAS,CAAC,cAAc,MAAM"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { stripVersionPrefix } from "../../../util/string.js";
|
|
2
2
|
import { LooseArray, LooseRecord } from "../../../util/schema-utils/index.js";
|
|
3
3
|
import { MaybeTimestamp } from "../../../util/timestamp.js";
|
|
4
4
|
import { z } from "zod/v4";
|
|
@@ -25,7 +25,7 @@ const OpenTofuProviderVersion = z.object({
|
|
|
25
25
|
id: z.string(),
|
|
26
26
|
published: MaybeTimestamp
|
|
27
27
|
}).transform((version) => ({
|
|
28
|
-
version: version.id
|
|
28
|
+
version: stripVersionPrefix(version.id),
|
|
29
29
|
releaseTimestamp: version.published
|
|
30
30
|
}));
|
|
31
31
|
const OpenTofuProviderDocsResponse = z.object({ versions: LooseArray(OpenTofuProviderVersion).catch([]) }).transform((response) => ({ releases: response.versions }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/terraform-provider/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport {
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/terraform-provider/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { LooseArray, LooseRecord } from '../../../util/schema-utils/index.ts';\nimport { stripVersionPrefix } from '../../../util/string.ts';\nimport { MaybeTimestamp } from '../../../util/timestamp.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\n\nconst ProviderAttributes = z.object({\n source: z.string().optional(),\n});\n\nconst ProviderVersion = z\n .object({\n type: z.literal('provider-versions'),\n attributes: z.object({\n version: z.string(),\n 'published-at': MaybeTimestamp,\n }),\n })\n .transform((resource): Release => ({\n version: resource.attributes.version,\n releaseTimestamp: resource.attributes['published-at'],\n }));\n\nexport const TerraformProviderV2Response = z\n .object({\n data: z.object({\n attributes: ProviderAttributes,\n }),\n included: LooseArray(ProviderVersion).catch([]),\n })\n .transform((response): ReleaseResult => ({\n sourceUrl: response.data.attributes.source,\n releases: response.included,\n }));\n\nexport type TerraformProviderV2Response = z.infer<\n typeof TerraformProviderV2Response\n>;\n\nconst OpenTofuProviderVersion = z\n .object({\n id: z.string(),\n published: MaybeTimestamp,\n })\n .transform((version): Release => ({\n version: stripVersionPrefix(version.id),\n releaseTimestamp: version.published,\n }));\n\nexport const OpenTofuProviderDocsResponse = z\n .object({\n versions: LooseArray(OpenTofuProviderVersion).catch([]),\n })\n .transform((response): ReleaseResult => ({\n releases: response.versions,\n }));\n\nexport type OpenTofuProviderDocsResponse = z.infer<\n typeof OpenTofuProviderDocsResponse\n>;\n\n// VersionDetailResponse — used by the releases.hashicorp.com backend\nexport const TerraformBuild = z.object({\n name: z.string(),\n version: z.string(),\n os: z.string(),\n arch: z.string(),\n filename: z.string(),\n url: z.string(),\n shasums_url: z.string().optional(),\n});\n\nexport type TerraformBuild = z.infer<typeof TerraformBuild>;\n\nexport const VersionDetailResponse = z.object({\n name: z.string().optional(),\n version: z.string().optional(),\n builds: z.array(TerraformBuild),\n});\n\nexport type VersionDetailResponse = z.infer<typeof VersionDetailResponse>;\n\n// TerraformProviderReleaseBackend — index.json from releases.hashicorp.com\nexport const TerraformProviderReleaseBackend = z.object({\n name: z.string().optional(),\n versions: z.record(z.string(), VersionDetailResponse),\n});\n\nexport type TerraformProviderReleaseBackend = z.infer<\n typeof TerraformProviderReleaseBackend\n>;\n\n// TerraformProviderVersions — Provider Registry Protocol /versions endpoint\nconst TerraformProviderVersionsVersion = z.object({\n version: z.string(),\n});\n\nexport const TerraformProviderVersions = z.object({\n versions: LooseArray(TerraformProviderVersionsVersion),\n});\n\nexport type TerraformProviderVersions = z.infer<\n typeof TerraformProviderVersions\n>;\n\n// TerraformRegistryVersions — registry /versions endpoint (for getBuilds)\nconst TerraformRegistryPlatform = z.object({\n os: z.string(),\n arch: z.string(),\n});\n\nconst TerraformRegistryVersionItem = z.object({\n version: z.string(),\n platforms: LooseArray(TerraformRegistryPlatform),\n});\n\nexport const TerraformRegistryVersions = z.object({\n versions: LooseArray(TerraformRegistryVersionItem).optional(),\n});\n\nexport type TerraformRegistryVersions = z.infer<\n typeof TerraformRegistryVersions\n>;\n\n// TerraformRegistryBuildResponse — per-platform download info\nexport const TerraformRegistryBuildResponse = z.object({\n os: z.string(),\n arch: z.string(),\n filename: z.string(),\n download_url: z.string(),\n shasums_url: z.string().optional(),\n});\n\nexport type TerraformRegistryBuildResponse = z.infer<\n typeof TerraformRegistryBuildResponse\n>;\n\n// OpenTofuProviderPackagesResponse — per-platform download endpoint exposes a\n// `packages` map containing the `zh:`/`h1:` hashes for every platform.\nconst OpenTofuProviderPackage = z.object({\n hashes: LooseArray(z.string()).catch([]),\n});\n\nexport const OpenTofuProviderPackagesResponse = z\n .object({\n packages: LooseRecord(OpenTofuProviderPackage).catch({}),\n })\n .transform(({ packages }): string[] | null => {\n const allHashes = Object.values(packages).flatMap(({ hashes }) => hashes);\n return allHashes.length ? allHashes : null;\n });\n\nexport type OpenTofuProviderPackagesResponse = z.infer<\n typeof OpenTofuProviderPackagesResponse\n>;\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { regEx } from "../../../util/regex.js";
|
|
2
|
+
import { stripVersionPrefix } from "../../../util/string.js";
|
|
2
3
|
import { logger } from "../../../logger/index.js";
|
|
3
4
|
import { hashStream } from "../../../util/hash.js";
|
|
4
5
|
import { get, set } from "../../../util/cache/package/index.js";
|
|
@@ -33,7 +34,7 @@ function massageUrl(url) {
|
|
|
33
34
|
return result;
|
|
34
35
|
}
|
|
35
36
|
function migrateUrl(url, upgrade) {
|
|
36
|
-
const newValue = upgrade.newValue
|
|
37
|
+
const newValue = upgrade.newValue && stripVersionPrefix(upgrade.newValue);
|
|
37
38
|
if (url.endsWith("/rules_webtesting.tar.gz") && !newValue?.match(regEx(/^0\.[0123]\./))) return url.replace(regEx(/\.tar\.gz$/), `-${newValue}.tar.gz`);
|
|
38
39
|
return url;
|
|
39
40
|
}
|
|
@@ -43,7 +44,7 @@ function replaceAll(input, from, to) {
|
|
|
43
44
|
function replaceValues(content, from, to) {
|
|
44
45
|
// istanbul ignore if
|
|
45
46
|
if (!from || !to || from === to) return content;
|
|
46
|
-
return replaceAll(content, from
|
|
47
|
+
return replaceAll(content, stripVersionPrefix(from), stripVersionPrefix(to));
|
|
47
48
|
}
|
|
48
49
|
async function getHashFromUrl(url) {
|
|
49
50
|
const cacheNamespace = "url-sha256";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","names":["packageCache.get","packageCache.set","pMap"],"sources":["../../../../lib/modules/manager/bazel/artifacts.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { map as pMap } from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n ArtifactError,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport {\n findCodeFragment,\n patchCodeAtFragments,\n updateCode,\n} from './common.ts';\nimport type {\n BazelManagerData,\n RecordFragment,\n StringFragment,\n} from './types.ts';\n\nconst http = new Http('bazel');\n\nfunction getUrlFragments(rule: RecordFragment): StringFragment[] {\n const urls: StringFragment[] = [];\n\n const urlRecord = rule.children.url;\n if (urlRecord?.type === 'string') {\n urls.push(urlRecord);\n }\n\n const urlsRecord = rule.children.urls;\n if (urlsRecord?.type === 'array') {\n for (const urlRecord of urlsRecord.children) {\n // v8 ignore else -- type narrowing only\n if (urlRecord.type === 'string') {\n urls.push(urlRecord);\n }\n }\n }\n\n return urls;\n}\n\nconst urlMassages = {\n 'bazel-skylib.': 'bazel_skylib-',\n '/bazel-gazelle/releases/download/0': '/bazel-gazelle/releases/download/v0',\n '/bazel-gazelle-0': '/bazel-gazelle-v0',\n '/rules_go/releases/download/0': '/rules_go/releases/download/v0',\n '/rules_go-0': '/rules_go-v0',\n};\n\nfunction massageUrl(url: string): string {\n let result = url;\n for (const [from, to] of Object.entries(urlMassages)) {\n result = result.replace(from, to);\n }\n return result;\n}\n\nfunction migrateUrl(url: string, upgrade: Upgrade): string {\n const newValue = upgrade.newValue
|
|
1
|
+
{"version":3,"file":"artifacts.js","names":["packageCache.get","packageCache.set","pMap"],"sources":["../../../../lib/modules/manager/bazel/artifacts.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { map as pMap } from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { stripVersionPrefix } from '../../../util/string.ts';\nimport type {\n ArtifactError,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport {\n findCodeFragment,\n patchCodeAtFragments,\n updateCode,\n} from './common.ts';\nimport type {\n BazelManagerData,\n RecordFragment,\n StringFragment,\n} from './types.ts';\n\nconst http = new Http('bazel');\n\nfunction getUrlFragments(rule: RecordFragment): StringFragment[] {\n const urls: StringFragment[] = [];\n\n const urlRecord = rule.children.url;\n if (urlRecord?.type === 'string') {\n urls.push(urlRecord);\n }\n\n const urlsRecord = rule.children.urls;\n if (urlsRecord?.type === 'array') {\n for (const urlRecord of urlsRecord.children) {\n // v8 ignore else -- type narrowing only\n if (urlRecord.type === 'string') {\n urls.push(urlRecord);\n }\n }\n }\n\n return urls;\n}\n\nconst urlMassages = {\n 'bazel-skylib.': 'bazel_skylib-',\n '/bazel-gazelle/releases/download/0': '/bazel-gazelle/releases/download/v0',\n '/bazel-gazelle-0': '/bazel-gazelle-v0',\n '/rules_go/releases/download/0': '/rules_go/releases/download/v0',\n '/rules_go-0': '/rules_go-v0',\n};\n\nfunction massageUrl(url: string): string {\n let result = url;\n for (const [from, to] of Object.entries(urlMassages)) {\n result = result.replace(from, to);\n }\n return result;\n}\n\nfunction migrateUrl(url: string, upgrade: Upgrade): string {\n const newValue = upgrade.newValue && stripVersionPrefix(upgrade.newValue);\n\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.3.5\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.4.0\n if (\n url.endsWith('/rules_webtesting.tar.gz') &&\n !newValue?.match(regEx(/^0\\.[0123]\\./))\n ) {\n return url.replace(regEx(/\\.tar\\.gz$/), `-${newValue}.tar.gz`);\n }\n\n return url;\n}\n\nfunction replaceAll(input: string, from: string, to: string): string {\n return input.split(from).join(to);\n}\n\nfunction replaceValues(\n content: string,\n from: string | null | undefined,\n to: string | null | undefined,\n): string {\n // istanbul ignore if\n if (!from || !to || from === to) {\n return content;\n }\n const massagedFrom = stripVersionPrefix(from);\n const massagedTo = stripVersionPrefix(to);\n return replaceAll(content, massagedFrom, massagedTo);\n}\n\nasync function getHashFromUrl(url: string): Promise<string | null> {\n const cacheNamespace = 'url-sha256';\n const cachedResult = await packageCache.get<string | null>(\n cacheNamespace,\n url,\n );\n /* istanbul ignore next line */\n if (cachedResult) {\n return cachedResult;\n }\n try {\n const hash = await hashStream(http.stream(url), 'sha256');\n const cacheMinutes = 3 * 24 * 60; // 3 days\n await packageCache.set(cacheNamespace, url, hash, cacheMinutes);\n return hash;\n } catch /* istanbul ignore next */ {\n return null;\n }\n}\n\nasync function getHashFromUrls(urls: string[]): Promise<string | null> {\n const hashes = (\n await pMap(urls, (url) => getHashFromUrl(massageUrl(url)))\n ).filter(isTruthy);\n if (!hashes.length) {\n logger.debug({ urls }, 'Could not calculate hash for URLs');\n return null;\n }\n\n const distinctHashes = new Set(hashes);\n // istanbul ignore if\n if (distinctHashes.size > 1) {\n logger.warn({ urls }, 'Found multiple hashes for single def');\n }\n\n return hashes[0];\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact<BazelManagerData>,\n): Promise<UpdateArtifactsResult[] | null> {\n const { packageFileName: path, updatedDeps: upgrades } = updateArtifact;\n const oldContents = updateArtifact.newPackageFileContent;\n let newContents = oldContents;\n const artifactErrors: ArtifactError[] = [];\n for (const upgrade of upgrades) {\n /* v8 ignore next -- defensive handling of upgrades without Bazel manager data */\n if (!upgrade.managerData) {\n logger.debug(\n `Skipping Bazel artifact update for ${upgrade.depName} in ${path}: missing manager data`,\n );\n continue;\n }\n\n const idx = upgrade.managerData.idx;\n\n // v8 ignore else -- only http rules reach updateArtifacts\n if (upgrade.depType === 'http_file' || upgrade.depType === 'http_archive') {\n const rule = findCodeFragment(newContents, [idx]);\n /* v8 ignore next -- used only for type narrowing */\n if (rule?.type !== 'record') {\n continue;\n }\n\n const urlFragments = getUrlFragments(rule);\n if (!urlFragments?.length) {\n logger.debug(`def: ${rule.value}, urls is empty`);\n continue;\n }\n\n function updateValues(oldUrl: string): string {\n let url = oldUrl;\n url = replaceValues(url, upgrade.currentValue, upgrade.newValue);\n url = replaceValues(url, upgrade.currentDigest, upgrade.newDigest);\n url = migrateUrl(url, upgrade);\n return url;\n }\n\n const urls = urlFragments.map(({ value }) => updateValues(value));\n const hash = await getHashFromUrls(urls);\n if (!hash) {\n // v8 ignore else -- the empty case already continued above\n if (urlFragments.length >= 1) {\n artifactErrors.push({\n fileName: path,\n stderr: `Could not calculate sha256 for ${upgrade.depName} at ${upgrade.newValue}. Checked URLs: ${urls.join(', ')}`,\n });\n }\n continue;\n }\n\n newContents = patchCodeAtFragments(\n newContents,\n urlFragments,\n updateValues,\n );\n newContents = updateCode(\n newContents,\n [idx, 'strip_prefix'],\n updateValues,\n );\n newContents = updateCode(newContents, [idx, 'sha256'], hash);\n }\n }\n\n if (oldContents === newContents) {\n if (artifactErrors.length) {\n // If we have artifact errors, return them even if we have file changes\n return artifactErrors.map((error) => ({\n artifactError: error,\n }));\n }\n return null;\n }\n\n return [\n {\n file: {\n type: 'addition',\n path,\n contents: newContents,\n },\n },\n ];\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { regEx } from "../../../util/regex.js";
|
|
2
2
|
import { coerceArray } from "../../../util/array.js";
|
|
3
|
+
import { stripVersionPrefix } from "../../../util/string.js";
|
|
3
4
|
import { logger } from "../../../logger/index.js";
|
|
4
5
|
import { readLocalFile } from "../../../util/fs/index.js";
|
|
5
6
|
import { Json, LooseArray, LooseRecord, withDebugMessage } from "../../../util/schema-utils/index.js";
|
|
@@ -180,7 +181,7 @@ const ComposerExtract = z.object({
|
|
|
180
181
|
};
|
|
181
182
|
if (!depName.includes("/")) dep.skipReason = "unsupported";
|
|
182
183
|
const lockedDep = locked.find((item) => item.name === depName);
|
|
183
|
-
if (lockedDep && api.isVersion(lockedDep.version)) dep.lockedVersion = lockedDep.version
|
|
184
|
+
if (lockedDep && api.isVersion(lockedDep.version)) dep.lockedVersion = stripVersionPrefix(lockedDep.version);
|
|
184
185
|
const gitRepo = gitRepos[depName];
|
|
185
186
|
if (gitRepo) {
|
|
186
187
|
const bitbucketMatchGroups = bitbucketUrlRegex.exec(gitRepo.url)?.groups;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":["semverComposer"],"sources":["../../../../lib/modules/manager/composer/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport {\n Json,\n LooseArray,\n LooseRecord,\n withDebugMessage,\n} from '../../../util/schema-utils/index.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { PackagistDatasource } from '../../datasource/packagist/index.ts';\nimport { api as semverComposer } from '../../versioning/composer/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { ComposerManagerData } from './types.ts';\n\nexport const ComposerRepo = z.object({\n type: z.literal('composer'),\n /**\n * The regUrl is expected to be a base URL. GitLab composer repository installation guide specifies\n * to use a base URL containing packages.json. Composer still works in this scenario by determining\n * whether to add / remove packages.json from the URL.\n *\n * See https://github.com/composer/composer/blob/750a92b4b7aecda0e5b2f9b963f1cb1421900675/src/Composer/Repository/ComposerRepository.php#L815\n */\n url: z\n .string()\n .transform((url) => url.replace(regEx(/\\/packages\\.json$/), '')),\n});\nexport type ComposerRepo = z.infer<typeof ComposerRepo>;\n\nexport const GitRepo = z.object({\n type: z.enum(['vcs', 'git']).transform(() => 'git' as const),\n url: z.string(),\n name: z.string().optional(),\n});\nexport type GitRepo = z.infer<typeof GitRepo>;\n\nexport const PathRepo = z.object({\n type: z.literal('path'),\n url: z.string(),\n name: z.string().optional(),\n});\nexport type PathRepo = z.infer<typeof PathRepo>;\n\nexport const PackageRepo = z.object({\n type: z.literal('package'),\n});\n\nexport const Repo = z.discriminatedUnion('type', [\n ComposerRepo,\n GitRepo,\n PathRepo,\n PackageRepo,\n]);\nexport type Repo = z.infer<typeof Repo>;\n\nexport const NamedRepo = z.discriminatedUnion('type', [\n ComposerRepo,\n GitRepo.extend({ name: z.string() }),\n PathRepo.extend({ name: z.string() }),\n PackageRepo,\n]);\nexport type NamedRepo = z.infer<typeof NamedRepo>;\n\nconst DisablePackagist = z.object({ type: z.literal('disable-packagist') });\nexport type DisablePackagist = z.infer<typeof DisablePackagist>;\n\nconst bitbucketUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)bitbucket\\.org[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\n\nexport const ReposRecord = LooseRecord(z.union([Repo, z.literal(false)]), {\n onError: ({ error: err }) => {\n logger.debug({ err }, 'Composer: error parsing repositories object');\n },\n}).transform((repos) => {\n const result: (NamedRepo | DisablePackagist)[] = [];\n for (const [name, repo] of Object.entries(repos)) {\n if (repo === false) {\n if (name === 'packagist' || name === 'packagist.org') {\n result.push({ type: 'disable-packagist' });\n }\n continue;\n }\n\n if (repo.type === 'path' || repo.type === 'git') {\n result.push({ name, ...repo });\n continue;\n }\n\n if (repo.type === 'composer') {\n result.push(repo);\n continue;\n }\n }\n\n return result;\n});\nexport type ReposRecord = z.infer<typeof ReposRecord>;\n\nexport const ReposArray = LooseArray(\n z.union([\n Repo,\n z\n .union([\n z.object({ packagist: z.literal(false) }),\n z.object({ 'packagist.org': z.literal(false) }),\n ])\n .transform((): DisablePackagist => ({ type: 'disable-packagist' })),\n ]),\n {\n onError: ({ error: err }) => {\n logger.debug({ err }, 'Composer: error parsing repositories array');\n },\n },\n).transform((repos) => {\n const result: (NamedRepo | DisablePackagist)[] = [];\n for (let idx = 0; idx < repos.length; idx++) {\n const repo = repos[idx];\n if (repo.type === 'path' || repo.type === 'git') {\n result.push({ name: `__${idx}`, ...repo });\n } else {\n result.push(repo);\n }\n }\n return result;\n});\nexport type ReposArray = z.infer<typeof ReposArray>;\n\nexport const Repos = z\n .union([ReposRecord, ReposArray])\n .default([]) // Prevents warnings for packages without repositories field\n .catch(withDebugMessage([], 'Composer: invalid \"repositories\" field'))\n .transform((repos) => {\n let packagist = true;\n const repoUrls: string[] = [];\n const gitRepos: Record<string, GitRepo> = {};\n const pathRepos: Record<string, PathRepo> = {};\n\n for (const repo of repos) {\n if (repo.type === 'composer') {\n repoUrls.push(repo.url);\n } else if (repo.type === 'git') {\n gitRepos[repo.name] = repo;\n } else if (repo.type === 'path') {\n pathRepos[repo.name] = repo;\n } else if (repo.type === 'disable-packagist') {\n packagist = false;\n }\n }\n\n if (packagist && repoUrls.length) {\n repoUrls.push('https://repo.packagist.org');\n }\n const registryUrls = repoUrls.length ? repoUrls : null;\n\n return { registryUrls, gitRepos, pathRepos };\n });\nexport type Repos = z.infer<typeof Repos>;\n\nconst RequireDefs = LooseRecord(z.string().transform((x) => x.trim())).catch(\n {},\n);\n\nexport const PackageFile = z\n .object({\n type: z.string().optional(),\n config: z\n .object({\n platform: z.object({\n php: z.string(),\n }),\n })\n .nullable()\n .catch(null),\n repositories: Repos,\n require: RequireDefs,\n 'require-dev': RequireDefs,\n })\n .transform(\n ({\n type: composerJsonType,\n config,\n repositories,\n require,\n 'require-dev': requireDev,\n }) => ({\n composerJsonType,\n config,\n repositories,\n require,\n requireDev,\n }),\n );\nexport type PackageFile = z.infer<typeof PackageFile>;\n\nconst LockedPackage = z.object({\n name: z.string(),\n version: z.string(),\n});\ntype LockedPackage = z.infer<typeof LockedPackage>;\n\nexport const Lockfile = z\n .object({\n 'plugin-api-version': z.string().optional(),\n packages: LooseArray(LockedPackage).catch([]),\n 'packages-dev': LooseArray(LockedPackage).catch([]),\n })\n .transform(\n ({\n 'plugin-api-version': pluginApiVersion,\n packages,\n 'packages-dev': packagesDev,\n }) => ({ pluginApiVersion, packages, packagesDev }),\n );\nexport type Lockfile = z.infer<typeof Lockfile>;\n\nexport const ComposerExtract = z\n .object({\n content: z.string(),\n fileName: z.string(),\n })\n .transform(({ content, fileName }) => {\n const lockfileName = fileName.replace(regEx(/\\.json$/), '.lock');\n return {\n file: content,\n lockfileName,\n lockfile: lockfileName,\n };\n })\n .pipe(\n z.object({\n file: Json.pipe(PackageFile),\n lockfileName: z.string(),\n lockfile: z\n .string()\n .transform((lockfileName) => readLocalFile(lockfileName, 'utf8'))\n .pipe(\n z.union([\n z.null(),\n z\n .string()\n .pipe(Json)\n .pipe(Lockfile)\n .nullable()\n .catch(withDebugMessage(null, 'Composer: does not match schema')),\n ]),\n ),\n }),\n )\n .transform(({ file, lockfile, lockfileName }) => {\n const { composerJsonType, require, requireDev } = file;\n const { registryUrls, gitRepos, pathRepos } = file.repositories;\n\n const deps: PackageDependency<ComposerManagerData>[] = [];\n\n const profiles = [\n {\n depType: 'require',\n req: require,\n locked: coerceArray(lockfile?.packages),\n },\n {\n depType: 'require-dev',\n req: requireDev,\n locked: coerceArray(lockfile?.packagesDev),\n },\n ];\n\n for (const { depType, req, locked } of profiles) {\n for (const [depName, currentValue] of Object.entries(req)) {\n if (depName === 'php') {\n deps.push({\n depType,\n depName,\n currentValue,\n datasource: GithubTagsDatasource.id,\n packageName: 'containerbase/php-prebuild',\n });\n continue;\n }\n\n if (pathRepos[depName]) {\n deps.push({\n depType,\n depName,\n currentValue,\n skipReason: 'path-dependency',\n });\n continue;\n }\n\n const dep: PackageDependency<ComposerManagerData> = {\n depType,\n depName,\n currentValue,\n };\n\n if (!depName.includes('/')) {\n dep.skipReason = 'unsupported';\n }\n\n const lockedDep = locked.find((item) => item.name === depName);\n if (lockedDep && semverComposer.isVersion(lockedDep.version)) {\n dep.lockedVersion = lockedDep.version.replace(regEx(/^v/i), '');\n }\n\n const gitRepo = gitRepos[depName];\n if (gitRepo) {\n const bitbucketMatchGroups = bitbucketUrlRegex.exec(\n gitRepo.url,\n )?.groups;\n\n if (bitbucketMatchGroups) {\n dep.datasource = BitbucketTagsDatasource.id;\n dep.packageName = bitbucketMatchGroups.packageName;\n deps.push(dep);\n continue;\n }\n\n dep.datasource = GitTagsDatasource.id;\n dep.packageName = gitRepo.url;\n deps.push(dep);\n continue;\n }\n\n dep.datasource = PackagistDatasource.id;\n\n if (registryUrls) {\n dep.registryUrls = registryUrls;\n }\n\n deps.push(dep);\n }\n }\n\n if (!deps.length) {\n return null;\n }\n\n const res: PackageFileContent<ComposerManagerData> = { deps };\n\n if (composerJsonType) {\n res.managerData = { composerJsonType };\n }\n\n if (require.php) {\n res.extractedConstraints = { php: require.php };\n }\n\n if (lockfile) {\n res.lockFiles = [lockfileName];\n }\n\n return res;\n });\nexport type ComposerExtract = z.infer<typeof ComposerExtract>;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","names":["semverComposer"],"sources":["../../../../lib/modules/manager/composer/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport {\n Json,\n LooseArray,\n LooseRecord,\n withDebugMessage,\n} from '../../../util/schema-utils/index.ts';\nimport { stripVersionPrefix } from '../../../util/string.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { PackagistDatasource } from '../../datasource/packagist/index.ts';\nimport { api as semverComposer } from '../../versioning/composer/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { ComposerManagerData } from './types.ts';\n\nexport const ComposerRepo = z.object({\n type: z.literal('composer'),\n /**\n * The regUrl is expected to be a base URL. GitLab composer repository installation guide specifies\n * to use a base URL containing packages.json. Composer still works in this scenario by determining\n * whether to add / remove packages.json from the URL.\n *\n * See https://github.com/composer/composer/blob/750a92b4b7aecda0e5b2f9b963f1cb1421900675/src/Composer/Repository/ComposerRepository.php#L815\n */\n url: z\n .string()\n .transform((url) => url.replace(regEx(/\\/packages\\.json$/), '')),\n});\nexport type ComposerRepo = z.infer<typeof ComposerRepo>;\n\nexport const GitRepo = z.object({\n type: z.enum(['vcs', 'git']).transform(() => 'git' as const),\n url: z.string(),\n name: z.string().optional(),\n});\nexport type GitRepo = z.infer<typeof GitRepo>;\n\nexport const PathRepo = z.object({\n type: z.literal('path'),\n url: z.string(),\n name: z.string().optional(),\n});\nexport type PathRepo = z.infer<typeof PathRepo>;\n\nexport const PackageRepo = z.object({\n type: z.literal('package'),\n});\n\nexport const Repo = z.discriminatedUnion('type', [\n ComposerRepo,\n GitRepo,\n PathRepo,\n PackageRepo,\n]);\nexport type Repo = z.infer<typeof Repo>;\n\nexport const NamedRepo = z.discriminatedUnion('type', [\n ComposerRepo,\n GitRepo.extend({ name: z.string() }),\n PathRepo.extend({ name: z.string() }),\n PackageRepo,\n]);\nexport type NamedRepo = z.infer<typeof NamedRepo>;\n\nconst DisablePackagist = z.object({ type: z.literal('disable-packagist') });\nexport type DisablePackagist = z.infer<typeof DisablePackagist>;\n\nconst bitbucketUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)bitbucket\\.org[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\n\nexport const ReposRecord = LooseRecord(z.union([Repo, z.literal(false)]), {\n onError: ({ error: err }) => {\n logger.debug({ err }, 'Composer: error parsing repositories object');\n },\n}).transform((repos) => {\n const result: (NamedRepo | DisablePackagist)[] = [];\n for (const [name, repo] of Object.entries(repos)) {\n if (repo === false) {\n if (name === 'packagist' || name === 'packagist.org') {\n result.push({ type: 'disable-packagist' });\n }\n continue;\n }\n\n if (repo.type === 'path' || repo.type === 'git') {\n result.push({ name, ...repo });\n continue;\n }\n\n if (repo.type === 'composer') {\n result.push(repo);\n continue;\n }\n }\n\n return result;\n});\nexport type ReposRecord = z.infer<typeof ReposRecord>;\n\nexport const ReposArray = LooseArray(\n z.union([\n Repo,\n z\n .union([\n z.object({ packagist: z.literal(false) }),\n z.object({ 'packagist.org': z.literal(false) }),\n ])\n .transform((): DisablePackagist => ({ type: 'disable-packagist' })),\n ]),\n {\n onError: ({ error: err }) => {\n logger.debug({ err }, 'Composer: error parsing repositories array');\n },\n },\n).transform((repos) => {\n const result: (NamedRepo | DisablePackagist)[] = [];\n for (let idx = 0; idx < repos.length; idx++) {\n const repo = repos[idx];\n if (repo.type === 'path' || repo.type === 'git') {\n result.push({ name: `__${idx}`, ...repo });\n } else {\n result.push(repo);\n }\n }\n return result;\n});\nexport type ReposArray = z.infer<typeof ReposArray>;\n\nexport const Repos = z\n .union([ReposRecord, ReposArray])\n .default([]) // Prevents warnings for packages without repositories field\n .catch(withDebugMessage([], 'Composer: invalid \"repositories\" field'))\n .transform((repos) => {\n let packagist = true;\n const repoUrls: string[] = [];\n const gitRepos: Record<string, GitRepo> = {};\n const pathRepos: Record<string, PathRepo> = {};\n\n for (const repo of repos) {\n if (repo.type === 'composer') {\n repoUrls.push(repo.url);\n } else if (repo.type === 'git') {\n gitRepos[repo.name] = repo;\n } else if (repo.type === 'path') {\n pathRepos[repo.name] = repo;\n } else if (repo.type === 'disable-packagist') {\n packagist = false;\n }\n }\n\n if (packagist && repoUrls.length) {\n repoUrls.push('https://repo.packagist.org');\n }\n const registryUrls = repoUrls.length ? repoUrls : null;\n\n return { registryUrls, gitRepos, pathRepos };\n });\nexport type Repos = z.infer<typeof Repos>;\n\nconst RequireDefs = LooseRecord(z.string().transform((x) => x.trim())).catch(\n {},\n);\n\nexport const PackageFile = z\n .object({\n type: z.string().optional(),\n config: z\n .object({\n platform: z.object({\n php: z.string(),\n }),\n })\n .nullable()\n .catch(null),\n repositories: Repos,\n require: RequireDefs,\n 'require-dev': RequireDefs,\n })\n .transform(\n ({\n type: composerJsonType,\n config,\n repositories,\n require,\n 'require-dev': requireDev,\n }) => ({\n composerJsonType,\n config,\n repositories,\n require,\n requireDev,\n }),\n );\nexport type PackageFile = z.infer<typeof PackageFile>;\n\nconst LockedPackage = z.object({\n name: z.string(),\n version: z.string(),\n});\ntype LockedPackage = z.infer<typeof LockedPackage>;\n\nexport const Lockfile = z\n .object({\n 'plugin-api-version': z.string().optional(),\n packages: LooseArray(LockedPackage).catch([]),\n 'packages-dev': LooseArray(LockedPackage).catch([]),\n })\n .transform(\n ({\n 'plugin-api-version': pluginApiVersion,\n packages,\n 'packages-dev': packagesDev,\n }) => ({ pluginApiVersion, packages, packagesDev }),\n );\nexport type Lockfile = z.infer<typeof Lockfile>;\n\nexport const ComposerExtract = z\n .object({\n content: z.string(),\n fileName: z.string(),\n })\n .transform(({ content, fileName }) => {\n const lockfileName = fileName.replace(regEx(/\\.json$/), '.lock');\n return {\n file: content,\n lockfileName,\n lockfile: lockfileName,\n };\n })\n .pipe(\n z.object({\n file: Json.pipe(PackageFile),\n lockfileName: z.string(),\n lockfile: z\n .string()\n .transform((lockfileName) => readLocalFile(lockfileName, 'utf8'))\n .pipe(\n z.union([\n z.null(),\n z\n .string()\n .pipe(Json)\n .pipe(Lockfile)\n .nullable()\n .catch(withDebugMessage(null, 'Composer: does not match schema')),\n ]),\n ),\n }),\n )\n .transform(({ file, lockfile, lockfileName }) => {\n const { composerJsonType, require, requireDev } = file;\n const { registryUrls, gitRepos, pathRepos } = file.repositories;\n\n const deps: PackageDependency<ComposerManagerData>[] = [];\n\n const profiles = [\n {\n depType: 'require',\n req: require,\n locked: coerceArray(lockfile?.packages),\n },\n {\n depType: 'require-dev',\n req: requireDev,\n locked: coerceArray(lockfile?.packagesDev),\n },\n ];\n\n for (const { depType, req, locked } of profiles) {\n for (const [depName, currentValue] of Object.entries(req)) {\n if (depName === 'php') {\n deps.push({\n depType,\n depName,\n currentValue,\n datasource: GithubTagsDatasource.id,\n packageName: 'containerbase/php-prebuild',\n });\n continue;\n }\n\n if (pathRepos[depName]) {\n deps.push({\n depType,\n depName,\n currentValue,\n skipReason: 'path-dependency',\n });\n continue;\n }\n\n const dep: PackageDependency<ComposerManagerData> = {\n depType,\n depName,\n currentValue,\n };\n\n if (!depName.includes('/')) {\n dep.skipReason = 'unsupported';\n }\n\n const lockedDep = locked.find((item) => item.name === depName);\n if (lockedDep && semverComposer.isVersion(lockedDep.version)) {\n dep.lockedVersion = stripVersionPrefix(lockedDep.version);\n }\n\n const gitRepo = gitRepos[depName];\n if (gitRepo) {\n const bitbucketMatchGroups = bitbucketUrlRegex.exec(\n gitRepo.url,\n )?.groups;\n\n if (bitbucketMatchGroups) {\n dep.datasource = BitbucketTagsDatasource.id;\n dep.packageName = bitbucketMatchGroups.packageName;\n deps.push(dep);\n continue;\n }\n\n dep.datasource = GitTagsDatasource.id;\n dep.packageName = gitRepo.url;\n deps.push(dep);\n continue;\n }\n\n dep.datasource = PackagistDatasource.id;\n\n if (registryUrls) {\n dep.registryUrls = registryUrls;\n }\n\n deps.push(dep);\n }\n }\n\n if (!deps.length) {\n return null;\n }\n\n const res: PackageFileContent<ComposerManagerData> = { deps };\n\n if (composerJsonType) {\n res.managerData = { composerJsonType };\n }\n\n if (require.php) {\n res.extractedConstraints = { php: require.php };\n }\n\n if (lockfile) {\n res.lockFiles = [lockfileName];\n }\n\n return res;\n });\nexport type ComposerExtract = z.infer<typeof ComposerExtract>;\n"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import "../../../constants/error-messages.js";
|
|
|
2
2
|
import { getEnv } from "../../../util/env.js";
|
|
3
3
|
import { regEx } from "../../../util/regex.js";
|
|
4
4
|
import { GlobalConfig } from "../../../config/global.js";
|
|
5
|
+
import { stripVersionPrefix } from "../../../util/string.js";
|
|
5
6
|
import { logger } from "../../../logger/index.js";
|
|
6
7
|
import { ensureCacheDir, findLocalSiblingOrParent, isValidLocalPath, readLocalFile, writeLocalFile } from "../../../util/fs/index.js";
|
|
7
8
|
import { filterMap } from "../../../util/filter-map.js";
|
|
@@ -31,7 +32,7 @@ async function getUpdateImportPathCmds(updatedDeps, config) {
|
|
|
31
32
|
let installMarwanModArgs = "install github.com/marwan-at-work/mod/cmd/mod@latest";
|
|
32
33
|
const gomodModCompatibility = await resolveToolConstraint(config, "gomodMod");
|
|
33
34
|
if (gomodModCompatibility) {
|
|
34
|
-
if (gomodModCompatibility.startsWith("v") && isVersion(gomodModCompatibility
|
|
35
|
+
if (gomodModCompatibility.startsWith("v") && isVersion(stripVersionPrefix(gomodModCompatibility))) installMarwanModArgs = installMarwanModArgs.replace(regEx(/@latest$/), `@${gomodModCompatibility}`);
|
|
35
36
|
else logger.debug({ gomodModCompatibility }, "marwan-at-work/mod compatibility range is not valid - skipping");
|
|
36
37
|
} else logger.debug("No marwan-at-work/mod compatibility range found - installing marwan-at-work/mod latest");
|
|
37
38
|
updateImportCommands.unshift(`go ${installMarwanModArgs}`);
|