renovate 43.209.4 → 43.209.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/bitbucket-tags/index.js +6 -5
- package/dist/modules/datasource/bitbucket-tags/index.js.map +1 -1
- package/dist/modules/datasource/bitbucket-tags/schema.js +20 -0
- package/dist/modules/datasource/bitbucket-tags/schema.js.map +1 -0
- package/dist/modules/datasource/nuget/schema.js +26 -0
- package/dist/modules/datasource/nuget/schema.js.map +1 -0
- package/dist/modules/datasource/nuget/v3.js +7 -4
- package/dist/modules/datasource/nuget/v3.js.map +1 -1
- package/dist/modules/datasource/terraform-provider/index.js +6 -6
- package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
- package/dist/modules/datasource/terraform-provider/schema.js +37 -1
- package/dist/modules/datasource/terraform-provider/schema.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +1 -1
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/npm/extract/pnpm.js +2 -2
- package/dist/modules/manager/npm/extract/pnpm.js.map +1 -1
- package/dist/modules/manager/terraform/lockfile/hash.js.map +1 -1
- package/package.json +2 -2
|
@@ -4,6 +4,7 @@ import { asTimestamp } from "../../../util/timestamp.js";
|
|
|
4
4
|
import { Datasource } from "../datasource.js";
|
|
5
5
|
import { BitbucketHttp } from "../../../util/http/bitbucket.js";
|
|
6
6
|
import { RepoInfo } from "../../platform/bitbucket/schema.js";
|
|
7
|
+
import { BitbucketCommits, BitbucketTag, BitbucketTags } from "./schema.js";
|
|
7
8
|
//#region lib/modules/datasource/bitbucket-tags/index.ts
|
|
8
9
|
var BitbucketTagsDatasource = class BitbucketTagsDatasource extends Datasource {
|
|
9
10
|
static id = "bitbucket-tags";
|
|
@@ -30,7 +31,7 @@ var BitbucketTagsDatasource = class BitbucketTagsDatasource extends Datasource {
|
|
|
30
31
|
}
|
|
31
32
|
async _getReleases({ registryUrl, packageName: repo }) {
|
|
32
33
|
const url = `/2.0/repositories/${repo}/refs/tags`;
|
|
33
|
-
const bitbucketTags = (await this.bitbucketHttp.
|
|
34
|
+
const bitbucketTags = (await this.bitbucketHttp.getJson(url, { paginate: true }, BitbucketTags)).body;
|
|
34
35
|
return {
|
|
35
36
|
sourceUrl: BitbucketTagsDatasource.getSourceUrl(repo, registryUrl),
|
|
36
37
|
registryUrl: BitbucketTagsDatasource.getRegistryURL(registryUrl),
|
|
@@ -50,7 +51,7 @@ var BitbucketTagsDatasource = class BitbucketTagsDatasource extends Datasource {
|
|
|
50
51
|
}
|
|
51
52
|
async _getTagCommit(_registryUrl, repo, tag) {
|
|
52
53
|
const url = `/2.0/repositories/${repo}/refs/tags/${tag}`;
|
|
53
|
-
return (await this.bitbucketHttp.
|
|
54
|
+
return (await this.bitbucketHttp.getJson(url, BitbucketTag)).body.target?.hash ?? null;
|
|
54
55
|
}
|
|
55
56
|
getTagCommit(registryUrl, repo, tag) {
|
|
56
57
|
return withCache({
|
|
@@ -71,9 +72,9 @@ var BitbucketTagsDatasource = class BitbucketTagsDatasource extends Datasource {
|
|
|
71
72
|
async _getDigest({ packageName: repo, registryUrl }, newValue) {
|
|
72
73
|
if (newValue?.length) return this.getTagCommit(registryUrl, repo, newValue);
|
|
73
74
|
const url = `/2.0/repositories/${repo}/commits/${await this.getMainBranch(BitbucketTagsDatasource.getRegistryURL(registryUrl), repo)}`;
|
|
74
|
-
const bitbucketCommits = (await this.bitbucketHttp.
|
|
75
|
-
if (bitbucketCommits.
|
|
76
|
-
return bitbucketCommits
|
|
75
|
+
const bitbucketCommits = (await this.bitbucketHttp.getJson(url, BitbucketCommits)).body;
|
|
76
|
+
if (bitbucketCommits.length === 0) return null;
|
|
77
|
+
return bitbucketCommits[0].hash;
|
|
77
78
|
}
|
|
78
79
|
getDigest(config, newValue) {
|
|
79
80
|
return withCache({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-tags/index.ts"],"sourcesContent":["import type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketHttp } from '../../../util/http/bitbucket.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { RepoInfo } from '../../platform/bitbucket/schema.ts';\nimport
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-tags/index.ts"],"sourcesContent":["import type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketHttp } from '../../../util/http/bitbucket.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { RepoInfo } from '../../platform/bitbucket/schema.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport { BitbucketCommits, BitbucketTag, BitbucketTags } from './schema.ts';\n\nexport class BitbucketTagsDatasource extends Datasource {\n static readonly id = 'bitbucket-tags';\n\n bitbucketHttp = new BitbucketHttp(BitbucketTagsDatasource.id);\n\n static readonly customRegistrySupport = true;\n\n static readonly registryStrategy = 'first';\n\n static readonly defaultRegistryUrls = ['https://bitbucket.org'];\n\n static readonly releaseTimestampSupport = true;\n static readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field in the results.';\n static readonly sourceUrlSupport = 'package';\n static readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketTagsDatasource.id}`;\n\n constructor() {\n super(BitbucketTagsDatasource.id);\n }\n\n static getRegistryURL(registryUrl?: string): string {\n // fallback to default API endpoint if custom not provided\n return registryUrl ?? this.defaultRegistryUrls[0];\n }\n\n static getCacheKey(\n registryUrl: string | undefined,\n repo: string,\n type: string,\n ): string {\n return `${BitbucketTagsDatasource.getRegistryURL(\n registryUrl,\n )}:${repo}:${type}`;\n }\n\n static getSourceUrl(packageName: string, registryUrl?: string): string {\n const url = BitbucketTagsDatasource.getRegistryURL(registryUrl);\n const normalizedUrl = ensureTrailingSlash(url);\n return `${normalizedUrl}${packageName}`;\n }\n\n // getReleases fetches list of tags for the repository\n private async _getReleases({\n registryUrl,\n packageName: repo,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = `/2.0/repositories/${repo}/refs/tags`;\n const bitbucketTags = (\n await this.bitbucketHttp.getJson(url, { paginate: true }, BitbucketTags)\n ).body;\n\n const dependency: ReleaseResult = {\n sourceUrl: BitbucketTagsDatasource.getSourceUrl(repo, registryUrl),\n registryUrl: BitbucketTagsDatasource.getRegistryURL(registryUrl),\n releases: bitbucketTags.map(({ name, target }) => ({\n version: name,\n gitRef: name,\n releaseTimestamp: asTimestamp(target?.date),\n })),\n };\n\n return dependency;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'tags',\n ),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n // getTagCommit fetched the commit has for specified tag\n private async _getTagCommit(\n _registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n const url = `/2.0/repositories/${repo}/refs/tags/${tag}`;\n\n const bitbucketTag = (await this.bitbucketHttp.getJson(url, BitbucketTag))\n .body;\n\n return bitbucketTag.target?.hash ?? null;\n }\n\n getTagCommit(\n registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n `tag-${tag}`,\n ),\n },\n () => this._getTagCommit(registryUrl, repo, tag),\n );\n }\n\n private async _getMainBranch(\n _registryUrl: string,\n repo: string,\n ): Promise<string> {\n return (\n await this.bitbucketHttp.getJson(`/2.0/repositories/${repo}`, RepoInfo)\n ).body.mainbranch;\n }\n\n getMainBranch(registryUrl: string, repo: string): Promise<string> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n 'mainbranch',\n ),\n ttlMinutes: 60,\n },\n () => this._getMainBranch(registryUrl, repo),\n );\n }\n\n // getDigest fetched the latest commit for repository main branch\n // however, if newValue is provided, then getTagCommit is called\n private async _getDigest(\n { packageName: repo, registryUrl }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n if (newValue?.length) {\n return this.getTagCommit(registryUrl, repo, newValue);\n }\n\n const mainBranch = await this.getMainBranch(\n BitbucketTagsDatasource.getRegistryURL(registryUrl),\n repo,\n );\n\n const url = `/2.0/repositories/${repo}/commits/${mainBranch}`;\n const bitbucketCommits = (\n await this.bitbucketHttp.getJson(url, BitbucketCommits)\n ).body;\n\n if (bitbucketCommits.length === 0) {\n return null;\n }\n\n return bitbucketCommits[0].hash;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'digest',\n ),\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,0BAAb,MAAa,gCAAgC,WAAW;CACtD,OAAgB,KAAK;CAErB,gBAAgB,IAAI,cAAc,wBAAwB,EAAE;CAE5D,OAAgB,wBAAwB;CAExC,OAAgB,mBAAmB;CAEnC,OAAgB,sBAAsB,CAAC,uBAAuB;CAE9D,OAAgB,0BAA0B;CAC1C,OAAgB,uBACd;CACF,OAAgB,mBAAmB;CACnC,OAAgB,gBACd;CAEF,OAAgB,iBAAwC,cAAc,wBAAwB;CAE9F,cAAc;EACZ,MAAM,wBAAwB,EAAE;CAClC;CAEA,OAAO,eAAe,aAA8B;EAElD,OAAO,eAAe,KAAK,oBAAoB;CACjD;CAEA,OAAO,YACL,aACA,MACA,MACQ;EACR,OAAO,GAAG,wBAAwB,eAChC,WACF,EAAE,GAAG,KAAK,GAAG;CACf;CAEA,OAAO,aAAa,aAAqB,aAA8B;EAGrE,OAAO,GADe,oBADV,wBAAwB,eAAe,WACP,CACtB,IAAI;CAC5B;CAGA,MAAc,aAAa,EACzB,aACA,aAAa,QACsC;EACnD,MAAM,MAAM,qBAAqB,KAAK;EACtC,MAAM,iBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,EAAE,UAAU,KAAK,GAAG,aAAa,GACvE;EAYF,OAAO;GATL,WAAW,wBAAwB,aAAa,MAAM,WAAW;GACjE,aAAa,wBAAwB,eAAe,WAAW;GAC/D,UAAU,cAAc,KAAK,EAAE,MAAM,cAAc;IACjD,SAAS;IACT,QAAQ;IACR,kBAAkB,YAAY,QAAQ,IAAI;GAC5C,EAAE;EAGY;CAClB;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,MACF;GACA,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAGA,MAAc,cACZ,cACA,MACA,KACwB;EACxB,MAAM,MAAM,qBAAqB,KAAK,aAAa;EAKnD,QAHsB,MAAM,KAAK,cAAc,QAAQ,KAAK,YAAY,GACrE,KAEiB,QAAQ,QAAQ;CACtC;CAEA,aACE,aACA,MACA,KACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,OAAO,KACT;EACF,SACM,KAAK,cAAc,aAAa,MAAM,GAAG,CACjD;CACF;CAEA,MAAc,eACZ,cACA,MACiB;EACjB,QACE,MAAM,KAAK,cAAc,QAAQ,qBAAqB,QAAQ,QAAQ,GACtE,KAAK;CACT;CAEA,cAAc,aAAqB,MAA+B;EAChE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,YACF;GACA,YAAY;EACd,SACM,KAAK,eAAe,aAAa,IAAI,CAC7C;CACF;CAIA,MAAc,WACZ,EAAE,aAAa,MAAM,eACrB,UACwB;EACxB,IAAI,UAAU,QACZ,OAAO,KAAK,aAAa,aAAa,MAAM,QAAQ;EAQtD,MAAM,MAAM,qBAAqB,KAAK,WAAW,MALxB,KAAK,cAC5B,wBAAwB,eAAe,WAAW,GAClD,IACF;EAGA,MAAM,oBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,gBAAgB,GACtD;EAEF,IAAI,iBAAiB,WAAW,GAC9B,OAAO;EAGT,OAAO,iBAAiB,GAAG;CAC7B;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,QACF;GACA,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;AACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { LooseArray } from "../../../util/schema-utils/index.js";
|
|
2
|
+
import { z } from "zod/v4";
|
|
3
|
+
//#region lib/modules/datasource/bitbucket-tags/schema.ts
|
|
4
|
+
const BitbucketTag = z.object({
|
|
5
|
+
name: z.string(),
|
|
6
|
+
target: z.object({
|
|
7
|
+
date: z.string().optional(),
|
|
8
|
+
hash: z.string().optional()
|
|
9
|
+
}).optional()
|
|
10
|
+
});
|
|
11
|
+
const BitbucketTags = z.object({ values: LooseArray(BitbucketTag) }).transform((body) => body.values);
|
|
12
|
+
const BitbucketCommit = z.object({
|
|
13
|
+
hash: z.string(),
|
|
14
|
+
date: z.string().optional()
|
|
15
|
+
});
|
|
16
|
+
const BitbucketCommits = z.object({ values: LooseArray(BitbucketCommit) }).transform((body) => body.values);
|
|
17
|
+
//#endregion
|
|
18
|
+
export { BitbucketCommits, BitbucketTag, BitbucketTags };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-tags/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\n\nexport const BitbucketTag = z.object({\n name: z.string(),\n target: z\n .object({\n date: z.string().optional(),\n hash: z.string().optional(),\n })\n .optional(),\n});\n\nexport const BitbucketTags = z\n .object({\n values: LooseArray(BitbucketTag),\n })\n .transform((body) => body.values);\n\nconst BitbucketCommit = z.object({\n hash: z.string(),\n date: z.string().optional(),\n});\n\nexport const BitbucketCommits = z\n .object({\n values: LooseArray(BitbucketCommit),\n })\n .transform((body) => body.values);\n"],"mappings":";;;AAGA,MAAa,eAAe,EAAE,OAAO;CACnC,MAAM,EAAE,OAAO;CACf,QAAQ,EACL,OAAO;EACN,MAAM,EAAE,OAAO,EAAE,SAAS;EAC1B,MAAM,EAAE,OAAO,EAAE,SAAS;CAC5B,CAAC,EACA,SAAS;AACd,CAAC;AAED,MAAa,gBAAgB,EAC1B,OAAO,EACN,QAAQ,WAAW,YAAY,EACjC,CAAC,EACA,WAAW,SAAS,KAAK,MAAM;AAElC,MAAM,kBAAkB,EAAE,OAAO;CAC/B,MAAM,EAAE,OAAO;CACf,MAAM,EAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAED,MAAa,mBAAmB,EAC7B,OAAO,EACN,QAAQ,WAAW,eAAe,EACpC,CAAC,EACA,WAAW,SAAS,KAAK,MAAM"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { LooseArray } from "../../../util/schema-utils/index.js";
|
|
2
|
+
import { z } from "zod/v4";
|
|
3
|
+
//#region lib/modules/datasource/nuget/schema.ts
|
|
4
|
+
const ServicesIndexRaw = z.object({ resources: LooseArray(z.object({
|
|
5
|
+
"@id": z.string(),
|
|
6
|
+
"@type": z.string()
|
|
7
|
+
})).catch([]) });
|
|
8
|
+
const Deprecation = z.object({ reasons: z.array(z.string()) });
|
|
9
|
+
const CatalogEntry = z.object({
|
|
10
|
+
version: z.string(),
|
|
11
|
+
published: z.string().optional(),
|
|
12
|
+
projectUrl: z.string().optional(),
|
|
13
|
+
listed: z.boolean().optional(),
|
|
14
|
+
packageContent: z.string().optional(),
|
|
15
|
+
deprecation: Deprecation.optional()
|
|
16
|
+
});
|
|
17
|
+
const CatalogItem = z.object({ catalogEntry: CatalogEntry });
|
|
18
|
+
const CatalogPage = z.object({
|
|
19
|
+
"@id": z.string().optional(),
|
|
20
|
+
items: LooseArray(CatalogItem).optional()
|
|
21
|
+
});
|
|
22
|
+
const PackageRegistration = z.object({ items: LooseArray(CatalogPage).default([]) });
|
|
23
|
+
//#endregion
|
|
24
|
+
export { CatalogPage, PackageRegistration, ServicesIndexRaw };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/nuget/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\n\nexport const ServicesIndexRaw = z.object({\n resources: LooseArray(\n z.object({\n '@id': z.string(),\n '@type': z.string(),\n }),\n ).catch([]),\n});\n\nexport type ServicesIndexRaw = z.infer<typeof ServicesIndexRaw>;\n\nconst Deprecation = z.object({\n reasons: z.array(z.string()),\n});\n\n// See https://learn.microsoft.com/en-us/nuget/api/registration-base-url-resource#catalog-entry\nexport const CatalogEntry = z.object({\n version: z.string(),\n published: z.string().optional(),\n projectUrl: z.string().optional(),\n listed: z.boolean().optional(),\n packageContent: z.string().optional(),\n deprecation: Deprecation.optional(),\n});\n\nexport type CatalogEntry = z.infer<typeof CatalogEntry>;\n\nconst CatalogItem = z.object({\n catalogEntry: CatalogEntry,\n});\n\nexport const CatalogPage = z.object({\n '@id': z.string().optional(),\n items: LooseArray(CatalogItem).optional(),\n});\n\nexport type CatalogPage = z.infer<typeof CatalogPage>;\n\nexport const PackageRegistration = z.object({\n items: LooseArray(CatalogPage).default([]),\n});\n\nexport type PackageRegistration = z.infer<typeof PackageRegistration>;\n"],"mappings":";;;AAGA,MAAa,mBAAmB,EAAE,OAAO,EACvC,WAAW,WACT,EAAE,OAAO;CACP,OAAO,EAAE,OAAO;CAChB,SAAS,EAAE,OAAO;AACpB,CAAC,CACH,EAAE,MAAM,CAAC,CAAC,EACZ,CAAC;AAID,MAAM,cAAc,EAAE,OAAO,EAC3B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAC7B,CAAC;AAGD,MAAa,eAAe,EAAE,OAAO;CACnC,SAAS,EAAE,OAAO;CAClB,WAAW,EAAE,OAAO,EAAE,SAAS;CAC/B,YAAY,EAAE,OAAO,EAAE,SAAS;CAChC,QAAQ,EAAE,QAAQ,EAAE,SAAS;CAC7B,gBAAgB,EAAE,OAAO,EAAE,SAAS;CACpC,aAAa,YAAY,SAAS;AACpC,CAAC;AAID,MAAM,cAAc,EAAE,OAAO,EAC3B,cAAc,aAChB,CAAC;AAED,MAAa,cAAc,EAAE,OAAO;CAClC,OAAO,EAAE,OAAO,EAAE,SAAS;CAC3B,OAAO,WAAW,WAAW,EAAE,SAAS;AAC1C,CAAC;AAID,MAAa,sBAAsB,EAAE,OAAO,EAC1C,OAAO,WAAW,WAAW,EAAE,QAAQ,CAAC,CAAC,EAC3C,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { getEnv } from "../../../util/env.js";
|
|
|
2
2
|
import { regEx } from "../../../util/regex.js";
|
|
3
3
|
import { logger } from "../../../logger/index.js";
|
|
4
4
|
import { ensureTrailingSlash } from "../../../util/url.js";
|
|
5
|
+
import { coerceArray } from "../../../util/array.js";
|
|
5
6
|
import { ExternalHostError } from "../../../types/errors/external-host-error.js";
|
|
6
7
|
import { createCacheWriteStream, ensureCacheDir, pipeline, readCacheFile, rmCache } from "../../../util/fs/index.js";
|
|
7
8
|
import api from "../../versioning/nuget/index.js";
|
|
@@ -13,6 +14,7 @@ import { asTimestamp } from "../../../util/timestamp.js";
|
|
|
13
14
|
import { all } from "../../../util/promises.js";
|
|
14
15
|
import { memCacheProvider } from "../../../util/http/cache/memory-http-cache-provider.js";
|
|
15
16
|
import { massageUrl, removeBuildMeta, sortNugetVersions } from "./common.js";
|
|
17
|
+
import { CatalogPage, PackageRegistration, ServicesIndexRaw } from "./schema.js";
|
|
16
18
|
import { isNonEmptyString } from "@sindresorhus/is";
|
|
17
19
|
import upath from "upath";
|
|
18
20
|
import semver from "semver";
|
|
@@ -31,7 +33,7 @@ var NugetV3Api = class NugetV3Api {
|
|
|
31
33
|
const responseCacheKey = url;
|
|
32
34
|
servicesIndexRaw = await get(NugetV3Api.cacheNamespace, responseCacheKey);
|
|
33
35
|
if (!servicesIndexRaw) {
|
|
34
|
-
servicesIndexRaw = (await http.
|
|
36
|
+
servicesIndexRaw = (await http.getJson(url, { cacheProvider: memCacheProvider }, ServicesIndexRaw)).body;
|
|
35
37
|
await set(NugetV3Api.cacheNamespace, responseCacheKey, servicesIndexRaw, 4320);
|
|
36
38
|
}
|
|
37
39
|
const services = servicesIndexRaw.resources.map(({ "@id": serviceId, "@type": t }) => ({
|
|
@@ -70,13 +72,14 @@ var NugetV3Api = class NugetV3Api {
|
|
|
70
72
|
let items = catalogPage.items;
|
|
71
73
|
if (!items) {
|
|
72
74
|
const url = catalogPage["@id"];
|
|
73
|
-
|
|
75
|
+
if (!url) return [];
|
|
76
|
+
items = (await http.getJson(url, CatalogPage)).body.items;
|
|
74
77
|
}
|
|
75
|
-
return items.map(({ catalogEntry }) => catalogEntry);
|
|
78
|
+
return coerceArray(items).map(({ catalogEntry }) => catalogEntry);
|
|
76
79
|
}
|
|
77
80
|
async getReleases(http, registryUrl, feedUrl, pkgName) {
|
|
78
81
|
const url = `${feedUrl.replace(regEx(/\/*$/), "")}/${pkgName.toLowerCase()}/index.json`;
|
|
79
|
-
const catalogPages = (await http.
|
|
82
|
+
const catalogPages = (await http.getJson(url, PackageRegistration)).body.items;
|
|
80
83
|
const catalogEntries = (await all(catalogPages.map((page) => () => this.getCatalogEntry(http, page)))).flat().sort((a, b) => sortNugetVersions(a.version, b.version));
|
|
81
84
|
let homepage = null;
|
|
82
85
|
let latestStable = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3.js","names":["packageCache.get","packageCache.set","p.all","versioning","HttpError","fs.createCacheWriteStream","fs.pipeline","fs.readCacheFile","fs.rmCache"],"sources":["../../../../lib/modules/datasource/nuget/v3.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport AdmZip from 'adm-zip';\nimport semver from 'semver';\nimport upath from 'upath';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { ensureCacheDir } from '../../../util/fs/index.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { api as versioning } from '../../versioning/nuget/index.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\nimport { massageUrl, removeBuildMeta, sortNugetVersions } from './common.ts';\nimport type {\n CatalogEntry,\n CatalogPage,\n PackageRegistration,\n ServicesIndexRaw,\n} from './types.ts';\n\nexport class NugetV3Api {\n static readonly cacheNamespace = 'datasource-nuget-v3';\n\n async getResourceUrl(\n http: Http,\n url: string,\n resourceType = 'RegistrationsBaseUrl',\n ): Promise<string | null> {\n // https://learn.microsoft.com/nuget/api/service-index\n const resultCacheKey = `${url}:${resourceType}`;\n const cachedResult = await packageCache.get<string>(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n );\n\n /* v8 ignore next 3 -- TODO: add test */\n if (cachedResult) {\n return cachedResult;\n }\n let servicesIndexRaw: ServicesIndexRaw | undefined;\n try {\n const responseCacheKey = url;\n servicesIndexRaw = await packageCache.get<ServicesIndexRaw>(\n NugetV3Api.cacheNamespace,\n responseCacheKey,\n );\n if (!servicesIndexRaw) {\n servicesIndexRaw = (\n await http.getJsonUnchecked<ServicesIndexRaw>(url, {\n cacheProvider: memCacheProvider,\n })\n ).body;\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n responseCacheKey,\n servicesIndexRaw,\n 3 * 24 * 60,\n );\n }\n\n const services = servicesIndexRaw.resources\n .map(({ '@id': serviceId, '@type': t }) => ({\n serviceId,\n type: t?.split('/')?.shift(),\n version: t?.split('/')?.pop(),\n }))\n .filter(\n ({ type, version }) => type === resourceType && semver.valid(version),\n )\n .sort((x, y) =>\n x.version && y.version\n ? semver.compare(x.version, y.version)\n : /* istanbul ignore next: hard to test */ 0,\n );\n\n if (services.length === 0) {\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n null,\n 60,\n );\n logger.debug(\n { url, servicesIndexRaw },\n `no ${resourceType} services found`,\n );\n return null;\n }\n\n const { serviceId, version } = services.pop()!;\n\n // istanbul ignore if\n if (\n resourceType === 'RegistrationsBaseUrl' &&\n version &&\n !version.startsWith('3.0.0-') &&\n !semver.satisfies(version, '^3.0.0')\n ) {\n logger.warn(\n { url, version },\n `Nuget: Unknown version returned. Only v3 is supported`,\n );\n }\n\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n serviceId,\n 60,\n );\n return serviceId;\n } catch (err) {\n // istanbul ignore if: not easy testable with nock\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, url, servicesIndexRaw },\n `nuget registry failure: can't get ${resourceType}`,\n );\n return null;\n }\n }\n\n async getCatalogEntry(\n http: Http,\n catalogPage: CatalogPage,\n ): Promise<CatalogEntry[]> {\n let items = catalogPage.items;\n if (!items) {\n const url = catalogPage['@id'];\n const catalogPageFull = await http.getJsonUnchecked<CatalogPage>(url);\n items = catalogPageFull.body.items;\n }\n return items.map(({ catalogEntry }) => catalogEntry);\n }\n\n async getReleases(\n http: Http,\n registryUrl: string,\n feedUrl: string,\n pkgName: string,\n ): Promise<ReleaseResult | null> {\n const baseUrl = feedUrl.replace(regEx(/\\/*$/), '');\n const url = `${baseUrl}/${pkgName.toLowerCase()}/index.json`;\n const packageRegistration =\n await http.getJsonUnchecked<PackageRegistration>(url);\n const catalogPages = packageRegistration.body.items || [];\n const catalogPagesQueue = catalogPages.map(\n (page) => (): Promise<CatalogEntry[]> => this.getCatalogEntry(http, page),\n );\n const catalogEntries = (await p.all(catalogPagesQueue))\n .flat()\n .sort((a, b) => sortNugetVersions(a.version, b.version));\n\n let homepage: string | null = null;\n let latestStable: string | null = null;\n let nupkgUrl: string | null = null;\n const releases = catalogEntries.map(\n ({\n version,\n published,\n projectUrl,\n listed,\n packageContent,\n deprecation,\n }) => {\n const release: Release = { version: removeBuildMeta(version) };\n const releaseTimestamp = asTimestamp(published);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n if (\n versioning.isValid(version) &&\n versioning.isStable(version) &&\n listed\n ) {\n latestStable = removeBuildMeta(version);\n homepage = projectUrl ? massageUrl(projectUrl) : homepage;\n nupkgUrl = massageUrl(packageContent);\n }\n\n if (listed === false || deprecation) {\n release.isDeprecated = true;\n }\n return release;\n },\n );\n\n if (!releases.length) {\n return null;\n }\n\n // istanbul ignore next: only happens when no stable version exists\n if (latestStable === null && catalogPages.length) {\n const last = catalogEntries.pop()!;\n latestStable = removeBuildMeta(last.version);\n homepage ??= last.projectUrl ?? null;\n nupkgUrl ??= massageUrl(last.packageContent);\n }\n\n const dep: ReleaseResult = {\n releases,\n };\n\n if (releases.every((release) => release.isDeprecated === true)) {\n dep.deprecationMessage = this.getDeprecationMessage(pkgName);\n }\n\n try {\n const packageBaseAddress = await this.getResourceUrl(\n http,\n registryUrl,\n 'PackageBaseAddress',\n );\n if (isNonEmptyString(packageBaseAddress)) {\n const nuspecUrl = `${ensureTrailingSlash(\n packageBaseAddress,\n )}${pkgName.toLowerCase()}/${\n // TODO: types (#22198)\n latestStable\n }/${pkgName.toLowerCase()}.nuspec`;\n const metaresult = await http.getText(nuspecUrl, {\n cacheProvider: memCacheProvider,\n });\n const nuspec = new XmlDocument(metaresult.body);\n const releaseNotes = nuspec.valueWithPath('metadata.releaseNotes');\n if (releaseNotes) {\n dep.changelogContent = releaseNotes;\n }\n const sourceUrl = nuspec.valueWithPath('metadata.repository@url');\n if (sourceUrl) {\n dep.sourceUrl = massageUrl(sourceUrl);\n }\n } else if (nupkgUrl) {\n const sourceUrl = await this.getSourceUrlFromNupkg(\n http,\n registryUrl,\n pkgName,\n latestStable,\n nupkgUrl,\n );\n if (sourceUrl) {\n dep.sourceUrl = massageUrl(sourceUrl);\n logger.debug(`Determined sourceUrl ${sourceUrl} from ${nupkgUrl}`);\n }\n }\n } catch (err) {\n // istanbul ignore if: not easy testable with nock\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // ignore / silence 404. Seen on proget, if remote connector is used and package is not yet cached\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n logger.debug(\n { registryUrl, pkgName, pkgVersion: latestStable },\n `package manifest (.nuspec) not found`,\n );\n } else {\n logger.debug(\n { err, registryUrl, pkgName, pkgVersion: latestStable },\n `Cannot obtain sourceUrl`,\n );\n }\n }\n\n if (homepage) {\n // only assign if not assigned\n dep.sourceUrl ??= homepage;\n dep.homepage ??= homepage;\n }\n\n return dep;\n }\n\n private async _getSourceUrlFromNupkg(\n http: Http,\n _registryUrl: string,\n packageName: string,\n packageVersion: string | null,\n nupkgUrl: string,\n ): Promise<string | null> {\n /* v8 ignore next 4 */\n if (!getEnv().RENOVATE_X_NUGET_DOWNLOAD_NUPKGS) {\n logger.once.debug('RENOVATE_X_NUGET_DOWNLOAD_NUPKGS is not set');\n return null;\n }\n const cacheDir = await ensureCacheDir('nuget');\n const nupkgFile = upath.join(\n cacheDir,\n `${packageName}.${packageVersion}.nupkg`,\n );\n const nupkgContentsDir = upath.join(\n cacheDir,\n `${packageName}.${packageVersion}`,\n );\n const readStream = http.stream(nupkgUrl);\n try {\n const writeStream = fs.createCacheWriteStream(nupkgFile);\n await fs.pipeline(readStream, writeStream);\n const zip = new AdmZip(nupkgFile);\n zip.extractAllTo(nupkgContentsDir);\n const nuspecFile = upath.join(nupkgContentsDir, `${packageName}.nuspec`);\n const nuspec = new XmlDocument(\n await fs.readCacheFile(nuspecFile, 'utf8'),\n );\n return nuspec.valueWithPath('metadata.repository@url') ?? null;\n } finally {\n await fs.rmCache(nupkgFile);\n await fs.rmCache(nupkgContentsDir);\n }\n }\n\n getSourceUrlFromNupkg(\n http: Http,\n registryUrl: string,\n packageName: string,\n packageVersion: string | null,\n nupkgUrl: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: NugetV3Api.cacheNamespace,\n key: `source-url:${registryUrl}:${packageName}`,\n ttlMinutes: 10080, // 1 week\n },\n () =>\n this._getSourceUrlFromNupkg(\n http,\n registryUrl,\n packageName,\n packageVersion,\n nupkgUrl,\n ),\n );\n }\n\n getDeprecationMessage(packageName: string): string {\n return `The package \\`${packageName}\\` is deprecated.`;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"v3.js","names":["packageCache.get","packageCache.set","p.all","versioning","HttpError","fs.createCacheWriteStream","fs.pipeline","fs.readCacheFile","fs.rmCache"],"sources":["../../../../lib/modules/datasource/nuget/v3.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport AdmZip from 'adm-zip';\nimport semver from 'semver';\nimport upath from 'upath';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { ensureCacheDir } from '../../../util/fs/index.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { api as versioning } from '../../versioning/nuget/index.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\nimport { massageUrl, removeBuildMeta, sortNugetVersions } from './common.ts';\nimport type { CatalogEntry } from './schema.ts';\nimport {\n CatalogPage,\n PackageRegistration,\n ServicesIndexRaw,\n} from './schema.ts';\n\nexport class NugetV3Api {\n static readonly cacheNamespace = 'datasource-nuget-v3';\n\n async getResourceUrl(\n http: Http,\n url: string,\n resourceType = 'RegistrationsBaseUrl',\n ): Promise<string | null> {\n // https://learn.microsoft.com/nuget/api/service-index\n const resultCacheKey = `${url}:${resourceType}`;\n const cachedResult = await packageCache.get<string>(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n );\n\n /* v8 ignore next 3 -- TODO: add test */\n if (cachedResult) {\n return cachedResult;\n }\n let servicesIndexRaw: ServicesIndexRaw | undefined;\n try {\n const responseCacheKey = url;\n servicesIndexRaw = await packageCache.get<ServicesIndexRaw>(\n NugetV3Api.cacheNamespace,\n responseCacheKey,\n );\n if (!servicesIndexRaw) {\n servicesIndexRaw = (\n await http.getJson(\n url,\n { cacheProvider: memCacheProvider },\n ServicesIndexRaw,\n )\n ).body;\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n responseCacheKey,\n servicesIndexRaw,\n 3 * 24 * 60,\n );\n }\n\n const services = servicesIndexRaw.resources\n .map(({ '@id': serviceId, '@type': t }) => ({\n serviceId,\n type: t?.split('/')?.shift(),\n version: t?.split('/')?.pop(),\n }))\n .filter(\n ({ type, version }) => type === resourceType && semver.valid(version),\n )\n .sort((x, y) =>\n x.version && y.version\n ? semver.compare(x.version, y.version)\n : /* istanbul ignore next: hard to test */ 0,\n );\n\n if (services.length === 0) {\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n null,\n 60,\n );\n logger.debug(\n { url, servicesIndexRaw },\n `no ${resourceType} services found`,\n );\n return null;\n }\n\n const { serviceId, version } = services.pop()!;\n\n // istanbul ignore if\n if (\n resourceType === 'RegistrationsBaseUrl' &&\n version &&\n !version.startsWith('3.0.0-') &&\n !semver.satisfies(version, '^3.0.0')\n ) {\n logger.warn(\n { url, version },\n `Nuget: Unknown version returned. Only v3 is supported`,\n );\n }\n\n await packageCache.set(\n NugetV3Api.cacheNamespace,\n resultCacheKey,\n serviceId,\n 60,\n );\n return serviceId;\n } catch (err) {\n // istanbul ignore if: not easy testable with nock\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, url, servicesIndexRaw },\n `nuget registry failure: can't get ${resourceType}`,\n );\n return null;\n }\n }\n\n async getCatalogEntry(\n http: Http,\n catalogPage: CatalogPage,\n ): Promise<CatalogEntry[]> {\n let items = catalogPage.items;\n if (!items) {\n const url = catalogPage['@id'];\n if (!url) {\n return [];\n }\n const catalogPageFull = await http.getJson(url, CatalogPage);\n items = catalogPageFull.body.items;\n }\n return coerceArray(items).map(({ catalogEntry }) => catalogEntry);\n }\n\n async getReleases(\n http: Http,\n registryUrl: string,\n feedUrl: string,\n pkgName: string,\n ): Promise<ReleaseResult | null> {\n const baseUrl = feedUrl.replace(regEx(/\\/*$/), '');\n const url = `${baseUrl}/${pkgName.toLowerCase()}/index.json`;\n const packageRegistration = await http.getJson(url, PackageRegistration);\n const catalogPages = packageRegistration.body.items;\n const catalogPagesQueue = catalogPages.map(\n (page) => (): Promise<CatalogEntry[]> => this.getCatalogEntry(http, page),\n );\n const catalogEntries = (await p.all(catalogPagesQueue))\n .flat()\n .sort((a, b) => sortNugetVersions(a.version, b.version));\n\n let homepage: string | null = null;\n let latestStable: string | null = null;\n let nupkgUrl: string | null = null;\n const releases = catalogEntries.map(\n ({\n version,\n published,\n projectUrl,\n listed,\n packageContent,\n deprecation,\n }) => {\n const release: Release = { version: removeBuildMeta(version) };\n const releaseTimestamp = asTimestamp(published);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n if (\n versioning.isValid(version) &&\n versioning.isStable(version) &&\n listed\n ) {\n latestStable = removeBuildMeta(version);\n homepage = projectUrl ? massageUrl(projectUrl) : homepage;\n nupkgUrl = massageUrl(packageContent);\n }\n\n if (listed === false || deprecation) {\n release.isDeprecated = true;\n }\n return release;\n },\n );\n\n if (!releases.length) {\n return null;\n }\n\n // istanbul ignore next: only happens when no stable version exists\n if (latestStable === null && catalogPages.length) {\n const last = catalogEntries.pop()!;\n latestStable = removeBuildMeta(last.version);\n homepage ??= last.projectUrl ?? null;\n nupkgUrl ??= massageUrl(last.packageContent);\n }\n\n const dep: ReleaseResult = {\n releases,\n };\n\n if (releases.every((release) => release.isDeprecated === true)) {\n dep.deprecationMessage = this.getDeprecationMessage(pkgName);\n }\n\n try {\n const packageBaseAddress = await this.getResourceUrl(\n http,\n registryUrl,\n 'PackageBaseAddress',\n );\n if (isNonEmptyString(packageBaseAddress)) {\n const nuspecUrl = `${ensureTrailingSlash(\n packageBaseAddress,\n )}${pkgName.toLowerCase()}/${\n latestStable\n }/${pkgName.toLowerCase()}.nuspec`;\n const metaresult = await http.getText(nuspecUrl, {\n cacheProvider: memCacheProvider,\n });\n const nuspec = new XmlDocument(metaresult.body);\n const releaseNotes = nuspec.valueWithPath('metadata.releaseNotes');\n if (releaseNotes) {\n dep.changelogContent = releaseNotes;\n }\n const sourceUrl = nuspec.valueWithPath('metadata.repository@url');\n if (sourceUrl) {\n dep.sourceUrl = massageUrl(sourceUrl);\n }\n } else if (nupkgUrl) {\n const sourceUrl = await this.getSourceUrlFromNupkg(\n http,\n registryUrl,\n pkgName,\n latestStable,\n nupkgUrl,\n );\n if (sourceUrl) {\n dep.sourceUrl = massageUrl(sourceUrl);\n logger.debug(`Determined sourceUrl ${sourceUrl} from ${nupkgUrl}`);\n }\n }\n } catch (err) {\n // istanbul ignore if: not easy testable with nock\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // ignore / silence 404. Seen on proget, if remote connector is used and package is not yet cached\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n logger.debug(\n { registryUrl, pkgName, pkgVersion: latestStable },\n `package manifest (.nuspec) not found`,\n );\n } else {\n logger.debug(\n { err, registryUrl, pkgName, pkgVersion: latestStable },\n `Cannot obtain sourceUrl`,\n );\n }\n }\n\n if (homepage) {\n // only assign if not assigned\n dep.sourceUrl ??= homepage;\n dep.homepage ??= homepage;\n }\n\n return dep;\n }\n\n private async _getSourceUrlFromNupkg(\n http: Http,\n _registryUrl: string,\n packageName: string,\n packageVersion: string | null,\n nupkgUrl: string,\n ): Promise<string | null> {\n /* v8 ignore next 4 */\n if (!getEnv().RENOVATE_X_NUGET_DOWNLOAD_NUPKGS) {\n logger.once.debug('RENOVATE_X_NUGET_DOWNLOAD_NUPKGS is not set');\n return null;\n }\n const cacheDir = await ensureCacheDir('nuget');\n const nupkgFile = upath.join(\n cacheDir,\n `${packageName}.${packageVersion}.nupkg`,\n );\n const nupkgContentsDir = upath.join(\n cacheDir,\n `${packageName}.${packageVersion}`,\n );\n const readStream = http.stream(nupkgUrl);\n try {\n const writeStream = fs.createCacheWriteStream(nupkgFile);\n await fs.pipeline(readStream, writeStream);\n const zip = new AdmZip(nupkgFile);\n zip.extractAllTo(nupkgContentsDir);\n const nuspecFile = upath.join(nupkgContentsDir, `${packageName}.nuspec`);\n const nuspec = new XmlDocument(\n await fs.readCacheFile(nuspecFile, 'utf8'),\n );\n return nuspec.valueWithPath('metadata.repository@url') ?? null;\n } finally {\n await fs.rmCache(nupkgFile);\n await fs.rmCache(nupkgContentsDir);\n }\n }\n\n getSourceUrlFromNupkg(\n http: Http,\n registryUrl: string,\n packageName: string,\n packageVersion: string | null,\n nupkgUrl: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: NugetV3Api.cacheNamespace,\n key: `source-url:${registryUrl}:${packageName}`,\n ttlMinutes: 10080, // 1 week\n },\n () =>\n this._getSourceUrlFromNupkg(\n http,\n registryUrl,\n packageName,\n packageVersion,\n nupkgUrl,\n ),\n );\n }\n\n getDeprecationMessage(packageName: string): string {\n return `The package \\`${packageName}\\` is deprecated.`;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,aAAb,MAAa,WAAW;CACtB,OAAgB,iBAAiB;CAEjC,MAAM,eACJ,MACA,KACA,eAAe,wBACS;EAExB,MAAM,iBAAiB,GAAG,IAAI,GAAG;EACjC,MAAM,eAAe,MAAMA,IACzB,WAAW,gBACX,cACF;;EAGA,IAAI,cACF,OAAO;EAET,IAAI;EACJ,IAAI;GACF,MAAM,mBAAmB;GACzB,mBAAmB,MAAMA,IACvB,WAAW,gBACX,gBACF;GACA,IAAI,CAAC,kBAAkB;IACrB,oBACE,MAAM,KAAK,QACT,KACA,EAAE,eAAe,iBAAiB,GAClC,gBACF,GACA;IACF,MAAMC,IACJ,WAAW,gBACX,kBACA,kBACA,IACF;GACF;GAEA,MAAM,WAAW,iBAAiB,UAC/B,KAAK,EAAE,OAAO,WAAW,SAAS,SAAS;IAC1C;IACA,MAAM,GAAG,MAAM,GAAG,GAAG,MAAM;IAC3B,SAAS,GAAG,MAAM,GAAG,GAAG,IAAI;GAC9B,EAAE,EACD,QACE,EAAE,MAAM,cAAc,SAAS,gBAAgB,OAAO,MAAM,OAAO,CACtE,EACC,MAAM,GAAG,MACR,EAAE,WAAW,EAAE,UACX,OAAO,QAAQ,EAAE,SAAS,EAAE,OAAO,gDACM,CAC/C;GAEF,IAAI,SAAS,WAAW,GAAG;IACzB,MAAMA,IACJ,WAAW,gBACX,gBACA,MACA,EACF;IACA,OAAO,MACL;KAAE;KAAK;IAAiB,GACxB,MAAM,aAAa,gBACrB;IACA,OAAO;GACT;GAEA,MAAM,EAAE,WAAW,YAAY,SAAS,IAAI;;GAG5C,IACE,iBAAiB,0BACjB,WACA,CAAC,QAAQ,WAAW,QAAQ,KAC5B,CAAC,OAAO,UAAU,SAAS,QAAQ,GAEnC,OAAO,KACL;IAAE;IAAK;GAAQ,GACf,uDACF;GAGF,MAAMA,IACJ,WAAW,gBACX,gBACA,WACA,EACF;GACA,OAAO;EACT,SAAS,KAAK;;GAEZ,IAAI,eAAe,mBACjB,MAAM;GAER,OAAO,MACL;IAAE;IAAK;IAAK;GAAiB,GAC7B,qCAAqC,cACvC;GACA,OAAO;EACT;CACF;CAEA,MAAM,gBACJ,MACA,aACyB;EACzB,IAAI,QAAQ,YAAY;EACxB,IAAI,CAAC,OAAO;GACV,MAAM,MAAM,YAAY;GACxB,IAAI,CAAC,KACH,OAAO,CAAC;GAGV,SAAQ,MADsB,KAAK,QAAQ,KAAK,WAAW,GACnC,KAAK;EAC/B;EACA,OAAO,YAAY,KAAK,EAAE,KAAK,EAAE,mBAAmB,YAAY;CAClE;CAEA,MAAM,YACJ,MACA,aACA,SACA,SAC+B;EAE/B,MAAM,MAAM,GADI,QAAQ,QAAQ,MAAM,MAAM,GAAG,EAC1B,EAAE,GAAG,QAAQ,YAAY,EAAE;EAEhD,MAAM,gBAAe,MADa,KAAK,QAAQ,KAAK,mBAAmB,GAC9B,KAAK;EAI9C,MAAM,kBAAkB,MAAMC,IAHJ,aAAa,KACpC,eAAwC,KAAK,gBAAgB,MAAM,IAAI,CAEtC,CAAiB,GAClD,KAAK,EACL,MAAM,GAAG,MAAM,kBAAkB,EAAE,SAAS,EAAE,OAAO,CAAC;EAEzD,IAAI,WAA0B;EAC9B,IAAI,eAA8B;EAClC,IAAI,WAA0B;EAC9B,MAAM,WAAW,eAAe,KAC7B,EACC,SACA,WACA,YACA,QACA,gBACA,kBACI;GACJ,MAAM,UAAmB,EAAE,SAAS,gBAAgB,OAAO,EAAE;GAC7D,MAAM,mBAAmB,YAAY,SAAS;GAC9C,IAAI,kBACF,QAAQ,mBAAmB;GAE7B,IACEC,IAAW,QAAQ,OAAO,KAC1BA,IAAW,SAAS,OAAO,KAC3B,QACA;IACA,eAAe,gBAAgB,OAAO;IACtC,WAAW,aAAa,WAAW,UAAU,IAAI;IACjD,WAAW,WAAW,cAAc;GACtC;GAEA,IAAI,WAAW,SAAS,aACtB,QAAQ,eAAe;GAEzB,OAAO;EACT,CACF;EAEA,IAAI,CAAC,SAAS,QACZ,OAAO;;EAIT,IAAI,iBAAiB,QAAQ,aAAa,QAAQ;GAChD,MAAM,OAAO,eAAe,IAAI;GAChC,eAAe,gBAAgB,KAAK,OAAO;GAC3C,aAAa,KAAK,cAAc;GAChC,aAAa,WAAW,KAAK,cAAc;EAC7C;EAEA,MAAM,MAAqB,EACzB,SACF;EAEA,IAAI,SAAS,OAAO,YAAY,QAAQ,iBAAiB,IAAI,GAC3D,IAAI,qBAAqB,KAAK,sBAAsB,OAAO;EAG7D,IAAI;GACF,MAAM,qBAAqB,MAAM,KAAK,eACpC,MACA,aACA,oBACF;GACA,IAAI,iBAAiB,kBAAkB,GAAG;IACxC,MAAM,YAAY,GAAG,oBACnB,kBACF,IAAI,QAAQ,YAAY,EAAE,GACxB,aACD,GAAG,QAAQ,YAAY,EAAE;IAI1B,MAAM,SAAS,IAAI,aAAY,MAHN,KAAK,QAAQ,WAAW,EAC/C,eAAe,iBACjB,CAAC,GACyC,IAAI;IAC9C,MAAM,eAAe,OAAO,cAAc,uBAAuB;IACjE,IAAI,cACF,IAAI,mBAAmB;IAEzB,MAAM,YAAY,OAAO,cAAc,yBAAyB;IAChE,IAAI,WACF,IAAI,YAAY,WAAW,SAAS;GAExC,OAAO,IAAI,UAAU;IACnB,MAAM,YAAY,MAAM,KAAK,sBAC3B,MACA,aACA,SACA,cACA,QACF;IACA,IAAI,WAAW;KACb,IAAI,YAAY,WAAW,SAAS;KACpC,OAAO,MAAM,wBAAwB,UAAU,QAAQ,UAAU;IACnE;GACF;EACF,SAAS,KAAK;;GAEZ,IAAI,eAAe,mBACjB,MAAM;GAGR,IAAI,eAAeC,gBAAa,IAAI,UAAU,eAAe,KAC3D,OAAO,MACL;IAAE;IAAa;IAAS,YAAY;GAAa,GACjD,sCACF;QAEA,OAAO,MACL;IAAE;IAAK;IAAa;IAAS,YAAY;GAAa,GACtD,yBACF;EAEJ;EAEA,IAAI,UAAU;GAEZ,IAAI,cAAc;GAClB,IAAI,aAAa;EACnB;EAEA,OAAO;CACT;CAEA,MAAc,uBACZ,MACA,cACA,aACA,gBACA,UACwB;;EAExB,IAAI,CAAC,OAAO,EAAE,kCAAkC;GAC9C,OAAO,KAAK,MAAM,6CAA6C;GAC/D,OAAO;EACT;EACA,MAAM,WAAW,MAAM,eAAe,OAAO;EAC7C,MAAM,YAAY,MAAM,KACtB,UACA,GAAG,YAAY,GAAG,eAAe,OACnC;EACA,MAAM,mBAAmB,MAAM,KAC7B,UACA,GAAG,YAAY,GAAG,gBACpB;EACA,MAAM,aAAa,KAAK,OAAO,QAAQ;EACvC,IAAI;GAEF,MAAME,SAAY,YADED,uBAA0B,SAChB,CAAW;GAEzC,IADgB,OAAO,SACrB,EAAE,aAAa,gBAAgB;GAKjC,OAAO,IAHY,YACjB,MAAME,cAFW,MAAM,KAAK,kBAAkB,GAAG,YAAY,QAEtC,GAAY,MAAM,CAE/B,EAAE,cAAc,yBAAyB,KAAK;EAC5D,UAAU;GACR,MAAMC,QAAW,SAAS;GAC1B,MAAMA,QAAW,gBAAgB;EACnC;CACF;CAEA,sBACE,MACA,aACA,aACA,gBACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,WAAW;GACtB,KAAK,cAAc,YAAY,GAAG;GAClC,YAAY;EACd,SAEE,KAAK,uBACH,MACA,aACA,aACA,gBACA,QACF,CACJ;CACF;CAEA,sBAAsB,aAA6B;EACjD,OAAO,iBAAiB,YAAY;CACtC;AACF"}
|
|
@@ -7,7 +7,7 @@ import { withCache } from "../../../util/cache/package/with-cache.js";
|
|
|
7
7
|
import { map } from "../../../util/promises.js";
|
|
8
8
|
import { TerraformDatasource } from "../terraform-module/base.js";
|
|
9
9
|
import { createSDBackendURL } from "../terraform-module/utils.js";
|
|
10
|
-
import { OpenTofuProviderDocsResponse, TerraformProviderV2Response } from "./schema.js";
|
|
10
|
+
import { OpenTofuProviderDocsResponse, TerraformProviderReleaseBackend, TerraformProviderV2Response, TerraformProviderVersions, TerraformRegistryBuildResponse, TerraformRegistryVersions, VersionDetailResponse } from "./schema.js";
|
|
11
11
|
//#region lib/modules/datasource/terraform-provider/index.ts
|
|
12
12
|
var TerraformProviderDatasource = class TerraformProviderDatasource extends TerraformDatasource {
|
|
13
13
|
static id = "terraform-provider";
|
|
@@ -82,12 +82,12 @@ var TerraformProviderDatasource = class TerraformProviderDatasource extends Terr
|
|
|
82
82
|
async queryProviderRegistry(registryUrl, packageName) {
|
|
83
83
|
const repository = TerraformProviderDatasource.getRepository({ packageName });
|
|
84
84
|
const backendURL = createSDBackendURL(registryUrl, "providers.v1", await this.getTerraformServiceDiscoveryResult(registryUrl), `${repository}/versions`);
|
|
85
|
-
return { releases: (await this.http.
|
|
85
|
+
return { releases: (await this.http.getJson(backendURL, TerraformProviderVersions)).body.versions.map(({ version }) => ({ version })) };
|
|
86
86
|
}
|
|
87
87
|
async queryReleaseBackend(packageName, registryURL) {
|
|
88
88
|
const backendLookUpName = `terraform-provider-${packageName.replace("hashicorp/", "")}`;
|
|
89
89
|
const backendURL = joinUrlParts(registryURL, backendLookUpName, `index.json`);
|
|
90
|
-
const res = (await this.http.
|
|
90
|
+
const res = (await this.http.getJson(backendURL, TerraformProviderReleaseBackend)).body;
|
|
91
91
|
return {
|
|
92
92
|
releases: Object.keys(res.versions).map((version) => ({ version })),
|
|
93
93
|
sourceUrl: joinUrlParts("https://github.com/terraform-providers", backendLookUpName)
|
|
@@ -115,14 +115,14 @@ var TerraformProviderDatasource = class TerraformProviderDatasource extends Terr
|
|
|
115
115
|
const serviceDiscovery = await this.getTerraformServiceDiscoveryResult(registryURL);
|
|
116
116
|
if (!serviceDiscovery) throw new ExternalHostError(/* @__PURE__ */ new Error(`Service discovery not found for ${registryURL}`));
|
|
117
117
|
const backendURL = createSDBackendURL(registryURL, "providers.v1", serviceDiscovery, repository);
|
|
118
|
-
const versionsResponse = (await this.http.
|
|
118
|
+
const versionsResponse = (await this.http.getJson(`${backendURL}/versions`, TerraformRegistryVersions)).body;
|
|
119
119
|
if (!versionsResponse.versions) throw new ExternalHostError(/* @__PURE__ */ new Error(`Failed to retrieve version list for ${backendURL}`));
|
|
120
120
|
const builds = versionsResponse.versions.find((value) => value.version === version);
|
|
121
121
|
if (!builds) throw new ExternalHostError(/* @__PURE__ */ new Error(`No builds found for ${repository}:${version} on ${registryURL}`));
|
|
122
122
|
return await map(builds.platforms, async (platform) => {
|
|
123
123
|
const buildURL = `${backendURL}/${version}/download/${platform.os}/${platform.arch}`;
|
|
124
124
|
try {
|
|
125
|
-
const res = (await this.http.
|
|
125
|
+
const res = (await this.http.getJson(buildURL, TerraformRegistryBuildResponse)).body;
|
|
126
126
|
return {
|
|
127
127
|
name: repository,
|
|
128
128
|
url: res.download_url,
|
|
@@ -168,7 +168,7 @@ var TerraformProviderDatasource = class TerraformProviderDatasource extends Terr
|
|
|
168
168
|
}, () => this._getZipHashes(zipHashUrl));
|
|
169
169
|
}
|
|
170
170
|
async _getReleaseBackendIndex(backendLookUpName, version) {
|
|
171
|
-
return (await this.http.
|
|
171
|
+
return (await this.http.getJson(`${TerraformProviderDatasource.hashicorpReleaseUrl}/${backendLookUpName}/${version}/index.json`, VersionDetailResponse)).body;
|
|
172
172
|
}
|
|
173
173
|
getReleaseBackendIndex(backendLookUpName, version) {
|
|
174
174
|
return withCache({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["hashicorpVersioning.id","p.map"],"sources":["../../../../lib/modules/datasource/terraform-provider/index.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { getQueryString, joinUrlParts } from '../../../util/url.ts';\nimport * as hashicorpVersioning from '../../versioning/hashicorp/index.ts';\nimport { TerraformDatasource } from '../terraform-module/base.ts';\nimport { createSDBackendURL } from '../terraform-module/utils.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n OpenTofuProviderDocsResponse,\n TerraformProviderV2Response,\n} from './schema.ts';\nimport type {\n TerraformBuild,\n TerraformProviderReleaseBackend,\n TerraformProviderVersions,\n TerraformRegistryBuildResponse,\n TerraformRegistryVersions,\n VersionDetailResponse,\n} from './types.ts';\n\nexport class TerraformProviderDatasource extends TerraformDatasource {\n static override readonly id = 'terraform-provider';\n\n static readonly hashicorpReleaseUrl = 'https://releases.hashicorp.com';\n\n static readonly defaultRegistryUrls = [\n TerraformProviderDatasource.terraformRegistryUrl,\n TerraformProviderDatasource.hashicorpReleaseUrl,\n ];\n\n static repositoryRegex = regEx(/^hashicorp\\/(?<packageName>\\S+)$/);\n\n constructor() {\n super(TerraformProviderDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n TerraformProviderDatasource.defaultRegistryUrls;\n\n override readonly defaultVersioning = hashicorpVersioning.id;\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is only available for `registry.terraform.io` (v2 API) and `registry.opentofu.org` (via `api.opentofu.org`). Other registries using the Provider Registry Protocol do not provide timestamps.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'For `registry.terraform.io`, the source URL is taken from the `source` field of the v2 API response. For `registry.opentofu.org`, it is derived from the package name following the OpenTofu registry policy of `github.com/NAMESPACE/terraform-provider-NAME`.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n logger.trace(\n `terraform-provider.getDependencies() packageName: ${packageName}`,\n );\n\n if (registryUrl === TerraformProviderDatasource.terraformRegistryUrl) {\n return await this.queryTerraformRegistryV2(registryUrl, packageName);\n }\n if (\n registryUrl === TerraformProviderDatasource.openTofuRegistryUrl ||\n registryUrl === TerraformProviderDatasource.openTofuApiUrl\n ) {\n return await this.queryOpenTofuRegistry(packageName);\n }\n if (registryUrl === TerraformProviderDatasource.hashicorpReleaseUrl) {\n return await this.queryReleaseBackend(packageName, registryUrl);\n }\n\n // Fall back to the standard Provider Registry Protocol for other registries.\n return await this.queryProviderRegistry(registryUrl, packageName);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = config.registryUrl;\n const repo = TerraformProviderDatasource.getRepository(config);\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleases:${url}/${repo}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private static getRepository({ packageName }: GetReleasesConfig): string {\n return packageName.includes('/') ? packageName : `hashicorp/${packageName}`;\n }\n\n /**\n * Query the Terraform Registry using the undocumented v2 JSON:API.\n *\n * Returns release timestamps for all versions, unlike the v1 API\n * which only exposed the timestamp for the latest version.\n */\n private async queryTerraformRegistryV2(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const providerUrl = `${joinUrlParts(\n registryUrl,\n 'v2/providers',\n repository,\n )}?${getQueryString({ include: 'provider-versions' })}`;\n const { body: res } = await this.http.getJson(\n providerUrl,\n TerraformProviderV2Response,\n );\n res.homepage = `${registryUrl}/providers/${repository}`;\n return res;\n }\n\n /**\n * Query the OpenTofu registry docs API.\n * https://api.opentofu.org/\n *\n * Used when the registry URL is `registry.opentofu.org`.\n * Queries `api.opentofu.org` for provider versions with release timestamps.\n */\n private async queryOpenTofuRegistry(\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const docsUrl = joinUrlParts(\n TerraformProviderDatasource.openTofuApiUrl,\n 'registry/docs/providers',\n repository,\n 'index.json',\n );\n const { body: res } = await this.http.getJson(\n docsUrl,\n OpenTofuProviderDocsResponse,\n );\n res.homepage = `https://search.opentofu.org/provider/${repository}`;\n\n // The OpenTofu registry only indexes providers hosted on GitHub under the\n // `NAMESPACE/terraform-provider-NAME` repository naming convention, so the\n // source URL can be derived deterministically from the package name.\n // https://github.com/opentofu/registry/blob/main/PROCEDURES.md\n const [namespace, name] = repository.split('/');\n res.sourceUrl = `https://github.com/${namespace}/terraform-provider-${name}`;\n\n return res;\n }\n\n /**\n * Query a registry using the Provider Registry Protocol that all registries\n * are required to implement.\n * https://www.terraform.io/internals/provider-registry-protocol\n */\n private async queryProviderRegistry(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n const backendURL = createSDBackendURL(\n registryUrl,\n 'providers.v1',\n serviceDiscovery,\n `${repository}/versions`,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProviderVersions>(backendURL)\n ).body;\n const dep: ReleaseResult = {\n releases: res.versions.map(({ version }) => ({\n version,\n })),\n };\n return dep;\n }\n\n private async queryReleaseBackend(\n packageName: string,\n registryURL: string,\n ): Promise<ReleaseResult | null> {\n const hashicorpPackage = packageName.replace('hashicorp/', '');\n const backendLookUpName = `terraform-provider-${hashicorpPackage}`;\n const backendURL = joinUrlParts(\n registryURL,\n backendLookUpName,\n `index.json`,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProviderReleaseBackend>(\n backendURL,\n )\n ).body;\n\n const dep: ReleaseResult = {\n releases: Object.keys(res.versions).map((version) => ({\n version,\n })),\n sourceUrl: joinUrlParts(\n 'https://github.com/terraform-providers',\n backendLookUpName,\n ),\n };\n return dep;\n }\n\n private async _getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n if (registryURL === TerraformProviderDatasource.hashicorpReleaseUrl) {\n // check if registryURL === secondary backend\n const repositoryRegexResult =\n TerraformProviderDatasource.repositoryRegex.exec(repository)?.groups;\n if (!repositoryRegexResult) {\n // non hashicorp builds are not supported with releases.hashicorp.com\n return null;\n }\n const packageName = repositoryRegexResult.packageName;\n const backendLookUpName = `terraform-provider-${packageName}`;\n let versionReleaseBackend: VersionDetailResponse;\n try {\n versionReleaseBackend = await this.getReleaseBackendIndex(\n backendLookUpName,\n version,\n );\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, backendLookUpName, version },\n `Failed to retrieve builds for ${backendLookUpName} ${version}`,\n );\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n return versionReleaseBackend.builds;\n }\n\n // check public or private Terraform registry\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryURL);\n if (!serviceDiscovery) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Service discovery not found for ${registryURL}`),\n );\n }\n const backendURL = createSDBackendURL(\n registryURL,\n 'providers.v1',\n serviceDiscovery,\n repository,\n );\n const versionsResponse = (\n await this.http.getJsonUnchecked<TerraformRegistryVersions>(\n `${backendURL}/versions`,\n )\n ).body;\n if (!versionsResponse.versions) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Failed to retrieve version list for ${backendURL}`),\n );\n }\n const builds = versionsResponse.versions.find(\n (value) => value.version === version,\n );\n if (!builds) {\n // should never happen, but just in case\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(\n `No builds found for ${repository}:${version} on ${registryURL}`,\n ),\n );\n }\n const result = await p.map(\n builds.platforms,\n async (platform) => {\n const buildURL = `${backendURL}/${version}/download/${platform.os}/${platform.arch}`;\n try {\n const res = (\n await this.http.getJsonUnchecked<TerraformRegistryBuildResponse>(\n buildURL,\n )\n ).body;\n const newBuild: TerraformBuild = {\n name: repository,\n url: res.download_url,\n version,\n ...res,\n };\n return newBuild;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug({ err, url: buildURL }, 'Failed to retrieve build');\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n },\n { concurrency: 4 },\n );\n\n return result;\n }\n\n getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getBuilds:${registryURL}/${repository}/${version}`,\n },\n () => this._getBuilds(registryURL, repository, version),\n );\n }\n\n private async _getZipHashes(\n zipHashUrl: string,\n ): Promise<string[] | undefined> {\n // The hashes are formatted as the result of sha256sum in plain text, each line: <hash>\\t<filename>\n let rawHashData: string;\n try {\n rawHashData = (await this.http.getText(zipHashUrl)).body;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, zipHashUrl },\n `Failed to retrieve zip hashes from ${zipHashUrl}`,\n );\n return undefined;\n }\n\n return rawHashData\n .trimEnd()\n .split('\\n')\n .map((line) => line.split(/\\s/)[0]);\n }\n\n getZipHashes(zipHashUrl: string): Promise<string[] | undefined> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getZipHashes:${zipHashUrl}`,\n },\n () => this._getZipHashes(zipHashUrl),\n );\n }\n\n private async _getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return (\n await this.http.getJsonUnchecked<VersionDetailResponse>(\n `${TerraformProviderDatasource.hashicorpReleaseUrl}/${backendLookUpName}/${version}/index.json`,\n )\n ).body;\n }\n\n getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleaseBackendIndex:${backendLookUpName}/${version}`,\n },\n () => this._getReleaseBackendIndex(backendLookUpName, version),\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["hashicorpVersioning.id","p.map"],"sources":["../../../../lib/modules/datasource/terraform-provider/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { getQueryString, joinUrlParts } from '../../../util/url.ts';\nimport * as hashicorpVersioning from '../../versioning/hashicorp/index.ts';\nimport { TerraformDatasource } from '../terraform-module/base.ts';\nimport { createSDBackendURL } from '../terraform-module/utils.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n OpenTofuProviderDocsResponse,\n type TerraformBuild,\n TerraformProviderReleaseBackend,\n TerraformProviderV2Response,\n TerraformProviderVersions,\n TerraformRegistryBuildResponse,\n TerraformRegistryVersions,\n VersionDetailResponse,\n} from './schema.ts';\n\nexport class TerraformProviderDatasource extends TerraformDatasource {\n static override readonly id = 'terraform-provider';\n\n static readonly hashicorpReleaseUrl = 'https://releases.hashicorp.com';\n\n static readonly defaultRegistryUrls = [\n TerraformProviderDatasource.terraformRegistryUrl,\n TerraformProviderDatasource.hashicorpReleaseUrl,\n ];\n\n static repositoryRegex = regEx(/^hashicorp\\/(?<packageName>\\S+)$/);\n\n constructor() {\n super(TerraformProviderDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n TerraformProviderDatasource.defaultRegistryUrls;\n\n override readonly defaultVersioning = hashicorpVersioning.id;\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is only available for `registry.terraform.io` (v2 API) and `registry.opentofu.org` (via `api.opentofu.org`). Other registries using the Provider Registry Protocol do not provide timestamps.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'For `registry.terraform.io`, the source URL is taken from the `source` field of the v2 API response. For `registry.opentofu.org`, it is derived from the package name following the OpenTofu registry policy of `github.com/NAMESPACE/terraform-provider-NAME`.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n logger.trace(\n `terraform-provider.getDependencies() packageName: ${packageName}`,\n );\n\n if (registryUrl === TerraformProviderDatasource.terraformRegistryUrl) {\n return await this.queryTerraformRegistryV2(registryUrl, packageName);\n }\n if (\n registryUrl === TerraformProviderDatasource.openTofuRegistryUrl ||\n registryUrl === TerraformProviderDatasource.openTofuApiUrl\n ) {\n return await this.queryOpenTofuRegistry(packageName);\n }\n if (registryUrl === TerraformProviderDatasource.hashicorpReleaseUrl) {\n return await this.queryReleaseBackend(packageName, registryUrl);\n }\n\n // Fall back to the standard Provider Registry Protocol for other registries.\n return await this.queryProviderRegistry(registryUrl, packageName);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = config.registryUrl;\n const repo = TerraformProviderDatasource.getRepository(config);\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleases:${url}/${repo}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private static getRepository({ packageName }: GetReleasesConfig): string {\n return packageName.includes('/') ? packageName : `hashicorp/${packageName}`;\n }\n\n /**\n * Query the Terraform Registry using the undocumented v2 JSON:API.\n *\n * Returns release timestamps for all versions, unlike the v1 API\n * which only exposed the timestamp for the latest version.\n */\n private async queryTerraformRegistryV2(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const providerUrl = `${joinUrlParts(\n registryUrl,\n 'v2/providers',\n repository,\n )}?${getQueryString({ include: 'provider-versions' })}`;\n const { body: res } = await this.http.getJson(\n providerUrl,\n TerraformProviderV2Response,\n );\n res.homepage = `${registryUrl}/providers/${repository}`;\n return res;\n }\n\n /**\n * Query the OpenTofu registry docs API.\n * https://api.opentofu.org/\n *\n * Used when the registry URL is `registry.opentofu.org`.\n * Queries `api.opentofu.org` for provider versions with release timestamps.\n */\n private async queryOpenTofuRegistry(\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const docsUrl = joinUrlParts(\n TerraformProviderDatasource.openTofuApiUrl,\n 'registry/docs/providers',\n repository,\n 'index.json',\n );\n const { body: res } = await this.http.getJson(\n docsUrl,\n OpenTofuProviderDocsResponse,\n );\n res.homepage = `https://search.opentofu.org/provider/${repository}`;\n\n // The OpenTofu registry only indexes providers hosted on GitHub under the\n // `NAMESPACE/terraform-provider-NAME` repository naming convention, so the\n // source URL can be derived deterministically from the package name.\n // https://github.com/opentofu/registry/blob/main/PROCEDURES.md\n const [namespace, name] = repository.split('/');\n res.sourceUrl = `https://github.com/${namespace}/terraform-provider-${name}`;\n\n return res;\n }\n\n /**\n * Query a registry using the Provider Registry Protocol that all registries\n * are required to implement.\n * https://www.terraform.io/internals/provider-registry-protocol\n */\n private async queryProviderRegistry(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n const backendURL = createSDBackendURL(\n registryUrl,\n 'providers.v1',\n serviceDiscovery,\n `${repository}/versions`,\n );\n const res = (await this.http.getJson(backendURL, TerraformProviderVersions))\n .body;\n const dep: ReleaseResult = {\n releases: res.versions.map(({ version }) => ({\n version,\n })),\n };\n return dep;\n }\n\n private async queryReleaseBackend(\n packageName: string,\n registryURL: string,\n ): Promise<ReleaseResult | null> {\n const hashicorpPackage = packageName.replace('hashicorp/', '');\n const backendLookUpName = `terraform-provider-${hashicorpPackage}`;\n const backendURL = joinUrlParts(\n registryURL,\n backendLookUpName,\n `index.json`,\n );\n const res = (\n await this.http.getJson(backendURL, TerraformProviderReleaseBackend)\n ).body;\n\n const dep: ReleaseResult = {\n releases: Object.keys(res.versions).map((version) => ({\n version,\n })),\n sourceUrl: joinUrlParts(\n 'https://github.com/terraform-providers',\n backendLookUpName,\n ),\n };\n return dep;\n }\n\n private async _getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n if (registryURL === TerraformProviderDatasource.hashicorpReleaseUrl) {\n // check if registryURL === secondary backend\n const repositoryRegexResult =\n TerraformProviderDatasource.repositoryRegex.exec(repository)?.groups;\n if (!repositoryRegexResult) {\n // non hashicorp builds are not supported with releases.hashicorp.com\n return null;\n }\n const packageName = repositoryRegexResult.packageName;\n const backendLookUpName = `terraform-provider-${packageName}`;\n let versionReleaseBackend: VersionDetailResponse;\n try {\n versionReleaseBackend = await this.getReleaseBackendIndex(\n backendLookUpName,\n version,\n );\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, backendLookUpName, version },\n `Failed to retrieve builds for ${backendLookUpName} ${version}`,\n );\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n return versionReleaseBackend.builds;\n }\n\n // check public or private Terraform registry\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryURL);\n if (!serviceDiscovery) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Service discovery not found for ${registryURL}`),\n );\n }\n const backendURL = createSDBackendURL(\n registryURL,\n 'providers.v1',\n serviceDiscovery,\n repository,\n );\n const versionsResponse = (\n await this.http.getJson(\n `${backendURL}/versions`,\n TerraformRegistryVersions,\n )\n ).body;\n if (!versionsResponse.versions) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Failed to retrieve version list for ${backendURL}`),\n );\n }\n const builds = versionsResponse.versions.find(\n (value) => value.version === version,\n );\n if (!builds) {\n // should never happen, but just in case\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(\n `No builds found for ${repository}:${version} on ${registryURL}`,\n ),\n );\n }\n const result = await p.map(\n builds.platforms,\n async (platform) => {\n const buildURL = `${backendURL}/${version}/download/${platform.os}/${platform.arch}`;\n try {\n const res = (\n await this.http.getJson(buildURL, TerraformRegistryBuildResponse)\n ).body;\n const newBuild: TerraformBuild = {\n name: repository,\n url: res.download_url,\n version,\n ...res,\n };\n return newBuild;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug({ err, url: buildURL }, 'Failed to retrieve build');\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n },\n { concurrency: 4 },\n );\n\n return result;\n }\n\n getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getBuilds:${registryURL}/${repository}/${version}`,\n },\n () => this._getBuilds(registryURL, repository, version),\n );\n }\n\n private async _getZipHashes(\n zipHashUrl: string,\n ): Promise<string[] | undefined> {\n // The hashes are formatted as the result of sha256sum in plain text, each line: <hash>\\t<filename>\n let rawHashData: string;\n try {\n rawHashData = (await this.http.getText(zipHashUrl)).body;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, zipHashUrl },\n `Failed to retrieve zip hashes from ${zipHashUrl}`,\n );\n return undefined;\n }\n\n return rawHashData\n .trimEnd()\n .split('\\n')\n .map((line) => line.split(/\\s/)[0]);\n }\n\n getZipHashes(zipHashUrl: string): Promise<string[] | undefined> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getZipHashes:${zipHashUrl}`,\n },\n () => this._getZipHashes(zipHashUrl),\n );\n }\n\n private async _getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return (\n await this.http.getJson(\n `${TerraformProviderDatasource.hashicorpReleaseUrl}/${backendLookUpName}/${version}/index.json`,\n VersionDetailResponse,\n )\n ).body;\n }\n\n getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleaseBackendIndex:${backendLookUpName}/${version}`,\n },\n () => this._getReleaseBackendIndex(backendLookUpName, version),\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -29,7 +29,43 @@ const OpenTofuProviderVersion = z.object({
|
|
|
29
29
|
releaseTimestamp: version.published
|
|
30
30
|
}));
|
|
31
31
|
const OpenTofuProviderDocsResponse = z.object({ versions: LooseArray(OpenTofuProviderVersion).catch([]) }).transform((response) => ({ releases: response.versions }));
|
|
32
|
+
const TerraformBuild = z.object({
|
|
33
|
+
name: z.string(),
|
|
34
|
+
version: z.string(),
|
|
35
|
+
os: z.string(),
|
|
36
|
+
arch: z.string(),
|
|
37
|
+
filename: z.string(),
|
|
38
|
+
url: z.string(),
|
|
39
|
+
shasums_url: z.string().optional()
|
|
40
|
+
});
|
|
41
|
+
const VersionDetailResponse = z.object({
|
|
42
|
+
name: z.string().optional(),
|
|
43
|
+
version: z.string().optional(),
|
|
44
|
+
builds: z.array(TerraformBuild)
|
|
45
|
+
});
|
|
46
|
+
const TerraformProviderReleaseBackend = z.object({
|
|
47
|
+
name: z.string().optional(),
|
|
48
|
+
versions: z.record(z.string(), VersionDetailResponse)
|
|
49
|
+
});
|
|
50
|
+
const TerraformProviderVersionsVersion = z.object({ version: z.string() });
|
|
51
|
+
const TerraformProviderVersions = z.object({ versions: LooseArray(TerraformProviderVersionsVersion) });
|
|
52
|
+
const TerraformRegistryPlatform = z.object({
|
|
53
|
+
os: z.string(),
|
|
54
|
+
arch: z.string()
|
|
55
|
+
});
|
|
56
|
+
const TerraformRegistryVersionItem = z.object({
|
|
57
|
+
version: z.string(),
|
|
58
|
+
platforms: LooseArray(TerraformRegistryPlatform)
|
|
59
|
+
});
|
|
60
|
+
const TerraformRegistryVersions = z.object({ versions: LooseArray(TerraformRegistryVersionItem).optional() });
|
|
61
|
+
const TerraformRegistryBuildResponse = z.object({
|
|
62
|
+
os: z.string(),
|
|
63
|
+
arch: z.string(),
|
|
64
|
+
filename: z.string(),
|
|
65
|
+
download_url: z.string(),
|
|
66
|
+
shasums_url: z.string().optional()
|
|
67
|
+
});
|
|
32
68
|
//#endregion
|
|
33
|
-
export { OpenTofuProviderDocsResponse, TerraformProviderV2Response };
|
|
69
|
+
export { OpenTofuProviderDocsResponse, TerraformProviderReleaseBackend, TerraformProviderV2Response, TerraformProviderVersions, TerraformRegistryBuildResponse, TerraformRegistryVersions, VersionDetailResponse };
|
|
34
70
|
|
|
35
71
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/terraform-provider/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { regEx } from '../../../util/regex.ts';\nimport { LooseArray } from '../../../util/schema-utils/index.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(\n (resource): Release => ({\n version: resource.attributes.version,\n releaseTimestamp: resource.attributes['published-at'],\n }),\n );\n\nexport const TerraformProviderV2Response = z\n .object({\n data: z.object({\n attributes: ProviderAttributes,\n }),\n included: LooseArray(ProviderVersion).catch([]),\n })\n .transform(\n (response): ReleaseResult => ({\n sourceUrl: response.data.attributes.source,\n releases: response.included,\n }),\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(\n (version): Release => ({\n version: version.id.replace(regEx(/^v/), ''),\n releaseTimestamp: version.published,\n }),\n );\n\nexport const OpenTofuProviderDocsResponse = z\n .object({\n versions: LooseArray(OpenTofuProviderVersion).catch([]),\n })\n .transform(\n (response): ReleaseResult => ({\n releases: response.versions,\n }),\n );\n\nexport type OpenTofuProviderDocsResponse = z.infer<\n typeof OpenTofuProviderDocsResponse\n>;\n"],"mappings":";;;;;AAMA,MAAM,qBAAqB,EAAE,OAAO,EAClC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAC9B,CAAC;AAED,MAAM,kBAAkB,EACrB,OAAO;CACN,MAAM,EAAE,QAAQ,mBAAmB;CACnC,YAAY,EAAE,OAAO;EACnB,SAAS,EAAE,OAAO;EAClB,gBAAgB;CAClB,CAAC;AACH,CAAC,EACA,WACE,cAAuB;CACtB,SAAS,SAAS,WAAW;CAC7B,kBAAkB,SAAS,WAAW;AACxC,EACF;AAEF,MAAa,8BAA8B,EACxC,OAAO;CACN,MAAM,EAAE,OAAO,EACb,YAAY,mBACd,CAAC;CACD,UAAU,WAAW,eAAe,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC,EACA,WACE,cAA6B;CAC5B,WAAW,SAAS,KAAK,WAAW;CACpC,UAAU,SAAS;AACrB,EACF;AAMF,MAAM,0BAA0B,EAC7B,OAAO;CACN,IAAI,EAAE,OAAO;CACb,WAAW;AACb,CAAC,EACA,WACE,aAAsB;CACrB,SAAS,QAAQ,GAAG,QAAQ,MAAM,IAAI,GAAG,EAAE;CAC3C,kBAAkB,QAAQ;AAC5B,EACF;AAEF,MAAa,+BAA+B,EACzC,OAAO,EACN,UAAU,WAAW,uBAAuB,EAAE,MAAM,CAAC,CAAC,EACxD,CAAC,EACA,WACE,cAA6B,EAC5B,UAAU,SAAS,SACrB,EACF"}
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/terraform-provider/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { regEx } from '../../../util/regex.ts';\nimport { LooseArray } from '../../../util/schema-utils/index.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(\n (resource): Release => ({\n version: resource.attributes.version,\n releaseTimestamp: resource.attributes['published-at'],\n }),\n );\n\nexport const TerraformProviderV2Response = z\n .object({\n data: z.object({\n attributes: ProviderAttributes,\n }),\n included: LooseArray(ProviderVersion).catch([]),\n })\n .transform(\n (response): ReleaseResult => ({\n sourceUrl: response.data.attributes.source,\n releases: response.included,\n }),\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(\n (version): Release => ({\n version: version.id.replace(regEx(/^v/), ''),\n releaseTimestamp: version.published,\n }),\n );\n\nexport const OpenTofuProviderDocsResponse = z\n .object({\n versions: LooseArray(OpenTofuProviderVersion).catch([]),\n })\n .transform(\n (response): ReleaseResult => ({\n releases: response.versions,\n }),\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"],"mappings":";;;;;AAMA,MAAM,qBAAqB,EAAE,OAAO,EAClC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAC9B,CAAC;AAED,MAAM,kBAAkB,EACrB,OAAO;CACN,MAAM,EAAE,QAAQ,mBAAmB;CACnC,YAAY,EAAE,OAAO;EACnB,SAAS,EAAE,OAAO;EAClB,gBAAgB;CAClB,CAAC;AACH,CAAC,EACA,WACE,cAAuB;CACtB,SAAS,SAAS,WAAW;CAC7B,kBAAkB,SAAS,WAAW;AACxC,EACF;AAEF,MAAa,8BAA8B,EACxC,OAAO;CACN,MAAM,EAAE,OAAO,EACb,YAAY,mBACd,CAAC;CACD,UAAU,WAAW,eAAe,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC,EACA,WACE,cAA6B;CAC5B,WAAW,SAAS,KAAK,WAAW;CACpC,UAAU,SAAS;AACrB,EACF;AAMF,MAAM,0BAA0B,EAC7B,OAAO;CACN,IAAI,EAAE,OAAO;CACb,WAAW;AACb,CAAC,EACA,WACE,aAAsB;CACrB,SAAS,QAAQ,GAAG,QAAQ,MAAM,IAAI,GAAG,EAAE;CAC3C,kBAAkB,QAAQ;AAC5B,EACF;AAEF,MAAa,+BAA+B,EACzC,OAAO,EACN,UAAU,WAAW,uBAAuB,EAAE,MAAM,CAAC,CAAC,EACxD,CAAC,EACA,WACE,cAA6B,EAC5B,UAAU,SAAS,SACrB,EACF;AAOF,MAAa,iBAAiB,EAAE,OAAO;CACrC,MAAM,EAAE,OAAO;CACf,SAAS,EAAE,OAAO;CAClB,IAAI,EAAE,OAAO;CACb,MAAM,EAAE,OAAO;CACf,UAAU,EAAE,OAAO;CACnB,KAAK,EAAE,OAAO;CACd,aAAa,EAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAID,MAAa,wBAAwB,EAAE,OAAO;CAC5C,MAAM,EAAE,OAAO,EAAE,SAAS;CAC1B,SAAS,EAAE,OAAO,EAAE,SAAS;CAC7B,QAAQ,EAAE,MAAM,cAAc;AAChC,CAAC;AAKD,MAAa,kCAAkC,EAAE,OAAO;CACtD,MAAM,EAAE,OAAO,EAAE,SAAS;CAC1B,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,qBAAqB;AACtD,CAAC;AAOD,MAAM,mCAAmC,EAAE,OAAO,EAChD,SAAS,EAAE,OAAO,EACpB,CAAC;AAED,MAAa,4BAA4B,EAAE,OAAO,EAChD,UAAU,WAAW,gCAAgC,EACvD,CAAC;AAOD,MAAM,4BAA4B,EAAE,OAAO;CACzC,IAAI,EAAE,OAAO;CACb,MAAM,EAAE,OAAO;AACjB,CAAC;AAED,MAAM,+BAA+B,EAAE,OAAO;CAC5C,SAAS,EAAE,OAAO;CAClB,WAAW,WAAW,yBAAyB;AACjD,CAAC;AAED,MAAa,4BAA4B,EAAE,OAAO,EAChD,UAAU,WAAW,4BAA4B,EAAE,SAAS,EAC9D,CAAC;AAOD,MAAa,iCAAiC,EAAE,OAAO;CACrD,IAAI,EAAE,OAAO;CACb,MAAM,EAAE,OAAO;CACf,UAAU,EAAE,OAAO;CACnB,cAAc,EAAE,OAAO;CACvB,aAAa,EAAE,OAAO,EAAE,SAAS;AACnC,CAAC"}
|
|
@@ -74,7 +74,7 @@ hashMap.set("mise", "d39d941e81e44ea6c3f78ced7869645a874949fefcd2fd2ba5b8091156b
|
|
|
74
74
|
hashMap.set("mix", "a82c3d73372c2da723b467c29f0ad0bb1f85acb8cfb313a0aa734cc7ec2d46bf");
|
|
75
75
|
hashMap.set("nix", "95f0827f7ec9a3bfd5119534f129aad6cf26b28e99d55aec0945f08bbfff9fb1");
|
|
76
76
|
hashMap.set("nodenv", "ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8");
|
|
77
|
-
hashMap.set("npm", "
|
|
77
|
+
hashMap.set("npm", "5c4dfaf08548824a9d97ef3d3513b0bd7e0917f19a9c43d7edb6311493f1609f");
|
|
78
78
|
hashMap.set("nuget", "da72ddc95788d80b81c0b539b1b54001ef0c782f790efdc6e73aafb235d1e5f8");
|
|
79
79
|
hashMap.set("nvm", "3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322");
|
|
80
80
|
hashMap.set("ocb", "032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1fbc76f78daa14a8c9ab1142e9d1e05c746c0419a9f1455e4279f476590d0c04');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','a599d9834f33a92e7c25753f933621f0b1b076ba8a068628a3f64e1dc545b739');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','fad98996bea8626525ab925f83a6ae0ce9262c53770e7aa7cb448a1e0f1ddf21');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c6e0ad88ea468664c3a33263baf7452d83d2d37ff09ba920e18f64ee81fd0acb');\nhashMap.set('bazel-module','49631e6572d4cf53b82d839ebae923b7e52be6fcacd28c5e99476497e3d0ec38');\nhashMap.set('bazelisk','49e6bd1fc8f03facd06e517dc64596833b90ee0a079a45cff78f0eeb3c3566f8');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','2df1756b14b3d690e5ad1295bc1e78d8a8d7b967a552fd7b8e3274866a5acf3e');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','cf7b07339eec46097c479fc5d9aa1c699d74b11954aea156eef7b893251b070d');\nhashMap.set('cake','65ad4f28c318675b9edb49dbd11d677f42c762b01b3f5a25dd3b2f345ecd387e');\nhashMap.set('cargo','23fcc425ccd3a50559210e0ab8c84c1d47cf5c617cd5d58afdcf258ab862bafa');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','08310c39254947632d42058f74f755e9d3f3019c2edeeaf52b5142917085e2df');\nhashMap.set('composer','e7d1bf044d838d1a294929a1fa730d80f159252405652cf87793c34a009aa02a');\nhashMap.set('conan','b846e8812d65d4201dc0bf7c1d5c344e3a1edaaff6441010875171028be2f0fb');\nhashMap.set('copier','b26904512023c7785e86ee57744f16b336a380ae80d2b85924bf7c30e3c6f1c5');\nhashMap.set('cpanfile','6a1d67d9c8751123deaf0c7f3ac38a07024e960c140f8228fcbcb93954fdca01');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','2d79ef509b7249a318e94e5dacd8e13a945f2b44007b9a17438a2c915b596120');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','ac472ae4897dc1df85326dbd89a8c3488579ae2b180014ffcf085ce422e19dbd');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','322b95f7e55dd78d7fe71306a6f649479eca61c60d75bb10b23604a230dbdd08');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','7cbca9a0e639dbfac830f05f8713f05435fedcda8ce8e9ff46a5dee16d64a438');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','475d08a1a75e5732dd6003f63bd98c91ce09e42229cdcd9d2d060c60ce474e49');\nhashMap.set('github-actions','30479622f3138996116d419485423d5a64843ae49ed50c5cd5e1e6d4e122944f');\nhashMap.set('gitlabci','0dec44dd398bfc5b3c19d0929bea2fef7f386c94acfd1b1d7bc2a31d81d96fd6');\nhashMap.set('gitlabci-include','354cfc4ea327c6d5cd5bee1f17763832efc7f5402e9fd22c579239fccb9c6dab');\nhashMap.set('glasskube','253d6db30bdec75ed5ab5d26f31d69bc07813ba10089a28da12c6a29eff4ec70');\nhashMap.set('gleam','e7ee3392d1f900fc1299308c8e930db9288790c6d0b6c35f1a62e55683090d34');\nhashMap.set('gomod','f675e8c7bf83c00101d9725814927c69d04e5e347dc6b0346a7100892b1ea4c9');\nhashMap.set('gradle','1108234b4fcfebf95c453111f652ab75f5c6cc6c4472efb60b7bc29cbe683612');\nhashMap.set('gradle-wrapper','f85031e7feb4e811aa5f29c589a30f8076a078e5bbf366fb65fb28b5a47d2c44');\nhashMap.set('haskell-cabal','a4f01c22bdd453dd4610473d92946f7764ceb27624547325f5e21d294214811b');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','5bbc18bf059640191e2237408ca3b442556834e5c1c05d3317e82e7e097ae1f2');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','65603bcfc4b8b5a615bee4570206c301ced27a2031e17b8a3101321f6f995a89');\nhashMap.set('hermit','f30ba5fe8ee46997c1f3d15235e6ff64c96d7ce5e439ee99f8008580348fe0da');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','56ef90301143874355fd2ed25dff7c646875f701f97422d02e01d45608a88f31');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','f918a7f378dc207cadf291e7481006008c69623f690902ed921e1e33db270b78');\nhashMap.set('kotlin-script','99ef296792a0ca575ed31d3defb514b05a58083dc01c52ea0890c69d867ba1dd');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','c6ee547378d5c5619a0fe94be35f9838e0f006b4807a896e9caefefa20efacf7');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','2bf7b65d51718daf3eec4f30c0fc7f2f045f4f8f24862bebe17c2174abb606b9');\nhashMap.set('maven-wrapper','976ed8a59cf43b0c765b1a49ebc5669478e78278cf48f4ce3d0deb49647d10e3');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','b816a49c8525716454d0a2bc9127916d5b27e5cca7b2aa2030312f218942af3e');\nhashMap.set('mise','d39d941e81e44ea6c3f78ced7869645a874949fefcd2fd2ba5b8091156b887d8');\nhashMap.set('mix','a82c3d73372c2da723b467c29f0ad0bb1f85acb8cfb313a0aa734cc7ec2d46bf');\nhashMap.set('nix','95f0827f7ec9a3bfd5119534f129aad6cf26b28e99d55aec0945f08bbfff9fb1');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','cdb387ad533db812e39e16d8679a2da2cf2983b23f7a348c7d55f07be9fa98fe');\nhashMap.set('nuget','da72ddc95788d80b81c0b539b1b54001ef0c782f790efdc6e73aafb235d1e5f8');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','0e0fa5337367a9d5b597a11258f07cf8991d197082735d8e17a7980b9c0062b9');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','c750b18e58134ca1f22e3338e331c8a53890763cb3d6bf5277a5c8a43adffd11');\nhashMap.set('pip_requirements','5ef648e398281294c79ec5dc56a868af904efddc536c9ce8d693a8425afd9677');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','1d0af710667f6dce377feae9aa238b21fe5e0e75e75758a70f5e9758c6cb6678');\nhashMap.set('pixi','7d183aaae4370a0c62496bbff60ad12fd4dd46822630541f712f437dcea021e1');\nhashMap.set('poetry','0211739556f8193c70fa69cbf66c60e688042fd7dc7a2fe08f9f328b35ad1f82');\nhashMap.set('pre-commit','a6a6e847fdb0f56650e66ef7d69e68de752b390913f79ac31d1a7ec5955d03da');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','82a922bad525bc8d878226918cbe711427fe7bb32cc3d655210dd0dbaf894637');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e355e13e104351a8b3516a8e272fc5f7e625c9f39b0c492ba27283a36227c2d4');\nhashMap.set('renovate-config','2a4e4fb671aed5d0c900b8d54c31bfef46ca36d0f4e16b00ff73377b9c09fb69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','065ab64215fbeb4859e7e65f3268543ea37b7c384dd27c7a1e9acc4d0d44d8be');\nhashMap.set('sbt','74125bd9c76a5724092258cd1dee1ea99fc0d735b463a2b64fedc5d950efde2a');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('sveltos','05b3158e88771ed4629e171592cf4f1bf0ff342f8aeae89be0b340c630cc6d8e');\nhashMap.set('swift','56cdc6fe4cd00519f953459f94323c71677f6bde007537eef891154fb8696db1');\nhashMap.set('tekton','fdc5b9b5edec2a90cda2f858f3ebc532aa8efb1187d1e0b7c89b07796e9cb6cd');\nhashMap.set('terraform','ab8e39dd081ba22b10cfd08246efd7a14f1fc8cff8503c254b23a98e835ddd74');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','142c3f0549c4152297615b5bbf3a78ba8f7ce6a0cebcea63b81e9815dca40494');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','4a975f0cc1aa22cd258aa835de3dc98d7a5c0d1cee0a1092324338968e08a827');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','dfd7b905577b362093ce72e6ee597308f97c83678ddb15d6455a1627969b8b7d');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','3b5f465b586993f92c8490e70885e7eecce9b6556bcc376dd9c11db8ee9e6960');\nhashMap.set('regex','dbe6889ea021a05127fed06226d73366fdada2ae577147a5c027996fd325416e');"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1fbc76f78daa14a8c9ab1142e9d1e05c746c0419a9f1455e4279f476590d0c04');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','a599d9834f33a92e7c25753f933621f0b1b076ba8a068628a3f64e1dc545b739');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','fad98996bea8626525ab925f83a6ae0ce9262c53770e7aa7cb448a1e0f1ddf21');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c6e0ad88ea468664c3a33263baf7452d83d2d37ff09ba920e18f64ee81fd0acb');\nhashMap.set('bazel-module','49631e6572d4cf53b82d839ebae923b7e52be6fcacd28c5e99476497e3d0ec38');\nhashMap.set('bazelisk','49e6bd1fc8f03facd06e517dc64596833b90ee0a079a45cff78f0eeb3c3566f8');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','2df1756b14b3d690e5ad1295bc1e78d8a8d7b967a552fd7b8e3274866a5acf3e');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','cf7b07339eec46097c479fc5d9aa1c699d74b11954aea156eef7b893251b070d');\nhashMap.set('cake','65ad4f28c318675b9edb49dbd11d677f42c762b01b3f5a25dd3b2f345ecd387e');\nhashMap.set('cargo','23fcc425ccd3a50559210e0ab8c84c1d47cf5c617cd5d58afdcf258ab862bafa');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','08310c39254947632d42058f74f755e9d3f3019c2edeeaf52b5142917085e2df');\nhashMap.set('composer','e7d1bf044d838d1a294929a1fa730d80f159252405652cf87793c34a009aa02a');\nhashMap.set('conan','b846e8812d65d4201dc0bf7c1d5c344e3a1edaaff6441010875171028be2f0fb');\nhashMap.set('copier','b26904512023c7785e86ee57744f16b336a380ae80d2b85924bf7c30e3c6f1c5');\nhashMap.set('cpanfile','6a1d67d9c8751123deaf0c7f3ac38a07024e960c140f8228fcbcb93954fdca01');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','2d79ef509b7249a318e94e5dacd8e13a945f2b44007b9a17438a2c915b596120');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','ac472ae4897dc1df85326dbd89a8c3488579ae2b180014ffcf085ce422e19dbd');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','322b95f7e55dd78d7fe71306a6f649479eca61c60d75bb10b23604a230dbdd08');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','7cbca9a0e639dbfac830f05f8713f05435fedcda8ce8e9ff46a5dee16d64a438');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','475d08a1a75e5732dd6003f63bd98c91ce09e42229cdcd9d2d060c60ce474e49');\nhashMap.set('github-actions','30479622f3138996116d419485423d5a64843ae49ed50c5cd5e1e6d4e122944f');\nhashMap.set('gitlabci','0dec44dd398bfc5b3c19d0929bea2fef7f386c94acfd1b1d7bc2a31d81d96fd6');\nhashMap.set('gitlabci-include','354cfc4ea327c6d5cd5bee1f17763832efc7f5402e9fd22c579239fccb9c6dab');\nhashMap.set('glasskube','253d6db30bdec75ed5ab5d26f31d69bc07813ba10089a28da12c6a29eff4ec70');\nhashMap.set('gleam','e7ee3392d1f900fc1299308c8e930db9288790c6d0b6c35f1a62e55683090d34');\nhashMap.set('gomod','f675e8c7bf83c00101d9725814927c69d04e5e347dc6b0346a7100892b1ea4c9');\nhashMap.set('gradle','1108234b4fcfebf95c453111f652ab75f5c6cc6c4472efb60b7bc29cbe683612');\nhashMap.set('gradle-wrapper','f85031e7feb4e811aa5f29c589a30f8076a078e5bbf366fb65fb28b5a47d2c44');\nhashMap.set('haskell-cabal','a4f01c22bdd453dd4610473d92946f7764ceb27624547325f5e21d294214811b');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','5bbc18bf059640191e2237408ca3b442556834e5c1c05d3317e82e7e097ae1f2');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','65603bcfc4b8b5a615bee4570206c301ced27a2031e17b8a3101321f6f995a89');\nhashMap.set('hermit','f30ba5fe8ee46997c1f3d15235e6ff64c96d7ce5e439ee99f8008580348fe0da');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','56ef90301143874355fd2ed25dff7c646875f701f97422d02e01d45608a88f31');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','f918a7f378dc207cadf291e7481006008c69623f690902ed921e1e33db270b78');\nhashMap.set('kotlin-script','99ef296792a0ca575ed31d3defb514b05a58083dc01c52ea0890c69d867ba1dd');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','c6ee547378d5c5619a0fe94be35f9838e0f006b4807a896e9caefefa20efacf7');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','2bf7b65d51718daf3eec4f30c0fc7f2f045f4f8f24862bebe17c2174abb606b9');\nhashMap.set('maven-wrapper','976ed8a59cf43b0c765b1a49ebc5669478e78278cf48f4ce3d0deb49647d10e3');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','b816a49c8525716454d0a2bc9127916d5b27e5cca7b2aa2030312f218942af3e');\nhashMap.set('mise','d39d941e81e44ea6c3f78ced7869645a874949fefcd2fd2ba5b8091156b887d8');\nhashMap.set('mix','a82c3d73372c2da723b467c29f0ad0bb1f85acb8cfb313a0aa734cc7ec2d46bf');\nhashMap.set('nix','95f0827f7ec9a3bfd5119534f129aad6cf26b28e99d55aec0945f08bbfff9fb1');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','5c4dfaf08548824a9d97ef3d3513b0bd7e0917f19a9c43d7edb6311493f1609f');\nhashMap.set('nuget','da72ddc95788d80b81c0b539b1b54001ef0c782f790efdc6e73aafb235d1e5f8');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','0e0fa5337367a9d5b597a11258f07cf8991d197082735d8e17a7980b9c0062b9');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','c750b18e58134ca1f22e3338e331c8a53890763cb3d6bf5277a5c8a43adffd11');\nhashMap.set('pip_requirements','5ef648e398281294c79ec5dc56a868af904efddc536c9ce8d693a8425afd9677');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','1d0af710667f6dce377feae9aa238b21fe5e0e75e75758a70f5e9758c6cb6678');\nhashMap.set('pixi','7d183aaae4370a0c62496bbff60ad12fd4dd46822630541f712f437dcea021e1');\nhashMap.set('poetry','0211739556f8193c70fa69cbf66c60e688042fd7dc7a2fe08f9f328b35ad1f82');\nhashMap.set('pre-commit','a6a6e847fdb0f56650e66ef7d69e68de752b390913f79ac31d1a7ec5955d03da');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','82a922bad525bc8d878226918cbe711427fe7bb32cc3d655210dd0dbaf894637');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e355e13e104351a8b3516a8e272fc5f7e625c9f39b0c492ba27283a36227c2d4');\nhashMap.set('renovate-config','2a4e4fb671aed5d0c900b8d54c31bfef46ca36d0f4e16b00ff73377b9c09fb69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','065ab64215fbeb4859e7e65f3268543ea37b7c384dd27c7a1e9acc4d0d44d8be');\nhashMap.set('sbt','74125bd9c76a5724092258cd1dee1ea99fc0d735b463a2b64fedc5d950efde2a');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('sveltos','05b3158e88771ed4629e171592cf4f1bf0ff342f8aeae89be0b340c630cc6d8e');\nhashMap.set('swift','56cdc6fe4cd00519f953459f94323c71677f6bde007537eef891154fb8696db1');\nhashMap.set('tekton','fdc5b9b5edec2a90cda2f858f3ebc532aa8efb1187d1e0b7c89b07796e9cb6cd');\nhashMap.set('terraform','ab8e39dd081ba22b10cfd08246efd7a14f1fc8cff8503c254b23a98e835ddd74');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','142c3f0549c4152297615b5bbf3a78ba8f7ce6a0cebcea63b81e9815dca40494');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','4a975f0cc1aa22cd258aa835de3dc98d7a5c0d1cee0a1092324338968e08a827');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','dfd7b905577b362093ce72e6ee597308f97c83678ddb15d6455a1627969b8b7d');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','3b5f465b586993f92c8490e70885e7eecce9b6556bcc376dd9c11db8ee9e6960');\nhashMap.set('regex','dbe6889ea021a05127fed06226d73366fdada2ae577147a5c027996fd325416e');"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { GlobalConfig } from "../../../../config/global.js";
|
|
2
2
|
import { logger } from "../../../../logger/index.js";
|
|
3
|
-
import { parseSingleYaml } from "../../../../util/yaml.js";
|
|
3
|
+
import { parseSingleYaml, parseYaml } from "../../../../util/yaml.js";
|
|
4
4
|
import { findLocalSiblingOrParent, getSiblingFileName, localPathExists, readLocalFile } from "../../../../util/fs/index.js";
|
|
5
5
|
import { extractDependency } from "./common/dependency.js";
|
|
6
6
|
import { pnpmWorkspaceOverrides } from "../dep-types.js";
|
|
@@ -86,7 +86,7 @@ async function getPnpmLock(filePath) {
|
|
|
86
86
|
try {
|
|
87
87
|
const pnpmLockRaw = await readLocalFile(filePath, "utf8");
|
|
88
88
|
if (!pnpmLockRaw) throw new Error("Unable to read pnpm-lock.yaml");
|
|
89
|
-
const lockParsed =
|
|
89
|
+
const lockParsed = parseYaml(pnpmLockRaw).at(-1);
|
|
90
90
|
if (!isPnpmLockfile(lockParsed)) throw new Error("Invalid or empty lockfile");
|
|
91
91
|
logger.trace({ lockParsed }, "pnpm lockfile parsed");
|
|
92
92
|
const lockfileVersion = isNumber(lockParsed.lockfileVersion) ? lockParsed.lockfileVersion : parseFloat(lockParsed.lockfileVersion);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pnpm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/extract/pnpm.ts"],"sourcesContent":["import { parsePkgAndParentSelector } from '@pnpm/parse-overrides';\nimport {\n isNonEmptyObject,\n isNumber,\n isObject,\n isPlainObject,\n isString,\n} from '@sindresorhus/is';\nimport { findPackages } from 'find-packages';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n findLocalSiblingOrParent,\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { parseSingleYaml } from '../../../../util/yaml.ts';\nimport type { PackageFile, PackageFileContent } from '../../types.ts';\nimport { pnpmWorkspaceOverrides } from '../dep-types.ts';\nimport type { PnpmDependency, PnpmLockFile } from '../post-update/types.ts';\nimport type { PnpmCatalogs, PnpmWorkspaceFile } from '../schema.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport { extractCatalogDeps } from './common/catalogs.ts';\nimport { extractDependency } from './common/dependency.ts';\nimport type { Catalog, LockFile } from './types.ts';\n\nfunction isPnpmLockfile(obj: any): obj is PnpmLockFile {\n return isPlainObject(obj) && 'lockfileVersion' in obj;\n}\n\nexport async function extractPnpmFilters(\n fileName: string,\n): Promise<string[] | undefined> {\n try {\n // TODO: use schema (#9610,#22198)\n const contents = parseSingleYaml<PnpmWorkspaceFile>(\n (await readLocalFile(fileName, 'utf8'))!,\n );\n if (\n !Array.isArray(contents.packages) ||\n !contents.packages.every((item) => isString(item))\n ) {\n logger.trace(\n { fileName },\n 'Failed to find required \"packages\" array in pnpm-workspace.yaml',\n );\n return undefined;\n }\n return contents.packages;\n } catch (err) {\n logger.trace({ fileName, err }, 'Failed to parse pnpm-workspace.yaml');\n return undefined;\n }\n}\n\nexport async function findPnpmWorkspace(\n packageFile: string,\n): Promise<{ lockFilePath: string; workspaceYamlPath: string } | null> {\n // search for pnpm-workspace.yaml\n const workspaceYamlPath = await findLocalSiblingOrParent(\n packageFile,\n 'pnpm-workspace.yaml',\n );\n if (!workspaceYamlPath) {\n logger.trace(\n { packageFile },\n 'Failed to locate pnpm-workspace.yaml in a parent directory.',\n );\n return null;\n }\n\n // search for pnpm-lock.yaml next to pnpm-workspace.yaml\n const pnpmLockfilePath = getSiblingFileName(\n workspaceYamlPath,\n 'pnpm-lock.yaml',\n );\n if (!(await localPathExists(pnpmLockfilePath))) {\n logger.trace(\n { workspaceYamlPath, packageFile },\n 'Failed to find a pnpm-lock.yaml sibling for the workspace.',\n );\n return null;\n }\n\n return {\n lockFilePath: pnpmLockfilePath,\n workspaceYamlPath,\n };\n}\n\nexport async function detectPnpmWorkspaces(\n packageFiles: Partial<PackageFile<NpmManagerData>>[],\n): Promise<void> {\n logger.debug(`Detecting pnpm Workspaces`);\n const packagePathCache = new Map<string, string[] | null>();\n\n for (const p of packageFiles) {\n const { packageFile, managerData } = p;\n const pnpmShrinkwrap = managerData?.pnpmShrinkwrap;\n\n // check if pnpmShrinkwrap-file has already been provided\n if (pnpmShrinkwrap) {\n logger.trace(\n { packageFile, pnpmShrinkwrap },\n 'Found an existing pnpm shrinkwrap file; skipping pnpm monorepo check.',\n );\n continue;\n }\n\n // search for corresponding pnpm workspace\n // TODO #22198\n const pnpmWorkspace = await findPnpmWorkspace(packageFile!);\n if (pnpmWorkspace === null) {\n continue;\n }\n const { workspaceYamlPath, lockFilePath } = pnpmWorkspace;\n\n // check if package matches workspace filter\n if (!packagePathCache.has(workspaceYamlPath)) {\n const filters = await extractPnpmFilters(workspaceYamlPath);\n // TODO: types (#22198)\n const localDir = GlobalConfig.get('localDir');\n const packages = await findPackages(\n upath.dirname(upath.join(localDir, workspaceYamlPath)),\n {\n patterns: filters,\n // Match the ignores used in @pnpm/find-workspace-packages\n ignore: ['**/node_modules/**', '**/bower_components/**'],\n },\n );\n const packagePaths = packages.map((pkg) =>\n upath.join(pkg.dir, 'package.json'),\n );\n packagePathCache.set(workspaceYamlPath, packagePaths);\n }\n const packagePaths = packagePathCache.get(workspaceYamlPath);\n\n const isPackageInWorkspace = packagePaths?.some((p) =>\n p.endsWith(packageFile!),\n );\n\n if (isPackageInWorkspace) {\n p.managerData ??= {};\n p.managerData.pnpmShrinkwrap = lockFilePath;\n } else {\n logger.trace(\n { packageFile, workspaceYamlPath },\n `Didn't find the package in the pnpm workspace`,\n );\n }\n }\n}\n\nexport async function getPnpmLock(filePath: string): Promise<LockFile> {\n try {\n const pnpmLockRaw = await readLocalFile(filePath, 'utf8');\n if (!pnpmLockRaw) {\n throw new Error('Unable to read pnpm-lock.yaml');\n }\n\n const lockParsed = parseSingleYaml(pnpmLockRaw);\n if (!isPnpmLockfile(lockParsed)) {\n throw new Error('Invalid or empty lockfile');\n }\n logger.trace({ lockParsed }, 'pnpm lockfile parsed');\n\n // field lockfileVersion is type string in lockfileVersion = 6 and type number in < 6\n const lockfileVersion: number = isNumber(lockParsed.lockfileVersion)\n ? lockParsed.lockfileVersion\n : parseFloat(lockParsed.lockfileVersion);\n\n const lockedVersions = getLockedVersions(lockParsed);\n const lockedCatalogVersions = getLockedCatalogVersions(lockParsed);\n\n return {\n lockedVersionsWithPath: lockedVersions,\n lockedVersionsWithCatalog: lockedCatalogVersions,\n lockfileVersion,\n };\n } catch (err) {\n logger.debug({ filePath, err }, 'Warning: Exception parsing pnpm lockfile');\n return { lockedVersions: {} };\n }\n}\n\nfunction getLockedCatalogVersions(\n lockParsed: PnpmLockFile,\n): Record<string, Record<string, string>> {\n const lockedVersions: Record<string, Record<string, string>> = {};\n\n if (isNonEmptyObject(lockParsed.catalogs)) {\n for (const [catalog, dependencies] of Object.entries(lockParsed.catalogs)) {\n const versions: Record<string, string> = {};\n\n for (const [dep, versionCarrier] of Object.entries(dependencies)) {\n versions[dep] = versionCarrier.version;\n }\n\n lockedVersions[catalog] = versions;\n }\n }\n\n return lockedVersions;\n}\n\nfunction getLockedVersions(\n lockParsed: PnpmLockFile,\n): Record<string, Record<string, Record<string, string>>> {\n const lockedVersions: Record<\n string,\n Record<string, Record<string, string>>\n > = {};\n\n // monorepo\n if (isNonEmptyObject(lockParsed.importers)) {\n for (const [importer, imports] of Object.entries(lockParsed.importers)) {\n lockedVersions[importer] = getLockedDependencyVersions(imports);\n }\n }\n // normal repo\n else {\n lockedVersions['.'] = getLockedDependencyVersions(lockParsed);\n }\n\n return lockedVersions;\n}\n\nfunction getLockedDependencyVersions(\n obj: PnpmLockFile | Record<string, PnpmDependency>,\n): Record<string, Record<string, string>> {\n const dependencyTypes = [\n 'dependencies',\n 'devDependencies',\n 'optionalDependencies',\n ] as const;\n\n const res: Record<string, Record<string, string>> = {};\n for (const depType of dependencyTypes) {\n res[depType] = {};\n for (const [pkgName, versionCarrier] of Object.entries(\n obj[depType] ?? {},\n )) {\n let version: string;\n if (isObject(versionCarrier)) {\n version = versionCarrier.version;\n } else {\n version = versionCarrier;\n }\n\n const pkgVersion = version.split('(')[0].trim();\n res[depType][pkgName] = pkgVersion;\n }\n }\n\n return res;\n}\n\nexport async function extractPnpmWorkspaceFile(\n workspaceFile: PnpmWorkspaceFile,\n packageFile: string,\n): Promise<PackageFileContent<NpmManagerData> | null> {\n logger.trace(`pnpm.extractPnpmWorkspaceFile(${packageFile})`);\n\n const pnpmCatalogs = pnpmCatalogsToArray(workspaceFile);\n\n const deps = extractCatalogDeps(pnpmCatalogs);\n\n if (workspaceFile.overrides) {\n for (const [overridesKey, overridesVal] of Object.entries(\n workspaceFile.overrides,\n )) {\n // flat syntax: `parent>parent>child`\n const packageName =\n parsePkgAndParentSelector(overridesKey).targetPkg.name;\n const depType = pnpmWorkspaceOverrides;\n deps.push({\n depName: overridesKey,\n packageName,\n depType,\n ...extractDependency(depType, packageName, overridesVal),\n });\n }\n }\n\n let pnpmShrinkwrap;\n const filePath = getSiblingFileName(packageFile, 'pnpm-lock.yaml');\n\n if (await readLocalFile(filePath, 'utf8')) {\n pnpmShrinkwrap = filePath;\n }\n\n return {\n deps,\n managerData: {\n pnpmShrinkwrap,\n },\n };\n}\n\nfunction pnpmCatalogsToArray({\n catalog: defaultCatalogDeps,\n catalogs: namedCatalogs,\n}: PnpmCatalogs): Catalog[] {\n const result: Catalog[] = [];\n\n if (defaultCatalogDeps !== undefined) {\n result.push({ name: 'default', dependencies: defaultCatalogDeps });\n }\n\n if (!namedCatalogs) {\n return result;\n }\n\n for (const [name, dependencies] of Object.entries(namedCatalogs)) {\n result.push({\n name,\n dependencies,\n });\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pnpm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/extract/pnpm.ts"],"sourcesContent":["import { parsePkgAndParentSelector } from '@pnpm/parse-overrides';\nimport {\n isNonEmptyObject,\n isNumber,\n isObject,\n isPlainObject,\n isString,\n} from '@sindresorhus/is';\nimport { findPackages } from 'find-packages';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n findLocalSiblingOrParent,\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { parseSingleYaml, parseYaml } from '../../../../util/yaml.ts';\nimport type { PackageFile, PackageFileContent } from '../../types.ts';\nimport { pnpmWorkspaceOverrides } from '../dep-types.ts';\nimport type { PnpmDependency, PnpmLockFile } from '../post-update/types.ts';\nimport type { PnpmCatalogs, PnpmWorkspaceFile } from '../schema.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport { extractCatalogDeps } from './common/catalogs.ts';\nimport { extractDependency } from './common/dependency.ts';\nimport type { Catalog, LockFile } from './types.ts';\n\nfunction isPnpmLockfile(obj: any): obj is PnpmLockFile {\n return isPlainObject(obj) && 'lockfileVersion' in obj;\n}\n\nexport async function extractPnpmFilters(\n fileName: string,\n): Promise<string[] | undefined> {\n try {\n // TODO: use schema (#9610,#22198)\n const contents = parseSingleYaml<PnpmWorkspaceFile>(\n (await readLocalFile(fileName, 'utf8'))!,\n );\n if (\n !Array.isArray(contents.packages) ||\n !contents.packages.every((item) => isString(item))\n ) {\n logger.trace(\n { fileName },\n 'Failed to find required \"packages\" array in pnpm-workspace.yaml',\n );\n return undefined;\n }\n return contents.packages;\n } catch (err) {\n logger.trace({ fileName, err }, 'Failed to parse pnpm-workspace.yaml');\n return undefined;\n }\n}\n\nexport async function findPnpmWorkspace(\n packageFile: string,\n): Promise<{ lockFilePath: string; workspaceYamlPath: string } | null> {\n // search for pnpm-workspace.yaml\n const workspaceYamlPath = await findLocalSiblingOrParent(\n packageFile,\n 'pnpm-workspace.yaml',\n );\n if (!workspaceYamlPath) {\n logger.trace(\n { packageFile },\n 'Failed to locate pnpm-workspace.yaml in a parent directory.',\n );\n return null;\n }\n\n // search for pnpm-lock.yaml next to pnpm-workspace.yaml\n const pnpmLockfilePath = getSiblingFileName(\n workspaceYamlPath,\n 'pnpm-lock.yaml',\n );\n if (!(await localPathExists(pnpmLockfilePath))) {\n logger.trace(\n { workspaceYamlPath, packageFile },\n 'Failed to find a pnpm-lock.yaml sibling for the workspace.',\n );\n return null;\n }\n\n return {\n lockFilePath: pnpmLockfilePath,\n workspaceYamlPath,\n };\n}\n\nexport async function detectPnpmWorkspaces(\n packageFiles: Partial<PackageFile<NpmManagerData>>[],\n): Promise<void> {\n logger.debug(`Detecting pnpm Workspaces`);\n const packagePathCache = new Map<string, string[] | null>();\n\n for (const p of packageFiles) {\n const { packageFile, managerData } = p;\n const pnpmShrinkwrap = managerData?.pnpmShrinkwrap;\n\n // check if pnpmShrinkwrap-file has already been provided\n if (pnpmShrinkwrap) {\n logger.trace(\n { packageFile, pnpmShrinkwrap },\n 'Found an existing pnpm shrinkwrap file; skipping pnpm monorepo check.',\n );\n continue;\n }\n\n // search for corresponding pnpm workspace\n // TODO #22198\n const pnpmWorkspace = await findPnpmWorkspace(packageFile!);\n if (pnpmWorkspace === null) {\n continue;\n }\n const { workspaceYamlPath, lockFilePath } = pnpmWorkspace;\n\n // check if package matches workspace filter\n if (!packagePathCache.has(workspaceYamlPath)) {\n const filters = await extractPnpmFilters(workspaceYamlPath);\n // TODO: types (#22198)\n const localDir = GlobalConfig.get('localDir');\n const packages = await findPackages(\n upath.dirname(upath.join(localDir, workspaceYamlPath)),\n {\n patterns: filters,\n // Match the ignores used in @pnpm/find-workspace-packages\n ignore: ['**/node_modules/**', '**/bower_components/**'],\n },\n );\n const packagePaths = packages.map((pkg) =>\n upath.join(pkg.dir, 'package.json'),\n );\n packagePathCache.set(workspaceYamlPath, packagePaths);\n }\n const packagePaths = packagePathCache.get(workspaceYamlPath);\n\n const isPackageInWorkspace = packagePaths?.some((p) =>\n p.endsWith(packageFile!),\n );\n\n if (isPackageInWorkspace) {\n p.managerData ??= {};\n p.managerData.pnpmShrinkwrap = lockFilePath;\n } else {\n logger.trace(\n { packageFile, workspaceYamlPath },\n `Didn't find the package in the pnpm workspace`,\n );\n }\n }\n}\n\nexport async function getPnpmLock(filePath: string): Promise<LockFile> {\n try {\n const pnpmLockRaw = await readLocalFile(filePath, 'utf8');\n if (!pnpmLockRaw) {\n throw new Error('Unable to read pnpm-lock.yaml');\n }\n\n // pnpm writes a multi-document YAML lockfile when `pnpm-workspace.yaml`\n // declares `configDependencies`; the env document (config-deps + integrity\n // metadata) is unconditionally prepended before the main lockfile, so the\n // main lockfile is always the last document.\n // https://pnpm.io/config-dependencies.\n const parsedDocs = parseYaml(pnpmLockRaw);\n const lockParsed = parsedDocs.at(-1);\n if (!isPnpmLockfile(lockParsed)) {\n throw new Error('Invalid or empty lockfile');\n }\n logger.trace({ lockParsed }, 'pnpm lockfile parsed');\n\n // field lockfileVersion is type string in lockfileVersion = 6 and type number in < 6\n const lockfileVersion: number = isNumber(lockParsed.lockfileVersion)\n ? lockParsed.lockfileVersion\n : parseFloat(lockParsed.lockfileVersion);\n\n const lockedVersions = getLockedVersions(lockParsed);\n const lockedCatalogVersions = getLockedCatalogVersions(lockParsed);\n\n return {\n lockedVersionsWithPath: lockedVersions,\n lockedVersionsWithCatalog: lockedCatalogVersions,\n lockfileVersion,\n };\n } catch (err) {\n logger.debug({ filePath, err }, 'Warning: Exception parsing pnpm lockfile');\n return { lockedVersions: {} };\n }\n}\n\nfunction getLockedCatalogVersions(\n lockParsed: PnpmLockFile,\n): Record<string, Record<string, string>> {\n const lockedVersions: Record<string, Record<string, string>> = {};\n\n if (isNonEmptyObject(lockParsed.catalogs)) {\n for (const [catalog, dependencies] of Object.entries(lockParsed.catalogs)) {\n const versions: Record<string, string> = {};\n\n for (const [dep, versionCarrier] of Object.entries(dependencies)) {\n versions[dep] = versionCarrier.version;\n }\n\n lockedVersions[catalog] = versions;\n }\n }\n\n return lockedVersions;\n}\n\nfunction getLockedVersions(\n lockParsed: PnpmLockFile,\n): Record<string, Record<string, Record<string, string>>> {\n const lockedVersions: Record<\n string,\n Record<string, Record<string, string>>\n > = {};\n\n // monorepo\n if (isNonEmptyObject(lockParsed.importers)) {\n for (const [importer, imports] of Object.entries(lockParsed.importers)) {\n lockedVersions[importer] = getLockedDependencyVersions(imports);\n }\n }\n // normal repo\n else {\n lockedVersions['.'] = getLockedDependencyVersions(lockParsed);\n }\n\n return lockedVersions;\n}\n\nfunction getLockedDependencyVersions(\n obj: PnpmLockFile | Record<string, PnpmDependency>,\n): Record<string, Record<string, string>> {\n const dependencyTypes = [\n 'dependencies',\n 'devDependencies',\n 'optionalDependencies',\n ] as const;\n\n const res: Record<string, Record<string, string>> = {};\n for (const depType of dependencyTypes) {\n res[depType] = {};\n for (const [pkgName, versionCarrier] of Object.entries(\n obj[depType] ?? {},\n )) {\n let version: string;\n if (isObject(versionCarrier)) {\n version = versionCarrier.version;\n } else {\n version = versionCarrier;\n }\n\n const pkgVersion = version.split('(')[0].trim();\n res[depType][pkgName] = pkgVersion;\n }\n }\n\n return res;\n}\n\nexport async function extractPnpmWorkspaceFile(\n workspaceFile: PnpmWorkspaceFile,\n packageFile: string,\n): Promise<PackageFileContent<NpmManagerData> | null> {\n logger.trace(`pnpm.extractPnpmWorkspaceFile(${packageFile})`);\n\n const pnpmCatalogs = pnpmCatalogsToArray(workspaceFile);\n\n const deps = extractCatalogDeps(pnpmCatalogs);\n\n if (workspaceFile.overrides) {\n for (const [overridesKey, overridesVal] of Object.entries(\n workspaceFile.overrides,\n )) {\n // flat syntax: `parent>parent>child`\n const packageName =\n parsePkgAndParentSelector(overridesKey).targetPkg.name;\n const depType = pnpmWorkspaceOverrides;\n deps.push({\n depName: overridesKey,\n packageName,\n depType,\n ...extractDependency(depType, packageName, overridesVal),\n });\n }\n }\n\n let pnpmShrinkwrap;\n const filePath = getSiblingFileName(packageFile, 'pnpm-lock.yaml');\n\n if (await readLocalFile(filePath, 'utf8')) {\n pnpmShrinkwrap = filePath;\n }\n\n return {\n deps,\n managerData: {\n pnpmShrinkwrap,\n },\n };\n}\n\nfunction pnpmCatalogsToArray({\n catalog: defaultCatalogDeps,\n catalogs: namedCatalogs,\n}: PnpmCatalogs): Catalog[] {\n const result: Catalog[] = [];\n\n if (defaultCatalogDeps !== undefined) {\n result.push({ name: 'default', dependencies: defaultCatalogDeps });\n }\n\n if (!namedCatalogs) {\n return result;\n }\n\n for (const [name, dependencies] of Object.entries(namedCatalogs)) {\n result.push({\n name,\n dependencies,\n });\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.js","names":["fs.cachePathIsFile","fs.readCacheFile","fs.rmCache","fs.listCacheDir","fs.createCacheWriteStream","fs.pipeline","p.map"],"sources":["../../../../../lib/modules/manager/terraform/lockfile/hash.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport AdmZip from 'adm-zip';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n coerceArray,\n deduplicateArray,\n isNotNullOrUndefined,\n} from '../../../../util/array.ts';\nimport { withCache } from '../../../../util/cache/package/with-cache.ts';\nimport * as fs from '../../../../util/fs/index.ts';\nimport { ensureCacheDir } from '../../../../util/fs/index.ts';\nimport { Http } from '../../../../util/http/index.ts';\nimport * as p from '../../../../util/promises.ts';\nimport { TerraformProviderDatasource } from '../../../datasource/terraform-provider/index.ts';\nimport type { TerraformBuild } from '../../../datasource/terraform-provider/types.ts';\n\nexport class TerraformProviderHash {\n static http = new Http(TerraformProviderDatasource.id);\n\n static terraformDatasource = new TerraformProviderDatasource();\n\n static hashCacheTTL = 10080; // in minutes == 1 week\n\n private static async hashElementList(\n basePath: string,\n fileSystemEntries: string[],\n ): Promise<string> {\n const rootHash = crypto.createHash('sha256');\n\n for (const entryPath of fileSystemEntries) {\n const absolutePath = upath.resolve(basePath, entryPath);\n if (!(await fs.cachePathIsFile(absolutePath))) {\n continue;\n }\n\n // build for every file a line looking like \"aaaaaaaaaaaaaaa file.txt\\n\"\n\n // get hash of specific file\n const hash = crypto.createHash('sha256');\n const fileBuffer = await fs.readCacheFile(absolutePath);\n hash.update(fileBuffer);\n\n const line = `${hash.digest('hex')} ${upath.normalize(entryPath)}\\n`;\n rootHash.update(line);\n }\n\n return rootHash.digest('base64');\n }\n\n /**\n * This is a reimplementation of the Go H1 hash algorithm found at https://github.com/golang/mod/blob/master/sumdb/dirhash/hash.go\n * The package provides two function HashDir and HashZip where the first is for hashing the contents of a directory\n * and the second for doing the same but implicitly extracting the contents first.\n *\n * The problem starts with that there is a bug which leads to the fact that HashDir and HashZip do not return the same\n * hash if there are folders inside the content which should be hashed.\n *\n * In a folder structure such as\n * .\n * ├── Readme.md\n * └── readme-assets/\n * └── image.jpg\n *\n * HashDir will create a list of following entries which in turn will hash again\n * aaaaaaaaaaa Readme.md\\n\n * ccccccccccc readme-assets/image.jpg\\n\n *\n * HashZip in contrast will not filter out the directory itself but rather includes it in the hash list\n * aaaaaaaaaaa Readme.md\\n\n * bbbbbbbbbbb readme-assets/\\n\n * ccccccccccc readme-assets/image.jpg\\n\n *\n * As the resulting string is used to generate the final hash it will differ based on which function has been used.\n * The issue is tracked here: https://github.com/golang/go/issues/53448\n *\n * This implementation follows the intended implementation and filters out folder entries.\n * Terraform seems NOT to use HashZip for provider validation, but rather extracts it and then do the hash calculation\n * even as both are set up in their code base.\n * https://github.com/hashicorp/terraform/blob/3fdfbd69448b14a4982b3c62a5d36835956fcbaa/internal/getproviders/hash.go#L283-L305\n *\n * @param zipFilePath path to the zip file\n * @param extractPath path to where to temporarily extract the data\n */\n static async hashOfZipContent(\n zipFilePath: string,\n extractPath: string,\n ): Promise<string> {\n const zip = new AdmZip(zipFilePath);\n zip.extractAllTo(extractPath);\n const hash = await this.hashOfDir(extractPath);\n // delete extracted files\n await fs.rmCache(extractPath);\n\n return hash;\n }\n\n static async hashOfDir(dirPath: string): Promise<string> {\n const elements = await fs.listCacheDir(dirPath, { recursive: true });\n\n const sortedFileSystemObjects = elements.sort();\n return await TerraformProviderHash.hashElementList(\n dirPath,\n sortedFileSystemObjects,\n );\n }\n\n private static async _calculateSingleHash(\n build: TerraformBuild,\n cacheDir: string,\n ): Promise<string> {\n const downloadFileName = upath.join(cacheDir, build.filename);\n const extractPath = upath.join(cacheDir, 'extract', build.filename);\n logger.trace(\n `Downloading archive and generating hash for ${build.name}-${build.version}...`,\n );\n const startTime = Date.now();\n const readStream = TerraformProviderHash.http.stream(build.url);\n const writeStream = fs.createCacheWriteStream(downloadFileName);\n\n try {\n await fs.pipeline(readStream, writeStream);\n\n const hash = await this.hashOfZipContent(downloadFileName, extractPath);\n logger.debug(\n `Hash generation for ${build.url} took ${Date.now() - startTime}ms for ${build.name}-${build.version}`,\n );\n return hash;\n } finally {\n // delete zip file\n await fs.rmCache(downloadFileName);\n }\n }\n\n static calculateSingleHash(\n build: TerraformBuild,\n cacheDir: string,\n ): Promise<string> {\n return withCache(\n {\n namespace: `terraform-provider-hash`,\n key: `calculateSingleHash:${build.url}`,\n ttlMinutes: TerraformProviderHash.hashCacheTTL,\n },\n () => TerraformProviderHash._calculateSingleHash(build, cacheDir),\n );\n }\n\n static async calculateHashScheme1Hashes(\n builds: TerraformBuild[],\n ): Promise<string[]> {\n logger.debug(`Calculating hashes for ${builds.length} builds`);\n const cacheDir = await ensureCacheDir('terraform');\n\n // for each build download ZIP, extract content and generate hash for all containing files\n return p.map(builds, (build) => this.calculateSingleHash(build, cacheDir), {\n concurrency: 4,\n });\n }\n\n static async createHashes(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<string[] | null> {\n logger.debug(\n `Creating hashes for ${repository}@${version} (${registryURL})`,\n );\n const builds = await TerraformProviderHash.terraformDatasource.getBuilds(\n registryURL,\n repository,\n version,\n );\n if (!builds) {\n return null;\n }\n\n // check if the publisher uses one shasum file for all builds or separate ones\n // we deduplicate to reduce the number of API calls\n const shaUrls = deduplicateArray(\n builds.map((build) => build.shasums_url).filter(isNotNullOrUndefined),\n );\n\n logger.debug(\n `Getting zip hashes for ${shaUrls.length} shasum URL(s) for ${repository}@${version}`,\n );\n\n const zhHashes: string[] = [];\n for (const shaUrl of shaUrls) {\n const hashes =\n await TerraformProviderHash.terraformDatasource.getZipHashes(shaUrl);\n\n zhHashes.push(...coerceArray(hashes));\n }\n\n logger.debug(\n `Got ${zhHashes.length} zip hashes for ${repository}@${version}`,\n );\n\n const h1Hashes =\n await TerraformProviderHash.calculateHashScheme1Hashes(builds);\n\n const hashes = [];\n hashes.push(...h1Hashes.map((hash) => `h1:${hash}`));\n hashes.push(...zhHashes.map((hash) => `zh:${hash}`));\n\n // sorting the hash alphabetically as terraform does this as well\n return hashes.sort();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hash.js","names":["fs.cachePathIsFile","fs.readCacheFile","fs.rmCache","fs.listCacheDir","fs.createCacheWriteStream","fs.pipeline","p.map"],"sources":["../../../../../lib/modules/manager/terraform/lockfile/hash.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport AdmZip from 'adm-zip';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n coerceArray,\n deduplicateArray,\n isNotNullOrUndefined,\n} from '../../../../util/array.ts';\nimport { withCache } from '../../../../util/cache/package/with-cache.ts';\nimport * as fs from '../../../../util/fs/index.ts';\nimport { ensureCacheDir } from '../../../../util/fs/index.ts';\nimport { Http } from '../../../../util/http/index.ts';\nimport * as p from '../../../../util/promises.ts';\nimport { TerraformProviderDatasource } from '../../../datasource/terraform-provider/index.ts';\nimport type { TerraformBuild } from '../../../datasource/terraform-provider/schema.ts';\n\nexport class TerraformProviderHash {\n static http = new Http(TerraformProviderDatasource.id);\n\n static terraformDatasource = new TerraformProviderDatasource();\n\n static hashCacheTTL = 10080; // in minutes == 1 week\n\n private static async hashElementList(\n basePath: string,\n fileSystemEntries: string[],\n ): Promise<string> {\n const rootHash = crypto.createHash('sha256');\n\n for (const entryPath of fileSystemEntries) {\n const absolutePath = upath.resolve(basePath, entryPath);\n if (!(await fs.cachePathIsFile(absolutePath))) {\n continue;\n }\n\n // build for every file a line looking like \"aaaaaaaaaaaaaaa file.txt\\n\"\n\n // get hash of specific file\n const hash = crypto.createHash('sha256');\n const fileBuffer = await fs.readCacheFile(absolutePath);\n hash.update(fileBuffer);\n\n const line = `${hash.digest('hex')} ${upath.normalize(entryPath)}\\n`;\n rootHash.update(line);\n }\n\n return rootHash.digest('base64');\n }\n\n /**\n * This is a reimplementation of the Go H1 hash algorithm found at https://github.com/golang/mod/blob/master/sumdb/dirhash/hash.go\n * The package provides two function HashDir and HashZip where the first is for hashing the contents of a directory\n * and the second for doing the same but implicitly extracting the contents first.\n *\n * The problem starts with that there is a bug which leads to the fact that HashDir and HashZip do not return the same\n * hash if there are folders inside the content which should be hashed.\n *\n * In a folder structure such as\n * .\n * ├── Readme.md\n * └── readme-assets/\n * └── image.jpg\n *\n * HashDir will create a list of following entries which in turn will hash again\n * aaaaaaaaaaa Readme.md\\n\n * ccccccccccc readme-assets/image.jpg\\n\n *\n * HashZip in contrast will not filter out the directory itself but rather includes it in the hash list\n * aaaaaaaaaaa Readme.md\\n\n * bbbbbbbbbbb readme-assets/\\n\n * ccccccccccc readme-assets/image.jpg\\n\n *\n * As the resulting string is used to generate the final hash it will differ based on which function has been used.\n * The issue is tracked here: https://github.com/golang/go/issues/53448\n *\n * This implementation follows the intended implementation and filters out folder entries.\n * Terraform seems NOT to use HashZip for provider validation, but rather extracts it and then do the hash calculation\n * even as both are set up in their code base.\n * https://github.com/hashicorp/terraform/blob/3fdfbd69448b14a4982b3c62a5d36835956fcbaa/internal/getproviders/hash.go#L283-L305\n *\n * @param zipFilePath path to the zip file\n * @param extractPath path to where to temporarily extract the data\n */\n static async hashOfZipContent(\n zipFilePath: string,\n extractPath: string,\n ): Promise<string> {\n const zip = new AdmZip(zipFilePath);\n zip.extractAllTo(extractPath);\n const hash = await this.hashOfDir(extractPath);\n // delete extracted files\n await fs.rmCache(extractPath);\n\n return hash;\n }\n\n static async hashOfDir(dirPath: string): Promise<string> {\n const elements = await fs.listCacheDir(dirPath, { recursive: true });\n\n const sortedFileSystemObjects = elements.sort();\n return await TerraformProviderHash.hashElementList(\n dirPath,\n sortedFileSystemObjects,\n );\n }\n\n private static async _calculateSingleHash(\n build: TerraformBuild,\n cacheDir: string,\n ): Promise<string> {\n const downloadFileName = upath.join(cacheDir, build.filename);\n const extractPath = upath.join(cacheDir, 'extract', build.filename);\n logger.trace(\n `Downloading archive and generating hash for ${build.name}-${build.version}...`,\n );\n const startTime = Date.now();\n const readStream = TerraformProviderHash.http.stream(build.url);\n const writeStream = fs.createCacheWriteStream(downloadFileName);\n\n try {\n await fs.pipeline(readStream, writeStream);\n\n const hash = await this.hashOfZipContent(downloadFileName, extractPath);\n logger.debug(\n `Hash generation for ${build.url} took ${Date.now() - startTime}ms for ${build.name}-${build.version}`,\n );\n return hash;\n } finally {\n // delete zip file\n await fs.rmCache(downloadFileName);\n }\n }\n\n static calculateSingleHash(\n build: TerraformBuild,\n cacheDir: string,\n ): Promise<string> {\n return withCache(\n {\n namespace: `terraform-provider-hash`,\n key: `calculateSingleHash:${build.url}`,\n ttlMinutes: TerraformProviderHash.hashCacheTTL,\n },\n () => TerraformProviderHash._calculateSingleHash(build, cacheDir),\n );\n }\n\n static async calculateHashScheme1Hashes(\n builds: TerraformBuild[],\n ): Promise<string[]> {\n logger.debug(`Calculating hashes for ${builds.length} builds`);\n const cacheDir = await ensureCacheDir('terraform');\n\n // for each build download ZIP, extract content and generate hash for all containing files\n return p.map(builds, (build) => this.calculateSingleHash(build, cacheDir), {\n concurrency: 4,\n });\n }\n\n static async createHashes(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<string[] | null> {\n logger.debug(\n `Creating hashes for ${repository}@${version} (${registryURL})`,\n );\n const builds = await TerraformProviderHash.terraformDatasource.getBuilds(\n registryURL,\n repository,\n version,\n );\n if (!builds) {\n return null;\n }\n\n // check if the publisher uses one shasum file for all builds or separate ones\n // we deduplicate to reduce the number of API calls\n const shaUrls = deduplicateArray(\n builds.map((build) => build.shasums_url).filter(isNotNullOrUndefined),\n );\n\n logger.debug(\n `Getting zip hashes for ${shaUrls.length} shasum URL(s) for ${repository}@${version}`,\n );\n\n const zhHashes: string[] = [];\n for (const shaUrl of shaUrls) {\n const hashes =\n await TerraformProviderHash.terraformDatasource.getZipHashes(shaUrl);\n\n zhHashes.push(...coerceArray(hashes));\n }\n\n logger.debug(\n `Got ${zhHashes.length} zip hashes for ${repository}@${version}`,\n );\n\n const h1Hashes =\n await TerraformProviderHash.calculateHashScheme1Hashes(builds);\n\n const hashes = [];\n hashes.push(...h1Hashes.map((hash) => `h1:${hash}`));\n hashes.push(...zhHashes.map((hash) => `zh:${hash}`));\n\n // sorting the hash alphabetically as terraform does this as well\n return hashes.sort();\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "renovate",
|
|
3
3
|
"description": "Automated dependency updates. Flexible so you don't need to be.",
|
|
4
|
-
"version": "43.209.
|
|
4
|
+
"version": "43.209.5",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
"re2": "1.24.1"
|
|
211
211
|
},
|
|
212
212
|
"devDependencies": {
|
|
213
|
-
"@biomejs/biome": "2.4.
|
|
213
|
+
"@biomejs/biome": "2.4.16",
|
|
214
214
|
"@commander-js/extra-typings": "14.0.0",
|
|
215
215
|
"@containerbase/istanbul-reports-html": "2.0.5",
|
|
216
216
|
"@containerbase/semantic-release-pnpm": "1.4.1",
|