renovate 44.71.2 → 44.72.0
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/config/global.js.map +1 -1
- package/dist/config/options/index.js +2 -0
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/presets/internal/security.preset.js.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/config/validation.js.map +1 -1
- package/dist/logger/config-serializer.js +7 -7
- package/dist/logger/config-serializer.js.map +1 -1
- package/dist/modules/datasource/conan/schema.js.map +1 -1
- package/dist/modules/datasource/deb/index.js +1 -1
- package/dist/modules/datasource/deb/index.js.map +1 -1
- package/dist/modules/datasource/deb/packages.js +1 -1
- package/dist/modules/datasource/deb/packages.js.map +1 -1
- package/dist/modules/datasource/docker/schema.js +1 -1
- package/dist/modules/datasource/docker/schema.js.map +1 -1
- package/dist/modules/datasource/orb/schema.js.map +1 -1
- package/dist/modules/datasource/terraform-module/schema.js.map +1 -1
- package/dist/modules/datasource/terraform-provider/schema.js.map +1 -1
- package/dist/modules/manager/argocd/extract.js +17 -15
- package/dist/modules/manager/argocd/extract.js.map +1 -1
- package/dist/modules/manager/bazel-module/rules.js.map +1 -1
- package/dist/modules/manager/cargo/schema.js.map +1 -1
- package/dist/modules/manager/dockerfile/extract.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +10 -10
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/fleet/extract.js +16 -7
- package/dist/modules/manager/fleet/extract.js.map +1 -1
- package/dist/modules/manager/flux/extract.js +4 -8
- package/dist/modules/manager/flux/extract.js.map +1 -1
- package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
- package/dist/modules/manager/helmfile/extract.js +12 -12
- package/dist/modules/manager/helmfile/extract.js.map +1 -1
- package/dist/modules/manager/helmsman/extract.js +8 -10
- package/dist/modules/manager/helmsman/extract.js.map +1 -1
- package/dist/modules/manager/helmv3/oci.js +22 -1
- package/dist/modules/manager/helmv3/oci.js.map +1 -1
- package/dist/modules/manager/helmv3/utils.js +2 -7
- package/dist/modules/manager/helmv3/utils.js.map +1 -1
- package/dist/modules/manager/kustomize/extract.js +6 -10
- package/dist/modules/manager/kustomize/extract.js.map +1 -1
- package/dist/modules/manager/mise/extract.js +1 -1
- package/dist/modules/manager/mise/extract.js.map +1 -1
- package/dist/modules/manager/nix/extract.js +2 -2
- package/dist/modules/manager/nix/extract.js.map +1 -1
- package/dist/modules/manager/npm/extract/index.js.map +1 -1
- package/dist/modules/manager/npm/post-update/index.js.map +1 -1
- package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
- package/dist/modules/manager/ocb/extract.js +2 -2
- package/dist/modules/manager/ocb/extract.js.map +1 -1
- package/dist/modules/manager/pep723/utils.js +1 -1
- package/dist/modules/manager/pep723/utils.js.map +1 -1
- package/dist/modules/manager/pipenv/extract.js.map +1 -1
- package/dist/modules/manager/poetry/schema.js.map +1 -1
- package/dist/modules/manager/poetry/update-locked.js.map +1 -1
- package/dist/modules/manager/sveltos/extract.js +13 -19
- package/dist/modules/manager/sveltos/extract.js.map +1 -1
- package/dist/modules/manager/swift/artifacts.js +1 -1
- package/dist/modules/manager/swift/artifacts.js.map +1 -1
- package/dist/modules/manager/terraform/extractors/resources/helm-release.js +3 -10
- package/dist/modules/manager/terraform/extractors/resources/helm-release.js.map +1 -1
- package/dist/modules/manager/vendir/extract.js +3 -4
- package/dist/modules/manager/vendir/extract.js.map +1 -1
- package/dist/modules/platform/bitbucket/pr-cache.js.map +1 -1
- package/dist/modules/platform/forgejo/pr-cache.js.map +1 -1
- package/dist/modules/platform/gerrit/index.js.map +1 -1
- package/dist/modules/platform/gitea/pr-cache.js.map +1 -1
- package/dist/modules/platform/github/schema.js +1 -1
- package/dist/modules/platform/github/schema.js.map +1 -1
- package/dist/modules/platform/scm-manager/index.js.map +1 -1
- package/dist/modules/versioning/ruby/range.js.map +1 -1
- package/dist/util/cache/package/impl/redis.js.map +1 -1
- package/dist/util/cache/package/impl/sqlite.js.map +1 -1
- package/dist/util/cache/package/namespaces.js.map +1 -1
- package/dist/util/exec/index.js.map +1 -1
- package/dist/util/package-rules/merge-confidence.js +5 -0
- package/dist/util/package-rules/merge-confidence.js.map +1 -1
- package/dist/util/result.js.map +1 -1
- package/dist/util/yaml.js +1 -1
- package/dist/util/yaml.js.map +1 -1
- package/dist/workers/global/config/parse/additional-config-file.js +1 -1
- package/dist/workers/global/config/parse/additional-config-file.js.map +1 -1
- package/dist/workers/global/config/parse/file.js +1 -1
- package/dist/workers/global/config/parse/file.js.map +1 -1
- package/dist/workers/global/config/parse/host-rules-from-env.js.map +1 -1
- package/dist/workers/repository/dependency-dashboard.js.map +1 -1
- package/dist/workers/repository/error.js +1 -1
- package/dist/workers/repository/error.js.map +1 -1
- package/dist/workers/repository/index.js +1 -1
- package/dist/workers/repository/index.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/onboarding-branch-cache.js.map +1 -1
- package/dist/workers/repository/onboarding/pr/pr-list.js.map +1 -1
- package/dist/workers/repository/update/branch/index.js.map +1 -1
- package/package.json +7 -7
- package/renovate-schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/conan/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\nimport type { ReleaseResult } from '../types.ts';\nimport { conanDatasourceRegex } from './common.ts';\n\nexport const ConanCenterReleases = z\n .object({\n versions: z.record(z.string(), z.unknown()),\n })\n .transform(
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/conan/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\nimport type { ReleaseResult } from '../types.ts';\nimport { conanDatasourceRegex } from './common.ts';\n\nexport const ConanCenterReleases = z\n .object({\n versions: z.record(z.string(), z.unknown()),\n })\n .transform(({ versions }): ReleaseResult => ({\n releases: Object.keys(versions).map((version) => ({ version })),\n }))\n .nullable()\n .catch(null);\n\nexport const ConanJSON = z\n .object({\n results: z\n .string()\n .array()\n .transform((array) =>\n array.map((val) => val.match(conanDatasourceRegex)?.groups),\n )\n .pipe(\n LooseArray(\n z.object({\n name: z.string(),\n version: z.string(),\n userChannel: z.string(),\n }),\n ),\n ),\n })\n .transform(({ results }) => results)\n .nullable()\n .catch(null);\n\nexport const ConanRevisionJSON = z.object({\n revision: z.string(),\n time: z.string(),\n});\n\nexport const ConanLatestRevision = z\n .object({ revisions: z.unknown().array() })\n .transform(({ revisions }) => revisions[0])\n .pipe(ConanRevisionJSON)\n .transform(({ revision }) => revision)\n .nullable()\n .catch(null);\n\nexport const ConanProperties = z\n .object({\n properties: z.object({\n 'conan.package.url': z.union([\n z.string().transform((url) => [url]),\n z.string().array(),\n ]),\n }),\n })\n .transform(({ properties }) => {\n const sourceUrl = properties['conan.package.url'][0];\n return { sourceUrl };\n });\n"],"mappings":";;;;AAKA,MAAa,sBAAsB,EAChC,OAAO,EACN,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAC5C,CAAC,CAAC,CACD,WAAW,EAAE,gBAA+B,EAC3C,UAAU,OAAO,KAAK,QAAQ,CAAC,CAAC,KAAK,aAAa,EAAE,QAAQ,EAAE,EAChE,EAAE,CAAC,CACF,SAAS,CAAC,CACV,MAAM,IAAI;AAEb,MAAa,YAAY,EACtB,OAAO,EACN,SAAS,EACN,OAAO,CAAC,CACR,MAAM,CAAC,CACP,WAAW,UACV,MAAM,KAAK,QAAQ,IAAI,MAAM,oBAAoB,CAAC,EAAE,MAAM,CAC5D,CAAC,CACA,KACC,WACE,EAAE,OAAO;CACP,MAAM,EAAE,OAAO;CACf,SAAS,EAAE,OAAO;CAClB,aAAa,EAAE,OAAO;AACxB,CAAC,CACH,CACF,EACJ,CAAC,CAAC,CACD,WAAW,EAAE,cAAc,OAAO,CAAC,CACnC,SAAS,CAAC,CACV,MAAM,IAAI;AAEb,MAAa,oBAAoB,EAAE,OAAO;CACxC,UAAU,EAAE,OAAO;CACnB,MAAM,EAAE,OAAO;AACjB,CAAC;AAED,MAAa,sBAAsB,EAChC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAC1C,WAAW,EAAE,gBAAgB,UAAU,EAAE,CAAC,CAC1C,KAAK,iBAAiB,CAAC,CACvB,WAAW,EAAE,eAAe,QAAQ,CAAC,CACrC,SAAS,CAAC,CACV,MAAM,IAAI;AAEb,MAAa,kBAAkB,EAC5B,OAAO,EACN,YAAY,EAAE,OAAO,EACnB,qBAAqB,EAAE,MAAM,CAC3B,EAAE,OAAO,CAAC,CAAC,WAAW,QAAQ,CAAC,GAAG,CAAC,GACnC,EAAE,OAAO,CAAC,CAAC,MAAM,CACnB,CAAC,EACH,CAAC,EACH,CAAC,CAAC,CACD,WAAW,EAAE,iBAAiB;CAE7B,OAAO,EAAE,WADS,WAAW,oBAAoB,CAAC,GAC/B;AACrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["fs.createCacheReadStream"],"sources":["../../../../lib/modules/datasource/deb/index.ts"],"sourcesContent":["import readline from 'node:readline';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { packageKeys, requiredPackageKeys } from './common.ts';\nimport { downloadAndExtractPackage } from './packages.ts';\nimport {\n formatReleaseResult,\n releaseMetaInformationMatches,\n} from './release.ts';\nimport type { PackageDescription } from './types.ts';\nimport { constructComponentUrls } from './url.ts';\n\nexport class DebDatasource extends Datasource {\n static readonly id = 'deb';\n\n constructor() {\n super(DebDatasource.id);\n }\n\n /**\n * Users are able to specify custom Debian repositories as long as they follow\n * the Debian package repository format as specified here\n * @see{https://wiki.debian.org/DebianRepository/Format}\n */\n override readonly customRegistrySupport = true;\n\n /**\n * Users can specify multiple upstream repositories and the datasource will aggregate the release\n * @example\n * When specifying multiple dependencies both internal and external dependencies from internal/external artifactory\n */\n override readonly registryStrategy = 'merge';\n\n /**\n * The original apt source list file format is\n * deb uri distribution [component1] [component2] [...]\n * @see{https://wiki.debian.org/DebianRepository/Format}\n *\n * However, for Renovate, we require the registry URLs to be\n * valid URLs which is why the parameters are encoded in the URL.\n *\n * The following query parameters are required:\n * - components: comma separated list of components\n * - suite: stable, oldstable or other alias for a release, either this or release must be given like buster\n * - binaryArch: e.g. amd64 resolves to http://deb.debian.org/debian/dists/stable/non-free/binary-amd64/\n */\n override readonly defaultRegistryUrls = [\n 'https://deb.debian.org/debian?suite=stable&components=main,contrib,non-free&binaryArch=amd64',\n ];\n\n override readonly defaultVersioning = 'deb';\n\n /**\n * Parses the extracted package index file.\n *\n * @param extractedFile - The path to the extracted package file.\n * @param lastTimestamp - The timestamp of the last modification.\n * @returns a list of packages with minimal Metadata.\n */\n private async _parseExtractedPackageIndex(\n extractedFile: string,\n _lastTimestamp: Date,\n ): Promise<Record<string, PackageDescription[]>> {\n // read line by line to avoid high memory consumption as the extracted Packages\n // files can be multiple MBs in size\n const rl = readline.createInterface({\n input: fs.createCacheReadStream(extractedFile),\n terminal: false,\n });\n\n let currentPackage: PackageDescription = {};\n // A Package Index can contain multiple Versions of the package on private Artifactory (e.g. Jfrog)\n const allPackages: Record<string, PackageDescription[]> = {};\n\n for await (const line of rl) {\n if (line === '') {\n // All information of the package are available, add to the list of packages\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n currentPackage = {};\n }\n } else {\n for (const key of packageKeys) {\n if (line.startsWith(`${key}:`)) {\n currentPackage[key] = line.substring(key.length + 1).trim();\n break;\n }\n }\n }\n }\n\n // Check the last package after file reading is complete\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n }\n\n return allPackages;\n }\n\n parseExtractedPackageIndex(\n extractedFile: string,\n lastTimestamp: Date,\n ): Promise<Record<string, PackageDescription[]>> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: `${extractedFile}:${lastTimestamp.getTime()}`,\n ttlMinutes: 24 * 60,\n },\n () => this._parseExtractedPackageIndex(extractedFile, lastTimestamp),\n );\n }\n\n private async _getPackageIndex(\n componentUrl: string,\n ): Promise<Record<string, PackageDescription[]>> {\n const { extractedFile, lastTimestamp } = await downloadAndExtractPackage(\n componentUrl,\n this.http,\n );\n return await this.parseExtractedPackageIndex(extractedFile, lastTimestamp);\n }\n\n getPackageIndex(\n componentUrl: string,\n ): Promise<Record<string, PackageDescription[]>> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: componentUrl,\n },\n () => this._getPackageIndex(componentUrl),\n );\n }\n\n /**\n * Fetches the release information for a given package from the registry URL.\n *\n * @param config - Configuration for fetching releases.\n * @returns The release result if the package is found, otherwise null.\n */\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const componentUrls = constructComponentUrls(registryUrl);\n let aggregatedRelease: ReleaseResult | null = null;\n\n for (const componentUrl of componentUrls) {\n try {\n const packageIndex = await this.getPackageIndex(componentUrl);\n const parsedPackages = packageIndex[packageName];\n\n if (parsedPackages) {\n const newRelease = formatReleaseResult(parsedPackages);\n if (aggregatedRelease === null) {\n aggregatedRelease = newRelease;\n } else {\n if (!releaseMetaInformationMatches(aggregatedRelease, newRelease)) {\n logger.warn(\n { packageName },\n 'Package occurred in more than one repository with different meta information. Aggregating releases anyway.',\n );\n }\n aggregatedRelease.releases.push(...newRelease.releases);\n }\n }\n } catch (error) {\n logger.debug(\n { componentUrl, error },\n 'Skipping component due to an error',\n );\n }\n }\n\n return aggregatedRelease;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAeA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;;;;;;CAOA,wBAA0C;;;;;;CAO1C,mBAAqC;;;;;;;;;;;;;;CAerC,sBAAwC,CACtC,8FACF;CAEA,oBAAsC;;;;;;;;CAStC,MAAc,4BACZ,eACA,gBAC+C;EAG/C,MAAM,KAAK,SAAS,gBAAgB;GAClC,OAAOA,sBAAyB,aAAa;GAC7C,UAAU;EACZ,CAAC;EAED,IAAI,iBAAqC,CAAC;EAE1C,MAAM,cAAoD,CAAC;EAE3D,WAAW,MAAM,QAAQ,IACvB,IAAI,SAAS,IAEP;OAAA,oBAAoB,OAAO,QAAQ,OAAO,cAAc,GAAG;IAC7D,IAAI,CAAC,YAAY,eAAe,UAC9B,YAAY,eAAe,WAAY,CAAC;IAE1C,YAAY,eAAe,QAAS,CAAC,KAAK,cAAc;IACxD,iBAAiB,CAAC;GACpB;SAEA,KAAK,MAAM,OAAO,aAChB,IAAI,KAAK,WAAW,GAAG,IAAI,EAAE,GAAG;GAC9B,eAAe,OAAO,KAAK,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK;GAC1D;EACF;EAMN,IAAI,oBAAoB,OAAO,QAAQ,OAAO,cAAc,GAAG;GAC7D,IAAI,CAAC,YAAY,eAAe,UAC9B,YAAY,eAAe,WAAY,CAAC;GAE1C,YAAY,eAAe,QAAS,CAAC,KAAK,cAAc;EAC1D;EAEA,OAAO;CACT;CAEA,2BACE,eACA,eAC+C;EAC/C,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK,GAAG,cAAc,GAAG,cAAc,QAAQ;GAC/C,YAAY;EACd,SACM,KAAK,4BAA4B,eAAe,aAAa,CACrE;CACF;CAEA,MAAc,iBACZ,cAC+C;EAC/C,MAAM,EAAE,eAAe,kBAAkB,MAAM,0BAC7C,cACA,KAAK,IACP;EACA,OAAO,MAAM,KAAK,2BAA2B,eAAe,aAAa;CAC3E;CAEA,gBACE,cAC+C;EAC/C,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK;EACP,SACM,KAAK,iBAAiB,YAAY,CAC1C;CACF;;;;;;;CAQA,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,gBAAgB,uBAAuB,WAAW;EACxD,IAAI,oBAA0C;EAE9C,KAAK,MAAM,gBAAgB,eACzB,IAAI;GAEF,MAAM,kBAAiB,MADI,KAAK,gBAAgB,YAAY,EAAA,CACxB;GAEpC,IAAI,gBAAgB;IAClB,MAAM,aAAa,oBAAoB,cAAc;IACrD,IAAI,sBAAsB,MACxB,oBAAoB;SACf;KACL,IAAI,CAAC,8BAA8B,mBAAmB,UAAU,GAC9D,OAAO,KACL,EAAE,YAAY,GACd,4GACF;KAEF,kBAAkB,SAAS,KAAK,GAAG,WAAW,QAAQ;IACxD;GACF;EACF,SAAS,OAAO;GACd,OAAO,MACL;IAAE;IAAc;GAAM,
|
|
1
|
+
{"version":3,"file":"index.js","names":["fs.createCacheReadStream"],"sources":["../../../../lib/modules/datasource/deb/index.ts"],"sourcesContent":["import readline from 'node:readline';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { packageKeys, requiredPackageKeys } from './common.ts';\nimport { downloadAndExtractPackage } from './packages.ts';\nimport {\n formatReleaseResult,\n releaseMetaInformationMatches,\n} from './release.ts';\nimport type { PackageDescription } from './types.ts';\nimport { constructComponentUrls } from './url.ts';\n\nexport class DebDatasource extends Datasource {\n static readonly id = 'deb';\n\n constructor() {\n super(DebDatasource.id);\n }\n\n /**\n * Users are able to specify custom Debian repositories as long as they follow\n * the Debian package repository format as specified here\n * @see{https://wiki.debian.org/DebianRepository/Format}\n */\n override readonly customRegistrySupport = true;\n\n /**\n * Users can specify multiple upstream repositories and the datasource will aggregate the release\n * @example\n * When specifying multiple dependencies both internal and external dependencies from internal/external artifactory\n */\n override readonly registryStrategy = 'merge';\n\n /**\n * The original apt source list file format is\n * deb uri distribution [component1] [component2] [...]\n * @see{https://wiki.debian.org/DebianRepository/Format}\n *\n * However, for Renovate, we require the registry URLs to be\n * valid URLs which is why the parameters are encoded in the URL.\n *\n * The following query parameters are required:\n * - components: comma separated list of components\n * - suite: stable, oldstable or other alias for a release, either this or release must be given like buster\n * - binaryArch: e.g. amd64 resolves to http://deb.debian.org/debian/dists/stable/non-free/binary-amd64/\n */\n override readonly defaultRegistryUrls = [\n 'https://deb.debian.org/debian?suite=stable&components=main,contrib,non-free&binaryArch=amd64',\n ];\n\n override readonly defaultVersioning = 'deb';\n\n /**\n * Parses the extracted package index file.\n *\n * @param extractedFile - The path to the extracted package file.\n * @param lastTimestamp - The timestamp of the last modification.\n * @returns a list of packages with minimal Metadata.\n */\n private async _parseExtractedPackageIndex(\n extractedFile: string,\n _lastTimestamp: Date,\n ): Promise<Record<string, PackageDescription[]>> {\n // read line by line to avoid high memory consumption as the extracted Packages\n // files can be multiple MBs in size\n const rl = readline.createInterface({\n input: fs.createCacheReadStream(extractedFile),\n terminal: false,\n });\n\n let currentPackage: PackageDescription = {};\n // A Package Index can contain multiple Versions of the package on private Artifactory (e.g. Jfrog)\n const allPackages: Record<string, PackageDescription[]> = {};\n\n for await (const line of rl) {\n if (line === '') {\n // All information of the package are available, add to the list of packages\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n currentPackage = {};\n }\n } else {\n for (const key of packageKeys) {\n if (line.startsWith(`${key}:`)) {\n currentPackage[key] = line.substring(key.length + 1).trim();\n break;\n }\n }\n }\n }\n\n // Check the last package after file reading is complete\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n }\n\n return allPackages;\n }\n\n parseExtractedPackageIndex(\n extractedFile: string,\n lastTimestamp: Date,\n ): Promise<Record<string, PackageDescription[]>> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: `${extractedFile}:${lastTimestamp.getTime()}`,\n ttlMinutes: 24 * 60,\n },\n () => this._parseExtractedPackageIndex(extractedFile, lastTimestamp),\n );\n }\n\n private async _getPackageIndex(\n componentUrl: string,\n ): Promise<Record<string, PackageDescription[]>> {\n const { extractedFile, lastTimestamp } = await downloadAndExtractPackage(\n componentUrl,\n this.http,\n );\n return await this.parseExtractedPackageIndex(extractedFile, lastTimestamp);\n }\n\n getPackageIndex(\n componentUrl: string,\n ): Promise<Record<string, PackageDescription[]>> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: componentUrl,\n },\n () => this._getPackageIndex(componentUrl),\n );\n }\n\n /**\n * Fetches the release information for a given package from the registry URL.\n *\n * @param config - Configuration for fetching releases.\n * @returns The release result if the package is found, otherwise null.\n */\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const componentUrls = constructComponentUrls(registryUrl);\n let aggregatedRelease: ReleaseResult | null = null;\n\n for (const componentUrl of componentUrls) {\n try {\n const packageIndex = await this.getPackageIndex(componentUrl);\n const parsedPackages = packageIndex[packageName];\n\n if (parsedPackages) {\n const newRelease = formatReleaseResult(parsedPackages);\n if (aggregatedRelease === null) {\n aggregatedRelease = newRelease;\n } else {\n if (!releaseMetaInformationMatches(aggregatedRelease, newRelease)) {\n logger.warn(\n { packageName },\n 'Package occurred in more than one repository with different meta information. Aggregating releases anyway.',\n );\n }\n aggregatedRelease.releases.push(...newRelease.releases);\n }\n }\n } catch (error) {\n logger.debug(\n { componentUrl, err: error },\n 'Skipping component due to an error',\n );\n }\n }\n\n return aggregatedRelease;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DebDatasource.id}`,\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAeA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;;;;;;CAOA,wBAA0C;;;;;;CAO1C,mBAAqC;;;;;;;;;;;;;;CAerC,sBAAwC,CACtC,8FACF;CAEA,oBAAsC;;;;;;;;CAStC,MAAc,4BACZ,eACA,gBAC+C;EAG/C,MAAM,KAAK,SAAS,gBAAgB;GAClC,OAAOA,sBAAyB,aAAa;GAC7C,UAAU;EACZ,CAAC;EAED,IAAI,iBAAqC,CAAC;EAE1C,MAAM,cAAoD,CAAC;EAE3D,WAAW,MAAM,QAAQ,IACvB,IAAI,SAAS,IAEP;OAAA,oBAAoB,OAAO,QAAQ,OAAO,cAAc,GAAG;IAC7D,IAAI,CAAC,YAAY,eAAe,UAC9B,YAAY,eAAe,WAAY,CAAC;IAE1C,YAAY,eAAe,QAAS,CAAC,KAAK,cAAc;IACxD,iBAAiB,CAAC;GACpB;SAEA,KAAK,MAAM,OAAO,aAChB,IAAI,KAAK,WAAW,GAAG,IAAI,EAAE,GAAG;GAC9B,eAAe,OAAO,KAAK,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK;GAC1D;EACF;EAMN,IAAI,oBAAoB,OAAO,QAAQ,OAAO,cAAc,GAAG;GAC7D,IAAI,CAAC,YAAY,eAAe,UAC9B,YAAY,eAAe,WAAY,CAAC;GAE1C,YAAY,eAAe,QAAS,CAAC,KAAK,cAAc;EAC1D;EAEA,OAAO;CACT;CAEA,2BACE,eACA,eAC+C;EAC/C,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK,GAAG,cAAc,GAAG,cAAc,QAAQ;GAC/C,YAAY;EACd,SACM,KAAK,4BAA4B,eAAe,aAAa,CACrE;CACF;CAEA,MAAc,iBACZ,cAC+C;EAC/C,MAAM,EAAE,eAAe,kBAAkB,MAAM,0BAC7C,cACA,KAAK,IACP;EACA,OAAO,MAAM,KAAK,2BAA2B,eAAe,aAAa;CAC3E;CAEA,gBACE,cAC+C;EAC/C,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK;EACP,SACM,KAAK,iBAAiB,YAAY,CAC1C;CACF;;;;;;;CAQA,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,gBAAgB,uBAAuB,WAAW;EACxD,IAAI,oBAA0C;EAE9C,KAAK,MAAM,gBAAgB,eACzB,IAAI;GAEF,MAAM,kBAAiB,MADI,KAAK,gBAAgB,YAAY,EAAA,CACxB;GAEpC,IAAI,gBAAgB;IAClB,MAAM,aAAa,oBAAoB,cAAc;IACrD,IAAI,sBAAsB,MACxB,oBAAoB;SACf;KACL,IAAI,CAAC,8BAA8B,mBAAmB,UAAU,GAC9D,OAAO,KACL,EAAE,YAAY,GACd,4GACF;KAEF,kBAAkB,SAAS,KAAK,GAAG,WAAW,QAAQ;IACxD;GACF;EACF,SAAS,OAAO;GACd,OAAO,MACL;IAAE;IAAc,KAAK;GAAM,GAC3B,oCACF;EACF;EAGF,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
|
|
@@ -31,7 +31,7 @@ async function downloadAndExtractPackage(componentUrl, http) {
|
|
|
31
31
|
compressedFile,
|
|
32
32
|
componentUrl,
|
|
33
33
|
compression,
|
|
34
|
-
|
|
34
|
+
err: error
|
|
35
35
|
}, "Failed to extract package file from compressed file");
|
|
36
36
|
} finally {
|
|
37
37
|
await rmCache(compressedFile);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packages.js","names":["fs.ensureCacheDir","fs.rmCache","fs.createCacheWriteStream","fs.pipeline"],"sources":["../../../../lib/modules/datasource/deb/packages.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport {\n computeFileChecksum,\n parseChecksumsFromInRelease,\n} from './checksum.ts';\nimport { cacheSubDir } from './common.ts';\nimport { checkIfModified, getBaseSuiteUrl } from './url.ts';\nimport { extract, getFileCreationTime } from './utils.ts';\n\n/**\n * Downloads and extracts a package file from a component URL.\n *\n * @param componentUrl - The URL of the component.\n * @returns The path to the extracted file and the last modification timestamp.\n * @throws Will throw an error if no valid compression method is found.\n */\nexport async function downloadAndExtractPackage(\n componentUrl: string,\n http: Http,\n): Promise<{ extractedFile: string; lastTimestamp: Date }> {\n const packageUrlHash = toSha256(componentUrl);\n const fullCacheDir = await fs.ensureCacheDir(cacheSubDir);\n const extractedFile = upath.join(fullCacheDir, `${packageUrlHash}.txt`);\n let lastTimestamp = await getFileCreationTime(extractedFile);\n\n const compression = 'gz';\n const compressedFile = upath.join(\n fullCacheDir,\n `${randomUUID()}_${packageUrlHash}.${compression}`,\n );\n\n const wasUpdated = await downloadPackageFile(\n componentUrl,\n compression,\n compressedFile,\n http,\n lastTimestamp,\n );\n\n if (wasUpdated || !lastTimestamp) {\n try {\n await extract(compressedFile, compression, extractedFile);\n lastTimestamp = await getFileCreationTime(extractedFile);\n } catch (error) {\n logger.warn(\n {\n compressedFile,\n componentUrl,\n compression,\n
|
|
1
|
+
{"version":3,"file":"packages.js","names":["fs.ensureCacheDir","fs.rmCache","fs.createCacheWriteStream","fs.pipeline"],"sources":["../../../../lib/modules/datasource/deb/packages.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport {\n computeFileChecksum,\n parseChecksumsFromInRelease,\n} from './checksum.ts';\nimport { cacheSubDir } from './common.ts';\nimport { checkIfModified, getBaseSuiteUrl } from './url.ts';\nimport { extract, getFileCreationTime } from './utils.ts';\n\n/**\n * Downloads and extracts a package file from a component URL.\n *\n * @param componentUrl - The URL of the component.\n * @returns The path to the extracted file and the last modification timestamp.\n * @throws Will throw an error if no valid compression method is found.\n */\nexport async function downloadAndExtractPackage(\n componentUrl: string,\n http: Http,\n): Promise<{ extractedFile: string; lastTimestamp: Date }> {\n const packageUrlHash = toSha256(componentUrl);\n const fullCacheDir = await fs.ensureCacheDir(cacheSubDir);\n const extractedFile = upath.join(fullCacheDir, `${packageUrlHash}.txt`);\n let lastTimestamp = await getFileCreationTime(extractedFile);\n\n const compression = 'gz';\n const compressedFile = upath.join(\n fullCacheDir,\n `${randomUUID()}_${packageUrlHash}.${compression}`,\n );\n\n const wasUpdated = await downloadPackageFile(\n componentUrl,\n compression,\n compressedFile,\n http,\n lastTimestamp,\n );\n\n if (wasUpdated || !lastTimestamp) {\n try {\n await extract(compressedFile, compression, extractedFile);\n lastTimestamp = await getFileCreationTime(extractedFile);\n } catch (error) {\n logger.warn(\n {\n compressedFile,\n componentUrl,\n compression,\n err: error,\n },\n 'Failed to extract package file from compressed file',\n );\n } finally {\n await fs.rmCache(compressedFile);\n }\n }\n\n if (!lastTimestamp) {\n //extracting went wrong\n throw new Error('Missing metadata in extracted package index file!');\n }\n\n return { extractedFile, lastTimestamp };\n}\n\n/**\n * Downloads a package file if it has been modified since the last download timestamp.\n *\n * @param basePackageUrl - The base URL of the package.\n * @param compression - The compression method used (e.g., 'gz').\n * @param compressedFile - The path where the compressed file will be saved.\n * @param lastDownloadTimestamp - The timestamp of the last download.\n * @returns True if the file was downloaded, otherwise false.\n */\nexport async function downloadPackageFile(\n basePackageUrl: string,\n compression: string,\n compressedFile: string,\n http: Http,\n lastDownloadTimestamp?: Date,\n): Promise<boolean> {\n const baseSuiteUrl = getBaseSuiteUrl(basePackageUrl);\n const packageUrl = joinUrlParts(basePackageUrl, `Packages.${compression}`);\n let needsToDownload = true;\n\n if (lastDownloadTimestamp) {\n needsToDownload = await checkIfModified(\n packageUrl,\n lastDownloadTimestamp,\n http,\n );\n }\n\n if (!needsToDownload) {\n logger.debug(`No need to download ${packageUrl}, file is up to date.`);\n return false;\n }\n const readStream = http.stream(packageUrl);\n const writeStream = fs.createCacheWriteStream(compressedFile);\n await fs.pipeline(readStream, writeStream);\n logger.debug(\n { url: packageUrl, targetFile: compressedFile },\n 'Downloading Debian package file',\n );\n\n let inReleaseContent = '';\n\n try {\n inReleaseContent = await fetchInReleaseFile(baseSuiteUrl, http);\n } catch (error) {\n // This is expected to fail for Artifactory if GPG verification is not enabled\n logger.debug(\n { url: baseSuiteUrl, err: error },\n 'Could not fetch InRelease file',\n );\n }\n\n if (inReleaseContent) {\n const actualChecksum = await computeFileChecksum(compressedFile);\n const expectedChecksum = parseChecksumsFromInRelease(\n inReleaseContent,\n // path to the Package.gz file\n packageUrl.replace(`${baseSuiteUrl}/`, ''),\n );\n if (actualChecksum !== expectedChecksum) {\n await fs.rmCache(compressedFile);\n throw new Error('SHA256 checksum validation failed');\n }\n }\n\n return needsToDownload;\n}\n\n/**\n * Fetches the content of the InRelease file from the given base suite URL.\n *\n * @param baseReleaseUrl - The base URL of the suite (e.g., 'https://deb.debian.org/debian/dists/bullseye').\n * @returns resolves to the content of the InRelease file.\n * @throws An error if the InRelease file could not be downloaded.\n */\nexport async function fetchInReleaseFile(\n baseReleaseUrl: string,\n http: Http,\n): Promise<string> {\n const inReleaseUrl = joinUrlParts(baseReleaseUrl, 'InRelease');\n const response = await http.getText(inReleaseUrl);\n return response.body;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAsBA,eAAsB,0BACpB,cACA,MACyD;CACzD,MAAM,iBAAiB,SAAS,YAAY;CAC5C,MAAM,eAAe,MAAMA,eAAAA,KAA6B;CACxD,MAAM,gBAAgB,MAAM,KAAK,cAAc,GAAG,eAAe,KAAK;CACtE,IAAI,gBAAgB,MAAM,oBAAoB,aAAa;CAE3D,MAAM,cAAc;CACpB,MAAM,iBAAiB,MAAM,KAC3B,cACA,GAAG,WAAW,EAAE,GAAG,eAAe,GAAG,aACvC;CAUA,IAAI,MARqB,oBACvB,cACA,aACA,gBACA,MACA,aACF,KAEkB,CAAC,eACjB,IAAI;EACF,MAAM,QAAQ,gBAAgB,aAAa,aAAa;EACxD,gBAAgB,MAAM,oBAAoB,aAAa;CACzD,SAAS,OAAO;EACd,OAAO,KACL;GACE;GACA;GACA;GACA,KAAK;EACP,GACA,qDACF;CACF,UAAU;EACR,MAAMC,QAAW,cAAc;CACjC;CAGF,IAAI,CAAC,eAEH,MAAM,IAAI,MAAM,mDAAmD;CAGrE,OAAO;EAAE;EAAe;CAAc;AACxC;;;;;;;;;;AAWA,eAAsB,oBACpB,gBACA,aACA,gBACA,MACA,uBACkB;CAClB,MAAM,eAAe,gBAAgB,cAAc;CACnD,MAAM,aAAa,aAAa,gBAAgB,YAAY,aAAa;CACzE,IAAI,kBAAkB;CAEtB,IAAI,uBACF,kBAAkB,MAAM,gBACtB,YACA,uBACA,IACF;CAGF,IAAI,CAAC,iBAAiB;EACpB,OAAO,MAAM,uBAAuB,WAAW,sBAAsB;EACrE,OAAO;CACT;CACA,MAAM,aAAa,KAAK,OAAO,UAAU;CACzC,MAAM,cAAcC,uBAA0B,cAAc;CAC5D,MAAMC,SAAY,YAAY,WAAW;CACzC,OAAO,MACL;EAAE,KAAK;EAAY,YAAY;CAAe,GAC9C,iCACF;CAEA,IAAI,mBAAmB;CAEvB,IAAI;EACF,mBAAmB,MAAM,mBAAmB,cAAc,IAAI;CAChE,SAAS,OAAO;EAEd,OAAO,MACL;GAAE,KAAK;GAAc,KAAK;EAAM,GAChC,gCACF;CACF;CAEA,IAAI,kBAOE;MAAA,MANyB,oBAAoB,cAAc,MACtC,4BACvB,kBAEA,WAAW,QAAQ,GAAG,aAAa,IAAI,EAAE,CAEL,GAAG;GACvC,MAAMF,QAAW,cAAc;GAC/B,MAAM,IAAI,MAAM,mCAAmC;EACrD;;CAGF,OAAO;AACT;;;;;;;;AASA,eAAsB,mBACpB,gBACA,MACiB;CACjB,MAAM,eAAe,aAAa,gBAAgB,WAAW;CAE7D,QAAO,MADgB,KAAK,QAAQ,YAAY,EAAA,CAChC;AAClB"}
|
|
@@ -130,7 +130,7 @@ const DockerHubTagsPage = z.object({
|
|
|
130
130
|
results: LooseArray(DockerHubTag, {
|
|
131
131
|
/* v8 ignore next -- TODO: add test */
|
|
132
132
|
onError: ({ error }) => {
|
|
133
|
-
logger.debug({ error }, "Docker: Failed to parse some tags from Docker Hub");
|
|
133
|
+
logger.debug({ err: error }, "Docker: Failed to parse some tags from Docker Hub");
|
|
134
134
|
} })
|
|
135
135
|
});
|
|
136
136
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/docker/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport {\n DeepNullish,\n Json,\n LooseArray,\n Nullish,\n} from '../../../util/schema-utils/index.ts';\n\n// OCI manifests\n\n/**\n * OCI manifest object\n */\nexport const ManifestObject = z.object({\n schemaVersion: z.literal(2),\n mediaType: Nullish(z.string()),\n});\n\n/**\n * Oci descriptor\n * https://github.com/opencontainers/image-spec/blob/main/descriptor.md\n */\nexport const Descriptor = z.object({\n mediaType: z.string(),\n digest: z.string(),\n size: Nullish(z.number().int().gte(0)),\n annotations: Nullish(z.record(z.string(), z.string())),\n});\n/**\n * OCI platform properties\n * https://github.com/opencontainers/image-spec/blob/main/image-index.md\n */\nconst OciPlatform = Nullish(\n DeepNullish(\n z.object({\n architecture: z.string().optional(),\n }),\n ),\n);\n\n/**\n * OCI Image Configuration.\n *\n * Compatible with old docker configiguration.\n * https://github.com/opencontainers/image-spec/blob/main/config.md\n */\nexport const OciImageConfig = DeepNullish(\n z.object({\n // This is required by the spec, but probably not present in the wild.\n architecture: z.string().optional(),\n config: z\n .object({ Labels: z.record(z.string(), z.string()).optional() })\n .optional(),\n }),\n);\nexport type OciImageConfig = z.infer<typeof OciImageConfig>;\n\n/**\n * OCI Helm Configuration\n * https://helm.sh/docs/topics/charts/#the-chartyaml-file\n */\nexport const OciHelmConfig = DeepNullish(\n z.object({\n name: z.string(),\n version: z.string(),\n home: z.string().optional(),\n sources: z.array(z.string()).optional(),\n }),\n);\nexport type OciHelmConfig = z.infer<typeof OciHelmConfig>;\n\n/**\n * OCI Image Manifest\n * The same structure as docker image manifest, but mediaType is not required and is not present in the wild.\n * https://github.com/opencontainers/image-spec/blob/main/manifest.md\n */\nexport const OciImageManifest = ManifestObject.extend({\n mediaType: z.literal('application/vnd.oci.image.manifest.v1+json'),\n config: Descriptor.extend({\n mediaType: z.enum([\n 'application/vnd.oci.image.config.v1+json',\n 'application/vnd.cncf.helm.config.v1+json',\n 'application/vnd.devcontainers',\n 'application/vnd.oci.empty.v1+json',\n 'application/vnd.cncf.flux.config.v1+json',\n ]),\n }),\n annotations: Nullish(z.record(z.string(), z.string())),\n});\nexport type OciImageManifest = z.infer<typeof OciImageManifest>;\n\n/**\n * OCI Image List\n * mediaType is not required.\n * https://github.com/opencontainers/image-spec/blob/main/image-index.md\n */\nexport const OciImageIndexManifest = ManifestObject.extend({\n mediaType: z.literal('application/vnd.oci.image.index.v1+json'),\n manifests: LooseArray(\n Descriptor.extend({\n mediaType: z.enum([\n 'application/vnd.oci.image.manifest.v1+json',\n 'application/vnd.oci.image.index.v1+json',\n ]),\n platform: OciPlatform,\n }),\n ),\n annotations: Nullish(z.record(z.string(), z.string())),\n});\n\n// Old Docker manifests\n\n/**\n * Image Manifest\n * https://docs.docker.com/registry/spec/manifest-v2-2/#image-manifest\n */\nexport const DistributionManifest = ManifestObject.extend({\n mediaType: z.literal('application/vnd.docker.distribution.manifest.v2+json'),\n config: Descriptor.extend({\n mediaType: z.literal('application/vnd.docker.container.image.v1+json'),\n }),\n});\nexport type DistributionManifest = z.infer<typeof DistributionManifest>;\n\n/**\n * Manifest List\n * https://docs.docker.com/registry/spec/manifest-v2-2/#manifest-list\n */\nexport const DistributionListManifest = ManifestObject.extend({\n mediaType: z.literal(\n 'application/vnd.docker.distribution.manifest.list.v2+json',\n ),\n manifests: z.array(\n Descriptor.extend({\n mediaType: z.literal(\n 'application/vnd.docker.distribution.manifest.v2+json',\n ),\n platform: OciPlatform,\n }),\n ),\n});\n\n// Combined manifests\nexport const Manifest = ManifestObject.passthrough()\n .transform((value, ctx) => {\n if (value.mediaType === undefined) {\n if ('config' in value) {\n value.mediaType = 'application/vnd.oci.image.manifest.v1+json';\n } else if ('manifests' in value) {\n value.mediaType = 'application/vnd.oci.image.index.v1+json';\n } else {\n ctx.addIssue({\n code: 'custom',\n message: 'Invalid manifest, missing mediaType.',\n });\n return z.NEVER;\n }\n }\n return value;\n })\n .pipe(\n z.discriminatedUnion('mediaType', [\n DistributionManifest,\n DistributionListManifest,\n OciImageManifest,\n OciImageIndexManifest,\n ]),\n );\n\nexport type Manifest = z.infer<typeof Manifest>;\nexport const ManifestJson = Json.pipe(Manifest);\n\nexport const DockerHubTagImage = z.object({\n architecture: z.string().nullable().catch(null),\n digest: z.string().nullable().catch(null),\n});\nexport type DockerHubTagImage = z.infer<typeof DockerHubTagImage>;\n\nexport const DockerHubTag = z.object({\n id: z.number(),\n last_updated: z.string().datetime(),\n name: z.string(),\n tag_last_pushed: z.string().datetime().nullable().catch(null),\n digest: z.string().nullable().catch(null),\n images: z.array(DockerHubTagImage).catch([]),\n});\nexport type DockerHubTag = z.infer<typeof DockerHubTag>;\n\nexport const DockerHubTagsPage = z.object({\n count: z.number(),\n next: z.string().nullable().catch(null),\n results: LooseArray(DockerHubTag, {\n /* v8 ignore next -- TODO: add test */\n onError: ({ error }) => {\n logger.debug(\n { error },\n 'Docker: Failed to parse some tags from Docker Hub',\n );\n },\n }),\n});\n\n/**\n * Docker registry auth token response.\n * https://distribution.github.io/distribution/spec/auth/token/\n */\nexport const RegistryAuthToken = z.object({\n token: z.string().optional(),\n access_token: z.string().optional(),\n});\nexport type RegistryAuthToken = z.infer<typeof RegistryAuthToken>;\n\n/**\n * Docker registry tags list response.\n * https://distribution.github.io/distribution/spec/api/#listing-image-tags\n */\nexport const RegistryTagsList = z.object({\n tags: z.array(z.string()),\n});\nexport type RegistryTagsList = z.infer<typeof RegistryTagsList>;\n\n/**\n * Quay registry tags list response (Quay v1 API).\n */\nexport const QuayTagsResponse = z.object({\n tags: LooseArray(\n z.object({\n name: z.string(),\n }),\n ),\n has_additional: z.boolean().default(false),\n});\nexport type QuayTagsResponse = z.infer<typeof QuayTagsResponse>;\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/docker/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport {\n DeepNullish,\n Json,\n LooseArray,\n Nullish,\n} from '../../../util/schema-utils/index.ts';\n\n// OCI manifests\n\n/**\n * OCI manifest object\n */\nexport const ManifestObject = z.object({\n schemaVersion: z.literal(2),\n mediaType: Nullish(z.string()),\n});\n\n/**\n * Oci descriptor\n * https://github.com/opencontainers/image-spec/blob/main/descriptor.md\n */\nexport const Descriptor = z.object({\n mediaType: z.string(),\n digest: z.string(),\n size: Nullish(z.number().int().gte(0)),\n annotations: Nullish(z.record(z.string(), z.string())),\n});\n/**\n * OCI platform properties\n * https://github.com/opencontainers/image-spec/blob/main/image-index.md\n */\nconst OciPlatform = Nullish(\n DeepNullish(\n z.object({\n architecture: z.string().optional(),\n }),\n ),\n);\n\n/**\n * OCI Image Configuration.\n *\n * Compatible with old docker configiguration.\n * https://github.com/opencontainers/image-spec/blob/main/config.md\n */\nexport const OciImageConfig = DeepNullish(\n z.object({\n // This is required by the spec, but probably not present in the wild.\n architecture: z.string().optional(),\n config: z\n .object({ Labels: z.record(z.string(), z.string()).optional() })\n .optional(),\n }),\n);\nexport type OciImageConfig = z.infer<typeof OciImageConfig>;\n\n/**\n * OCI Helm Configuration\n * https://helm.sh/docs/topics/charts/#the-chartyaml-file\n */\nexport const OciHelmConfig = DeepNullish(\n z.object({\n name: z.string(),\n version: z.string(),\n home: z.string().optional(),\n sources: z.array(z.string()).optional(),\n }),\n);\nexport type OciHelmConfig = z.infer<typeof OciHelmConfig>;\n\n/**\n * OCI Image Manifest\n * The same structure as docker image manifest, but mediaType is not required and is not present in the wild.\n * https://github.com/opencontainers/image-spec/blob/main/manifest.md\n */\nexport const OciImageManifest = ManifestObject.extend({\n mediaType: z.literal('application/vnd.oci.image.manifest.v1+json'),\n config: Descriptor.extend({\n mediaType: z.enum([\n 'application/vnd.oci.image.config.v1+json',\n 'application/vnd.cncf.helm.config.v1+json',\n 'application/vnd.devcontainers',\n 'application/vnd.oci.empty.v1+json',\n 'application/vnd.cncf.flux.config.v1+json',\n ]),\n }),\n annotations: Nullish(z.record(z.string(), z.string())),\n});\nexport type OciImageManifest = z.infer<typeof OciImageManifest>;\n\n/**\n * OCI Image List\n * mediaType is not required.\n * https://github.com/opencontainers/image-spec/blob/main/image-index.md\n */\nexport const OciImageIndexManifest = ManifestObject.extend({\n mediaType: z.literal('application/vnd.oci.image.index.v1+json'),\n manifests: LooseArray(\n Descriptor.extend({\n mediaType: z.enum([\n 'application/vnd.oci.image.manifest.v1+json',\n 'application/vnd.oci.image.index.v1+json',\n ]),\n platform: OciPlatform,\n }),\n ),\n annotations: Nullish(z.record(z.string(), z.string())),\n});\n\n// Old Docker manifests\n\n/**\n * Image Manifest\n * https://docs.docker.com/registry/spec/manifest-v2-2/#image-manifest\n */\nexport const DistributionManifest = ManifestObject.extend({\n mediaType: z.literal('application/vnd.docker.distribution.manifest.v2+json'),\n config: Descriptor.extend({\n mediaType: z.literal('application/vnd.docker.container.image.v1+json'),\n }),\n});\nexport type DistributionManifest = z.infer<typeof DistributionManifest>;\n\n/**\n * Manifest List\n * https://docs.docker.com/registry/spec/manifest-v2-2/#manifest-list\n */\nexport const DistributionListManifest = ManifestObject.extend({\n mediaType: z.literal(\n 'application/vnd.docker.distribution.manifest.list.v2+json',\n ),\n manifests: z.array(\n Descriptor.extend({\n mediaType: z.literal(\n 'application/vnd.docker.distribution.manifest.v2+json',\n ),\n platform: OciPlatform,\n }),\n ),\n});\n\n// Combined manifests\nexport const Manifest = ManifestObject.passthrough()\n .transform((value, ctx) => {\n if (value.mediaType === undefined) {\n if ('config' in value) {\n value.mediaType = 'application/vnd.oci.image.manifest.v1+json';\n } else if ('manifests' in value) {\n value.mediaType = 'application/vnd.oci.image.index.v1+json';\n } else {\n ctx.addIssue({\n code: 'custom',\n message: 'Invalid manifest, missing mediaType.',\n });\n return z.NEVER;\n }\n }\n return value;\n })\n .pipe(\n z.discriminatedUnion('mediaType', [\n DistributionManifest,\n DistributionListManifest,\n OciImageManifest,\n OciImageIndexManifest,\n ]),\n );\n\nexport type Manifest = z.infer<typeof Manifest>;\nexport const ManifestJson = Json.pipe(Manifest);\n\nexport const DockerHubTagImage = z.object({\n architecture: z.string().nullable().catch(null),\n digest: z.string().nullable().catch(null),\n});\nexport type DockerHubTagImage = z.infer<typeof DockerHubTagImage>;\n\nexport const DockerHubTag = z.object({\n id: z.number(),\n last_updated: z.string().datetime(),\n name: z.string(),\n tag_last_pushed: z.string().datetime().nullable().catch(null),\n digest: z.string().nullable().catch(null),\n images: z.array(DockerHubTagImage).catch([]),\n});\nexport type DockerHubTag = z.infer<typeof DockerHubTag>;\n\nexport const DockerHubTagsPage = z.object({\n count: z.number(),\n next: z.string().nullable().catch(null),\n results: LooseArray(DockerHubTag, {\n /* v8 ignore next -- TODO: add test */\n onError: ({ error }) => {\n logger.debug(\n { err: error },\n 'Docker: Failed to parse some tags from Docker Hub',\n );\n },\n }),\n});\n\n/**\n * Docker registry auth token response.\n * https://distribution.github.io/distribution/spec/auth/token/\n */\nexport const RegistryAuthToken = z.object({\n token: z.string().optional(),\n access_token: z.string().optional(),\n});\nexport type RegistryAuthToken = z.infer<typeof RegistryAuthToken>;\n\n/**\n * Docker registry tags list response.\n * https://distribution.github.io/distribution/spec/api/#listing-image-tags\n */\nexport const RegistryTagsList = z.object({\n tags: z.array(z.string()),\n});\nexport type RegistryTagsList = z.infer<typeof RegistryTagsList>;\n\n/**\n * Quay registry tags list response (Quay v1 API).\n */\nexport const QuayTagsResponse = z.object({\n tags: LooseArray(\n z.object({\n name: z.string(),\n }),\n ),\n has_additional: z.boolean().default(false),\n});\nexport type QuayTagsResponse = z.infer<typeof QuayTagsResponse>;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/orb/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { DeepNullish, LooseArray } from '../../../util/schema-utils/index.ts';\nimport { MaybeTimestamp } from '../../../util/timestamp.ts';\nimport type { Release } from '../types.ts';\n\nconst OrbVersion = z\n .object({\n attributes: z.object({\n version: z.string(),\n created_at: MaybeTimestamp,\n }),\n })\n .transform(
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/orb/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { DeepNullish, LooseArray } from '../../../util/schema-utils/index.ts';\nimport { MaybeTimestamp } from '../../../util/timestamp.ts';\nimport type { Release } from '../types.ts';\n\nconst OrbVersion = z\n .object({\n attributes: z.object({\n version: z.string(),\n created_at: MaybeTimestamp,\n }),\n })\n .transform(({ attributes }): Release => ({\n version: attributes.version,\n releaseTimestamp: attributes.created_at,\n }));\n\nconst OrbPackage = z\n .object({\n attributes: DeepNullish(\n z.object({\n is_private: z.boolean().optional(),\n home_url: z.string().optional(),\n }),\n ),\n references: z\n .object({\n orb_versions: LooseArray(OrbVersion).catch([]),\n })\n .default({ orb_versions: [] }),\n })\n .transform(({ attributes, references }) => ({\n homeUrl: attributes.home_url,\n isPrivate: !!attributes.is_private,\n releases: references.orb_versions,\n }));\n\nexport const OrbPackagesResponse = z.object({\n data: z.array(OrbPackage),\n});\n"],"mappings":";;;;AAKA,MAAM,aAAa,EAChB,OAAO,EACN,YAAY,EAAE,OAAO;CACnB,SAAS,EAAE,OAAO;CAClB,YAAY;AACd,CAAC,EACH,CAAC,CAAC,CACD,WAAW,EAAE,kBAA2B;CACvC,SAAS,WAAW;CACpB,kBAAkB,WAAW;AAC/B,EAAE;AAEJ,MAAM,aAAa,EAChB,OAAO;CACN,YAAY,YACV,EAAE,OAAO;EACP,YAAY,EAAE,QAAQ,CAAC,CAAC,SAAS;EACjC,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS;CAChC,CAAC,CACH;CACA,YAAY,EACT,OAAO,EACN,cAAc,WAAW,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,EAC/C,CAAC,CAAC,CACD,QAAQ,EAAE,cAAc,CAAC,EAAE,CAAC;AACjC,CAAC,CAAC,CACD,WAAW,EAAE,YAAY,kBAAkB;CAC1C,SAAS,WAAW;CACpB,WAAW,CAAC,CAAC,WAAW;CACxB,UAAU,WAAW;AACvB,EAAE;AAEJ,MAAa,sBAAsB,EAAE,OAAO,EAC1C,MAAM,EAAE,MAAM,UAAU,EAC1B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/terraform-module/schema.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { 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\nexport const ServiceDiscoveryResponse = z.object({\n 'modules.v1': z.string().optional(),\n 'providers.v1': z.string().optional(),\n});\n\nexport type ServiceDiscoveryResponse = z.infer<typeof ServiceDiscoveryResponse>;\nexport type ServiceDiscoveryEndpointType = keyof ServiceDiscoveryResponse;\n\nexport const TerraformModuleResponse = z\n .object({\n source: z.string().optional(),\n versions: z.array(z.string()),\n version: z.string(),\n published_at: MaybeTimestamp,\n })\n .transform((resource) => ({\n source: resource.source,\n versions: resource.versions.map(
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/terraform-module/schema.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { 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\nexport const ServiceDiscoveryResponse = z.object({\n 'modules.v1': z.string().optional(),\n 'providers.v1': z.string().optional(),\n});\n\nexport type ServiceDiscoveryResponse = z.infer<typeof ServiceDiscoveryResponse>;\nexport type ServiceDiscoveryEndpointType = keyof ServiceDiscoveryResponse;\n\nexport const TerraformModuleResponse = z\n .object({\n source: z.string().optional(),\n versions: z.array(z.string()),\n version: z.string(),\n published_at: MaybeTimestamp,\n })\n .transform((resource) => ({\n source: resource.source,\n versions: resource.versions.map((version): Release => ({\n version,\n ...(version === resource.version && {\n releaseTimestamp: resource.published_at,\n }),\n })),\n }));\n\nexport type TerraformModuleResponse = z.infer<typeof TerraformModuleResponse>;\n\nconst ModuleAttributes = z.object({\n source: z.string().optional(),\n});\n\nconst ModuleVersion = z\n .object({\n type: z.literal('module-versions'),\n attributes: z.object({\n version: z.string(),\n 'published-at': MaybeTimestamp,\n }),\n })\n .transform((resource): Release => ({\n version: resource.attributes.version,\n releaseTimestamp: resource.attributes['published-at'],\n }));\n\nexport const TerraformModuleV2Response = z\n .object({\n data: z.object({\n attributes: ModuleAttributes,\n }),\n included: LooseArray(ModuleVersion).catch([]),\n })\n .transform((response): ReleaseResult => ({\n sourceUrl: response.data.attributes.source,\n releases: response.included,\n }));\n\nexport type TerraformModuleV2Response = z.infer<\n typeof TerraformModuleV2Response\n>;\n\nconst OpenTofuModuleVersion = z\n .object({\n id: z.string(),\n published: MaybeTimestamp,\n })\n .transform((version): Release => ({\n version: version.id.replace(regEx(/^v/), ''),\n releaseTimestamp: version.published,\n }));\n\nexport const OpenTofuModuleDocsResponse = z\n .object({\n versions: LooseArray(OpenTofuModuleVersion).catch([]),\n })\n .transform((response): ReleaseResult => ({\n releases: response.versions,\n }));\n\nexport type OpenTofuModuleDocsResponse = z.infer<\n typeof OpenTofuModuleDocsResponse\n>;\n\nexport const TerraformModuleVersion = z\n .object({ version: z.string() })\n .transform(({ version }): Release => ({ version }));\n\nexport const TerraformModule = z\n .object({\n versions: LooseArray(TerraformModuleVersion),\n source: z.string().optional(),\n })\n .refine(\n ({ versions }) => isNonEmptyArray(versions),\n 'Empty versions array in module response',\n );\n\nexport const ProtocolModuleResponse = z\n .object({ modules: LooseArray(TerraformModule) })\n .refine(\n ({ modules }) => isNonEmptyArray(modules),\n 'Empty response from `/v1/modules` endpoint',\n )\n .transform(({ modules: [module] }) => module);\n\nexport type ProtocolModuleResponse = z.infer<typeof ProtocolModuleResponse>;\n"],"mappings":";;;;;;AAOA,MAAa,2BAA2B,EAAE,OAAO;CAC/C,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,gBAAgB,EAAE,OAAO,CAAC,CAAC,SAAS;AACtC,CAAC;AAKD,MAAa,0BAA0B,EACpC,OAAO;CACN,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;CAC5B,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC;CAC5B,SAAS,EAAE,OAAO;CAClB,cAAc;AAChB,CAAC,CAAC,CACD,WAAW,cAAc;CACxB,QAAQ,SAAS;CACjB,UAAU,SAAS,SAAS,KAAK,aAAsB;EACrD;EACA,GAAI,YAAY,SAAS,WAAW,EAClC,kBAAkB,SAAS,aAC7B;CACF,EAAE;AACJ,EAAE;AAIJ,MAAM,mBAAmB,EAAE,OAAO,EAChC,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS,EAC9B,CAAC;AAED,MAAM,gBAAgB,EACnB,OAAO;CACN,MAAM,EAAE,QAAQ,iBAAiB;CACjC,YAAY,EAAE,OAAO;EACnB,SAAS,EAAE,OAAO;EAClB,gBAAgB;CAClB,CAAC;AACH,CAAC,CAAC,CACD,WAAW,cAAuB;CACjC,SAAS,SAAS,WAAW;CAC7B,kBAAkB,SAAS,WAAW;AACxC,EAAE;AAEJ,MAAa,4BAA4B,EACtC,OAAO;CACN,MAAM,EAAE,OAAO,EACb,YAAY,iBACd,CAAC;CACD,UAAU,WAAW,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC,CAAC,CACD,WAAW,cAA6B;CACvC,WAAW,SAAS,KAAK,WAAW;CACpC,UAAU,SAAS;AACrB,EAAE;AAMJ,MAAM,wBAAwB,EAC3B,OAAO;CACN,IAAI,EAAE,OAAO;CACb,WAAW;AACb,CAAC,CAAC,CACD,WAAW,aAAsB;CAChC,SAAS,QAAQ,GAAG,QAAQ,MAAM,IAAI,GAAG,EAAE;CAC3C,kBAAkB,QAAQ;AAC5B,EAAE;AAEJ,MAAa,6BAA6B,EACvC,OAAO,EACN,UAAU,WAAW,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC,EACtD,CAAC,CAAC,CACD,WAAW,cAA6B,EACvC,UAAU,SAAS,SACrB,EAAE;AAMJ,MAAa,yBAAyB,EACnC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAC/B,WAAW,EAAE,eAAwB,EAAE,QAAQ,EAAE;AAEpD,MAAa,kBAAkB,EAC5B,OAAO;CACN,UAAU,WAAW,sBAAsB;CAC3C,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;AAC9B,CAAC,CAAC,CACD,QACE,EAAE,eAAe,gBAAgB,QAAQ,GAC1C,yCACF;AAEF,MAAa,yBAAyB,EACnC,OAAO,EAAE,SAAS,WAAW,eAAe,EAAE,CAAC,CAAC,CAChD,QACE,EAAE,cAAc,gBAAgB,OAAO,GACxC,4CACF,CAAC,CACA,WAAW,EAAE,SAAS,CAAC,cAAc,MAAM"}
|
|
@@ -1 +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, LooseRecord } 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(
|
|
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, LooseRecord } 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((resource): Release => ({\n version: resource.attributes.version,\n releaseTimestamp: resource.attributes['published-at'],\n }));\n\nexport const TerraformProviderV2Response = z\n .object({\n data: z.object({\n attributes: ProviderAttributes,\n }),\n included: LooseArray(ProviderVersion).catch([]),\n })\n .transform((response): ReleaseResult => ({\n sourceUrl: response.data.attributes.source,\n releases: response.included,\n }));\n\nexport type TerraformProviderV2Response = z.infer<\n typeof TerraformProviderV2Response\n>;\n\nconst OpenTofuProviderVersion = z\n .object({\n id: z.string(),\n published: MaybeTimestamp,\n })\n .transform((version): Release => ({\n version: version.id.replace(regEx(/^v/), ''),\n releaseTimestamp: version.published,\n }));\n\nexport const OpenTofuProviderDocsResponse = z\n .object({\n versions: LooseArray(OpenTofuProviderVersion).catch([]),\n })\n .transform((response): ReleaseResult => ({\n releases: response.versions,\n }));\n\nexport type OpenTofuProviderDocsResponse = z.infer<\n typeof OpenTofuProviderDocsResponse\n>;\n\n// VersionDetailResponse — used by the releases.hashicorp.com backend\nexport const TerraformBuild = z.object({\n name: z.string(),\n version: z.string(),\n os: z.string(),\n arch: z.string(),\n filename: z.string(),\n url: z.string(),\n shasums_url: z.string().optional(),\n});\n\nexport type TerraformBuild = z.infer<typeof TerraformBuild>;\n\nexport const VersionDetailResponse = z.object({\n name: z.string().optional(),\n version: z.string().optional(),\n builds: z.array(TerraformBuild),\n});\n\nexport type VersionDetailResponse = z.infer<typeof VersionDetailResponse>;\n\n// TerraformProviderReleaseBackend — index.json from releases.hashicorp.com\nexport const TerraformProviderReleaseBackend = z.object({\n name: z.string().optional(),\n versions: z.record(z.string(), VersionDetailResponse),\n});\n\nexport type TerraformProviderReleaseBackend = z.infer<\n typeof TerraformProviderReleaseBackend\n>;\n\n// TerraformProviderVersions — Provider Registry Protocol /versions endpoint\nconst TerraformProviderVersionsVersion = z.object({\n version: z.string(),\n});\n\nexport const TerraformProviderVersions = z.object({\n versions: LooseArray(TerraformProviderVersionsVersion),\n});\n\nexport type TerraformProviderVersions = z.infer<\n typeof TerraformProviderVersions\n>;\n\n// TerraformRegistryVersions — registry /versions endpoint (for getBuilds)\nconst TerraformRegistryPlatform = z.object({\n os: z.string(),\n arch: z.string(),\n});\n\nconst TerraformRegistryVersionItem = z.object({\n version: z.string(),\n platforms: LooseArray(TerraformRegistryPlatform),\n});\n\nexport const TerraformRegistryVersions = z.object({\n versions: LooseArray(TerraformRegistryVersionItem).optional(),\n});\n\nexport type TerraformRegistryVersions = z.infer<\n typeof TerraformRegistryVersions\n>;\n\n// TerraformRegistryBuildResponse — per-platform download info\nexport const TerraformRegistryBuildResponse = z.object({\n os: z.string(),\n arch: z.string(),\n filename: z.string(),\n download_url: z.string(),\n shasums_url: z.string().optional(),\n});\n\nexport type TerraformRegistryBuildResponse = z.infer<\n typeof TerraformRegistryBuildResponse\n>;\n\n// OpenTofuProviderPackagesResponse — per-platform download endpoint exposes a\n// `packages` map containing the `zh:`/`h1:` hashes for every platform.\nconst OpenTofuProviderPackage = z.object({\n hashes: LooseArray(z.string()).catch([]),\n});\n\nexport const OpenTofuProviderPackagesResponse = z\n .object({\n packages: LooseRecord(OpenTofuProviderPackage).catch({}),\n })\n .transform(({ packages }): string[] | null => {\n const allHashes = Object.values(packages).flatMap(({ hashes }) => hashes);\n return allHashes.length ? allHashes : null;\n });\n\nexport type OpenTofuProviderPackagesResponse = z.infer<\n typeof OpenTofuProviderPackagesResponse\n>;\n"],"mappings":"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"}
|
|
@@ -3,31 +3,33 @@ import { coerceArray } from "../../../util/array.js";
|
|
|
3
3
|
import { logger } from "../../../logger/index.js";
|
|
4
4
|
import { trimTrailingSlash } from "../../../util/url.js";
|
|
5
5
|
import { withDebugMessage } from "../../../util/schema-utils/index.js";
|
|
6
|
-
import { DockerDatasource } from "../../datasource/docker/index.js";
|
|
7
6
|
import { GitTagsDatasource } from "../../datasource/git-tags/index.js";
|
|
8
7
|
import { HelmDatasource } from "../../datasource/helm/index.js";
|
|
9
8
|
import { getDep } from "../dockerfile/extract.js";
|
|
10
|
-
import { isOCIRegistry, removeOCIPrefix } from "../helmv3/oci.js";
|
|
9
|
+
import { getOciChartDep, isOCIRegistry, removeOCIPrefix } from "../helmv3/oci.js";
|
|
11
10
|
import { ApplicationDefinitions } from "./schema.js";
|
|
12
11
|
import { fileTestRegex } from "./util.js";
|
|
13
12
|
import { isNonEmptyObject, isTruthy } from "@sindresorhus/is";
|
|
14
13
|
//#region lib/modules/manager/argocd/extract.ts
|
|
15
14
|
const kustomizeImageRe = regEx(/=(?<image>.+)$/);
|
|
16
|
-
function extractPackageFile(content, packageFile,
|
|
15
|
+
function extractPackageFile(content, packageFile, config) {
|
|
17
16
|
if (fileTestRegex.test(content) === false) {
|
|
18
17
|
logger.debug(`Skip file ${packageFile} as no argoproj.io apiVersion could be found in matched file`);
|
|
19
18
|
return null;
|
|
20
19
|
}
|
|
21
|
-
const deps = ApplicationDefinitions.catch(withDebugMessage([], `${packageFile} does not match schema`)).parse(content).flatMap(processAppSpec);
|
|
20
|
+
const deps = ApplicationDefinitions.catch(withDebugMessage([], `${packageFile} does not match schema`)).parse(content).flatMap((definition) => processAppSpec(definition, config?.registryAliases));
|
|
22
21
|
return deps.length ? { deps } : null;
|
|
23
22
|
}
|
|
24
|
-
function processSource(source) {
|
|
23
|
+
function processSource(source, registryAliases) {
|
|
25
24
|
if (source.chart) {
|
|
26
|
-
if (isOCIRegistry(source.repoURL) || !source.repoURL.includes("://"))
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
if (isOCIRegistry(source.repoURL) || !source.repoURL.includes("://")) {
|
|
26
|
+
const registryURL = trimTrailingSlash(removeOCIPrefix(source.repoURL));
|
|
27
|
+
return [{
|
|
28
|
+
...getOciChartDep(source.repoURL, source.chart, registryAliases),
|
|
29
|
+
depName: `${registryURL}/${source.chart}`,
|
|
30
|
+
currentValue: source.targetRevision
|
|
31
|
+
}];
|
|
32
|
+
}
|
|
31
33
|
return [{
|
|
32
34
|
depName: source.chart,
|
|
33
35
|
registryUrls: [source.repoURL],
|
|
@@ -36,9 +38,9 @@ function processSource(source) {
|
|
|
36
38
|
}];
|
|
37
39
|
}
|
|
38
40
|
if (isOCIRegistry(source.repoURL)) return [{
|
|
41
|
+
...getOciChartDep(source.repoURL, void 0, registryAliases),
|
|
39
42
|
depName: trimTrailingSlash(removeOCIPrefix(source.repoURL)),
|
|
40
|
-
currentValue: source.targetRevision
|
|
41
|
-
datasource: DockerDatasource.id
|
|
43
|
+
currentValue: source.targetRevision
|
|
42
44
|
}];
|
|
43
45
|
const dependencies = [{
|
|
44
46
|
depName: source.repoURL,
|
|
@@ -48,11 +50,11 @@ function processSource(source) {
|
|
|
48
50
|
if (source.kustomize?.images) dependencies.push(...source.kustomize.images.map(processKustomizeImage).filter(isTruthy));
|
|
49
51
|
return dependencies;
|
|
50
52
|
}
|
|
51
|
-
function processAppSpec(definition) {
|
|
53
|
+
function processAppSpec(definition, registryAliases) {
|
|
52
54
|
const spec = definition.kind === "Application" ? definition.spec : definition.spec.template.spec;
|
|
53
55
|
const deps = [];
|
|
54
|
-
if (isNonEmptyObject(spec.source)) deps.push(...processSource(spec.source));
|
|
55
|
-
for (const source of coerceArray(spec.sources)) deps.push(...processSource(source));
|
|
56
|
+
if (isNonEmptyObject(spec.source)) deps.push(...processSource(spec.source, registryAliases));
|
|
57
|
+
for (const source of coerceArray(spec.sources)) deps.push(...processSource(source, registryAliases));
|
|
56
58
|
return deps;
|
|
57
59
|
}
|
|
58
60
|
function processKustomizeImage(kustomizeImage) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/argocd/extract.ts"],"sourcesContent":["import { isNonEmptyObject, isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { withDebugMessage } from '../../../util/schema-utils/index.ts';\nimport { trimTrailingSlash } from '../../../util/url.ts';\nimport {
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/argocd/extract.ts"],"sourcesContent":["import { isNonEmptyObject, isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { withDebugMessage } from '../../../util/schema-utils/index.ts';\nimport { trimTrailingSlash } from '../../../util/url.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { HelmDatasource } from '../../datasource/helm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport {\n getOciChartDep,\n isOCIRegistry,\n removeOCIPrefix,\n} from '../helmv3/oci.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport {\n type ApplicationDefinition,\n ApplicationDefinitions,\n type ApplicationSource,\n type ApplicationSpec,\n} from './schema.ts';\nimport { fileTestRegex } from './util.ts';\n\nconst kustomizeImageRe = regEx(/=(?<image>.+)$/);\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config?: ExtractConfig,\n): PackageFileContent | null {\n // check for argo reference. API version for the kind attribute is used\n if (fileTestRegex.test(content) === false) {\n logger.debug(\n `Skip file ${packageFile} as no argoproj.io apiVersion could be found in matched file`,\n );\n return null;\n }\n\n const definitions = ApplicationDefinitions.catch(\n withDebugMessage([], `${packageFile} does not match schema`),\n ).parse(content);\n\n const deps = definitions.flatMap((definition) =>\n processAppSpec(definition, config?.registryAliases),\n );\n\n return deps.length ? { deps } : null;\n}\n\nfunction processSource(\n source: ApplicationSource,\n registryAliases: Record<string, string> | undefined,\n): PackageDependency[] {\n // a chart variable is defined this is helm declaration\n if (source.chart) {\n // assume OCI helm chart if repoURL doesn't contain explicit protocol\n if (isOCIRegistry(source.repoURL) || !source.repoURL.includes('://')) {\n const registryURL = trimTrailingSlash(removeOCIPrefix(source.repoURL));\n\n return [\n {\n ...getOciChartDep(source.repoURL, source.chart, registryAliases),\n depName: `${registryURL}/${source.chart}`,\n currentValue: source.targetRevision,\n },\n ];\n }\n\n return [\n {\n depName: source.chart,\n registryUrls: [source.repoURL],\n currentValue: source.targetRevision,\n datasource: HelmDatasource.id,\n },\n ];\n }\n\n // Handle OCI Helm chart without explicit chart field\n if (isOCIRegistry(source.repoURL)) {\n return [\n {\n ...getOciChartDep(source.repoURL, undefined, registryAliases),\n depName: trimTrailingSlash(removeOCIPrefix(source.repoURL)),\n currentValue: source.targetRevision,\n },\n ];\n }\n\n const dependencies: PackageDependency[] = [\n {\n depName: source.repoURL,\n currentValue: source.targetRevision,\n datasource: GitTagsDatasource.id,\n },\n ];\n\n // Git repo is pointing to a Kustomize resources\n if (source.kustomize?.images) {\n dependencies.push(\n ...source.kustomize.images.map(processKustomizeImage).filter(isTruthy),\n );\n }\n\n return dependencies;\n}\n\nfunction processAppSpec(\n definition: ApplicationDefinition,\n registryAliases: Record<string, string> | undefined,\n): PackageDependency[] {\n const spec: ApplicationSpec =\n definition.kind === 'Application'\n ? definition.spec\n : definition.spec.template.spec;\n\n const deps: PackageDependency[] = [];\n\n if (isNonEmptyObject(spec.source)) {\n deps.push(...processSource(spec.source, registryAliases));\n }\n\n for (const source of coerceArray(spec.sources)) {\n deps.push(...processSource(source, registryAliases));\n }\n\n return deps;\n}\n\nfunction processKustomizeImage(\n kustomizeImage: string,\n): PackageDependency | null {\n const parts = kustomizeImageRe.exec(kustomizeImage);\n if (!parts?.groups?.image) {\n return null;\n }\n\n return getDep(parts.groups.image);\n}\n"],"mappings":";;;;;;;;;;;;;AA2BA,MAAM,mBAAmB,MAAM,gBAAgB;AAE/C,SAAgB,mBACd,SACA,aACA,QAC2B;CAE3B,IAAI,cAAc,KAAK,OAAO,MAAM,OAAO;EACzC,OAAO,MACL,aAAa,YAAY,6DAC3B;EACA,OAAO;CACT;CAMA,MAAM,OAJc,uBAAuB,MACzC,iBAAiB,CAAC,GAAG,GAAG,YAAY,uBAAuB,CAC7D,CAAC,CAAC,MAAM,OAEe,CAAC,CAAC,SAAS,eAChC,eAAe,YAAY,QAAQ,eAAe,CACpD;CAEA,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AAClC;AAEA,SAAS,cACP,QACA,iBACqB;CAErB,IAAI,OAAO,OAAO;EAEhB,IAAI,cAAc,OAAO,OAAO,KAAK,CAAC,OAAO,QAAQ,SAAS,KAAK,GAAG;GACpE,MAAM,cAAc,kBAAkB,gBAAgB,OAAO,OAAO,CAAC;GAErE,OAAO,CACL;IACE,GAAG,eAAe,OAAO,SAAS,OAAO,OAAO,eAAe;IAC/D,SAAS,GAAG,YAAY,GAAG,OAAO;IAClC,cAAc,OAAO;GACvB,CACF;EACF;EAEA,OAAO,CACL;GACE,SAAS,OAAO;GAChB,cAAc,CAAC,OAAO,OAAO;GAC7B,cAAc,OAAO;GACrB,YAAY,eAAe;EAC7B,CACF;CACF;CAGA,IAAI,cAAc,OAAO,OAAO,GAC9B,OAAO,CACL;EACE,GAAG,eAAe,OAAO,SAAS,KAAA,GAAW,eAAe;EAC5D,SAAS,kBAAkB,gBAAgB,OAAO,OAAO,CAAC;EAC1D,cAAc,OAAO;CACvB,CACF;CAGF,MAAM,eAAoC,CACxC;EACE,SAAS,OAAO;EAChB,cAAc,OAAO;EACrB,YAAY,kBAAkB;CAChC,CACF;CAGA,IAAI,OAAO,WAAW,QACpB,aAAa,KACX,GAAG,OAAO,UAAU,OAAO,IAAI,qBAAqB,CAAC,CAAC,OAAO,QAAQ,CACvE;CAGF,OAAO;AACT;AAEA,SAAS,eACP,YACA,iBACqB;CACrB,MAAM,OACJ,WAAW,SAAS,gBAChB,WAAW,OACX,WAAW,KAAK,SAAS;CAE/B,MAAM,OAA4B,CAAC;CAEnC,IAAI,iBAAiB,KAAK,MAAM,GAC9B,KAAK,KAAK,GAAG,cAAc,KAAK,QAAQ,eAAe,CAAC;CAG1D,KAAK,MAAM,UAAU,YAAY,KAAK,OAAO,GAC3C,KAAK,KAAK,GAAG,cAAc,QAAQ,eAAe,CAAC;CAGrD,OAAO;AACT;AAEA,SAAS,sBACP,gBAC0B;CAC1B,MAAM,QAAQ,iBAAiB,KAAK,cAAc;CAClD,IAAI,CAAC,OAAO,QAAQ,OAClB,OAAO;CAGT,OAAO,OAAO,MAAM,OAAO,KAAK;AAClC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","names":["parseGithubUrl"],"sources":["../../../../lib/modules/manager/bazel-module/rules.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport parseGithubUrl from 'github-url-from-git';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { SkipReason } from '../../../types/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { BazelDatasource } from '../../datasource/bazel/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { RuleFragment, StringFragment } from './parser/fragments.ts';\nimport type {\n BasePackageDep,\n BazelModulePackageDep,\n MergePackageDep,\n OverridePackageDep,\n} from './types.ts';\n\n// Rule Schemas\n\nfunction isOverride(value: BazelModulePackageDep): value is OverridePackageDep {\n return 'bazelDepSkipReason' in value;\n}\n\nfunction isMerge(value: BazelModulePackageDep): value is MergePackageDep {\n return 'bazelDepMergeFields' in value;\n}\n\n// This function exists to remove properties that are specific to\n// BazelModulePackageDep. In theory, there is no harm in leaving the properties\n// as it does not invalidate the PackageDependency interface. However, it might\n// be surprising to someone outside the bazel-module code to see the extra\n// properties.\nexport function bazelModulePackageDepToPackageDependency(\n bmpd: BazelModulePackageDep,\n): PackageDependency {\n const copy: BazelModulePackageDep = clone(bmpd);\n // v8 ignore else -- TODO: add test #40625\n if (isOverride(copy)) {\n const partial = copy as Partial<OverridePackageDep>;\n delete partial.bazelDepSkipReason;\n }\n if (isMerge(copy)) {\n const partial = copy as Partial<MergePackageDep>;\n delete partial.bazelDepMergeFields;\n }\n return copy;\n}\n\nconst BazelDepToPackageDep = RuleFragment.extend({\n rule: z.literal('bazel_dep'),\n children: z.object({\n name: StringFragment,\n version: StringFragment.optional(),\n }),\n}).transform(\n ({ rule, children: { name, version } }): BasePackageDep => ({\n datasource: BazelDatasource.id,\n depType: rule,\n depName: name.value,\n currentValue: version?.value,\n ...(version ? {} : { skipReason: 'unspecified-version' }),\n }),\n);\n\nconst GitOverrideToPackageDep = RuleFragment.extend({\n rule: z.literal('git_override'),\n children: z.object({\n module_name: StringFragment,\n remote: StringFragment,\n commit: StringFragment,\n }),\n}).transform(\n ({\n rule,\n children: { module_name: moduleName, remote, commit },\n }): OverridePackageDep => {\n const override: OverridePackageDep = {\n depType: rule,\n depName: moduleName.value,\n bazelDepSkipReason: 'git-dependency',\n currentDigest: commit.value,\n };\n const ghPackageName = githubPackageName(remote.value);\n if (isNonEmptyString(ghPackageName)) {\n override.datasource = GithubTagsDatasource.id;\n override.packageName = ghPackageName;\n } else {\n override.skipReason = 'unsupported-datasource';\n }\n return override;\n },\n);\n\nconst SingleVersionOverrideToPackageDep = RuleFragment.extend({\n rule: z.literal('single_version_override'),\n children: z.object({\n module_name: StringFragment,\n version: StringFragment.optional(),\n registry: StringFragment.optional(),\n }),\n}).transform(\n ({\n rule,\n children: { module_name: moduleName, version, registry },\n }): BasePackageDep => {\n const base: BasePackageDep = {\n depType: rule,\n depName: moduleName.value,\n skipReason: 'ignored',\n };\n // If a version is specified, then add a skipReason to bazel_dep\n if (version) {\n const override = base as OverridePackageDep;\n override.bazelDepSkipReason = 'is-pinned';\n override.currentValue = version.value;\n }\n // If a registry is specified, then merge it into the bazel_dep\n // v8 ignore else -- TODO: add test #40625\n if (registry) {\n const merge = base as MergePackageDep;\n merge.bazelDepMergeFields = ['registryUrls'];\n merge.registryUrls = [registry.value];\n }\n return base;\n },\n);\n\nconst UnsupportedOverrideToPackageDep = RuleFragment.extend({\n rule: z.enum(['archive_override', 'local_path_override']),\n children: z.object({\n module_name: StringFragment,\n }),\n}).transform(\n ({ rule, children: { module_name: moduleName } }): OverridePackageDep => {\n let bazelDepSkipReason: SkipReason = 'unsupported';\n switch (rule) {\n case 'archive_override':\n bazelDepSkipReason = 'file-dependency';\n break;\n case 'local_path_override':\n bazelDepSkipReason = 'local-dependency';\n break;\n }\n return {\n depType: rule,\n depName: moduleName.value,\n skipReason: 'unsupported-datasource',\n bazelDepSkipReason,\n };\n },\n);\n\nexport const RuleToBazelModulePackageDep = z.union([\n BazelDepToPackageDep,\n GitOverrideToPackageDep,\n SingleVersionOverrideToPackageDep,\n UnsupportedOverrideToPackageDep,\n]);\n\nconst githubRemoteRegex = regEx(\n /^https:\\/\\/github\\.com\\/(?<packageName>[^/]+\\/.+)$/,\n);\nfunction githubPackageName(remote: string): string | undefined {\n return parseGithubUrl(remote)?.match(githubRemoteRegex)?.groups?.packageName;\n}\n\nfunction collectByModule(\n packageDeps: BazelModulePackageDep[],\n): BazelModulePackageDep[][] {\n const rulesByModule = new Map<string, BasePackageDep[]>();\n for (const pkgDep of packageDeps) {\n const bmi = coerceArray(rulesByModule.get(pkgDep.depName));\n bmi.push(pkgDep);\n rulesByModule.set(pkgDep.depName, bmi);\n }\n return Array.from(rulesByModule.values());\n}\n\nexport function processModulePkgDeps(\n packageDeps: BazelModulePackageDep[],\n): PackageDependency[] {\n if (!packageDeps.length) {\n return [];\n }\n const moduleName = packageDeps[0].depName;\n const bazelDep = packageDeps.find((pd) => pd.depType === 'bazel_dep');\n if (!bazelDep) {\n logger.debug(`A 'bazel_dep' was not found for '${moduleName}'.`);\n return [];\n }\n // Create a new bazelDep that will be modified. We do not want to change the\n // input.\n const bazelDepOut = { ...bazelDep };\n const deps: PackageDependency[] = [bazelDepOut];\n const merges = packageDeps.filter(isMerge);\n for (const merge of merges) {\n merge.bazelDepMergeFields.forEach((k) => (bazelDepOut[k] = merge[k]));\n }\n const overrides = packageDeps.filter(isOverride);\n if (overrides.length === 0) {\n return deps;\n }\n // It is an error for more than one override to exist for a module. We will\n // ignore the overrides if there is more than one.\n if (overrides.length > 1) {\n const depTypes = overrides.map((o) => o.depType);\n logger.debug(\n { depName: moduleName, depTypes },\n 'More than one override for a module was found',\n );\n return deps;\n }\n const override = overrides[0];\n deps.push(bazelModulePackageDepToPackageDependency(override));\n bazelDepOut.skipReason = override.bazelDepSkipReason;\n return deps;\n}\n\nexport function toPackageDependencies(\n packageDeps: BazelModulePackageDep[],\n): PackageDependency[] {\n return collectByModule(packageDeps).map(processModulePkgDeps).flat();\n}\n\nexport const GitRepositoryToPackageDep = RuleFragment.extend({\n rule: z.union([z.literal('git_repository'), z.literal('new_git_repository')]),\n children: z.object({\n name: StringFragment,\n remote: StringFragment,\n commit: StringFragment.optional(),\n tag: StringFragment.optional(),\n }),\n}).transform(\n ({ rule, children: { name, remote, commit, tag } }): BasePackageDep => {\n const gitRepo: BasePackageDep = {\n depType: rule,\n depName: name.value,\n };\n\n if (commit?.value) {\n gitRepo.currentDigest = commit.value;\n }\n\n if (tag?.value) {\n gitRepo.currentValue = tag.value;\n }\n\n const ghPackageName = githubPackageName(remote.value);\n if (isNonEmptyString(ghPackageName)) {\n gitRepo.datasource = GithubTagsDatasource.id;\n gitRepo.packageName = ghPackageName;\n } else {\n gitRepo.skipReason = 'unsupported-datasource';\n }\n return gitRepo;\n },\n);\n"],"mappings":";;;;;;;;;;;AAqBA,SAAS,WAAW,OAA2D;CAC7E,OAAO,wBAAwB;AACjC;AAEA,SAAS,QAAQ,OAAwD;CACvE,OAAO,yBAAyB;AAClC;AAOA,SAAgB,yCACd,MACmB;CACnB,MAAM,OAA8B,MAAM,IAAI;;CAE9C,IAAI,WAAW,IAAI,GAAG;EACpB,MAAM,UAAU;EAChB,OAAO,QAAQ;CACjB;CACA,IAAI,QAAQ,IAAI,GAAG;EACjB,MAAM,UAAU;EAChB,OAAO,QAAQ;CACjB;CACA,OAAO;AACT;AAEA,MAAM,uBAAuB,aAAa,OAAO;CAC/C,MAAM,EAAE,QAAQ,WAAW;CAC3B,UAAU,EAAE,OAAO;EACjB,MAAM;EACN,SAAS,eAAe,SAAS;CACnC,CAAC;AACH,CAAC,CAAC,CAAC,WACA,EAAE,MAAM,UAAU,EAAE,MAAM,iBAAiC;CAC1D,YAAY,gBAAgB;CAC5B,SAAS;CACT,SAAS,KAAK;CACd,cAAc,SAAS;CACvB,GAAI,UAAU,CAAC,IAAI,EAAE,YAAY,sBAAsB;AACzD,EACF;AAEA,MAAM,0BAA0B,aAAa,OAAO;CAClD,MAAM,EAAE,QAAQ,cAAc;CAC9B,UAAU,EAAE,OAAO;EACjB,aAAa;EACb,QAAQ;EACR,QAAQ;CACV,CAAC;AACH,CAAC,CAAC,CAAC,WACA,EACC,MACA,UAAU,EAAE,aAAa,YAAY,QAAQ,eACrB;CACxB,MAAM,WAA+B;EACnC,SAAS;EACT,SAAS,WAAW;EACpB,oBAAoB;EACpB,eAAe,OAAO;CACxB;CACA,MAAM,gBAAgB,kBAAkB,OAAO,KAAK;CACpD,IAAI,iBAAiB,aAAa,GAAG;EACnC,SAAS,aAAa,qBAAqB;EAC3C,SAAS,cAAc;CACzB,OACE,SAAS,aAAa;CAExB,OAAO;AACT,CACF;AAEA,MAAM,oCAAoC,aAAa,OAAO;CAC5D,MAAM,EAAE,QAAQ,yBAAyB;CACzC,UAAU,EAAE,OAAO;EACjB,aAAa;EACb,SAAS,eAAe,SAAS;EACjC,UAAU,eAAe,SAAS;CACpC,CAAC;AACH,CAAC,CAAC,CAAC,WACA,EACC,MACA,UAAU,EAAE,aAAa,YAAY,SAAS,iBAC1B;CACpB,MAAM,OAAuB;EAC3B,SAAS;EACT,SAAS,WAAW;EACpB,YAAY;CACd;CAEA,IAAI,SAAS;EACX,MAAM,WAAW;EACjB,SAAS,qBAAqB;EAC9B,SAAS,eAAe,QAAQ;CAClC;;CAGA,IAAI,UAAU;EACZ,MAAM,QAAQ;EACd,MAAM,sBAAsB,CAAC,cAAc;EAC3C,MAAM,eAAe,CAAC,SAAS,KAAK;CACtC;CACA,OAAO;AACT,CACF;AAEA,MAAM,kCAAkC,aAAa,OAAO;CAC1D,MAAM,EAAE,KAAK,CAAC,oBAAoB,qBAAqB,CAAC;CACxD,UAAU,EAAE,OAAO,EACjB,aAAa,eACf,CAAC;AACH,CAAC,CAAC,CAAC,WACA,EAAE,MAAM,UAAU,EAAE,aAAa,mBAAuC;CACvE,IAAI,qBAAiC;CACrC,QAAQ,MAAR;EACE,KAAK;GACH,qBAAqB;GACrB;EACF,KAAK,uBACH,qBAAqB;CAEzB;CACA,OAAO;EACL,SAAS;EACT,SAAS,WAAW;EACpB,YAAY;EACZ;CACF;AACF,CACF;AAEA,MAAa,8BAA8B,EAAE,MAAM;CACjD;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,oBAAoB,MACxB,oDACF;AACA,SAAS,kBAAkB,QAAoC;CAC7D,OAAOA,MAAe,MAAM,CAAC,EAAE,MAAM,iBAAiB,CAAC,EAAE,QAAQ;AACnE;AAEA,SAAS,gBACP,aAC2B;CAC3B,MAAM,gCAAgB,IAAI,IAA8B;CACxD,KAAK,MAAM,UAAU,aAAa;EAChC,MAAM,MAAM,YAAY,cAAc,IAAI,OAAO,OAAO,CAAC;EACzD,IAAI,KAAK,MAAM;EACf,cAAc,IAAI,OAAO,SAAS,GAAG;CACvC;CACA,OAAO,MAAM,KAAK,cAAc,OAAO,CAAC;AAC1C;AAEA,SAAgB,qBACd,aACqB;CACrB,IAAI,CAAC,YAAY,QACf,OAAO,CAAC;CAEV,MAAM,aAAa,YAAY,EAAE,CAAC;CAClC,MAAM,WAAW,YAAY,MAAM,OAAO,GAAG,YAAY,WAAW;CACpE,IAAI,CAAC,UAAU;EACb,OAAO,MAAM,oCAAoC,WAAW,GAAG;EAC/D,OAAO,CAAC;CACV;CAGA,MAAM,cAAc,EAAE,GAAG,SAAS;CAClC,MAAM,OAA4B,CAAC,WAAW;CAC9C,MAAM,SAAS,YAAY,OAAO,OAAO;CACzC,KAAK,MAAM,SAAS,QAClB,MAAM,oBAAoB,SAAS,MAAO,YAAY,KAAK,MAAM,EAAG;CAEtE,MAAM,YAAY,YAAY,OAAO,UAAU;CAC/C,IAAI,UAAU,WAAW,GACvB,OAAO;CAIT,IAAI,UAAU,SAAS,GAAG;EACxB,MAAM,WAAW,UAAU,KAAK,MAAM,EAAE,OAAO;EAC/C,OAAO,MACL;GAAE,SAAS;GAAY;EAAS,GAChC,+CACF;EACA,OAAO;CACT;CACA,MAAM,WAAW,UAAU;CAC3B,KAAK,KAAK,yCAAyC,QAAQ,CAAC;CAC5D,YAAY,aAAa,SAAS;CAClC,OAAO;AACT;AAEA,SAAgB,sBACd,aACqB;CACrB,OAAO,gBAAgB,WAAW,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,KAAK;AACrE;AAEA,MAAa,4BAA4B,aAAa,OAAO;CAC3D,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,gBAAgB,GAAG,EAAE,QAAQ,oBAAoB,CAAC,CAAC;CAC5E,UAAU,EAAE,OAAO;EACjB,MAAM;EACN,QAAQ;EACR,QAAQ,eAAe,SAAS;EAChC,KAAK,eAAe,SAAS;CAC/B,CAAC;AACH,CAAC,CAAC,CAAC,WACA,EAAE,MAAM,UAAU,EAAE,MAAM,QAAQ,QAAQ,YAA4B;CACrE,MAAM,UAA0B;EAC9B,SAAS;EACT,SAAS,KAAK;CAChB;CAEA,IAAI,QAAQ,OACV,QAAQ,gBAAgB,OAAO;CAGjC,IAAI,KAAK,OACP,QAAQ,eAAe,IAAI;CAG7B,MAAM,gBAAgB,kBAAkB,OAAO,KAAK;CACpD,IAAI,iBAAiB,aAAa,GAAG;EACnC,QAAQ,aAAa,qBAAqB;EAC1C,QAAQ,cAAc;CACxB,OACE,QAAQ,aAAa;CAEvB,OAAO;AACT,CACF"}
|
|
1
|
+
{"version":3,"file":"rules.js","names":["parseGithubUrl"],"sources":["../../../../lib/modules/manager/bazel-module/rules.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport parseGithubUrl from 'github-url-from-git';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { SkipReason } from '../../../types/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { BazelDatasource } from '../../datasource/bazel/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { RuleFragment, StringFragment } from './parser/fragments.ts';\nimport type {\n BasePackageDep,\n BazelModulePackageDep,\n MergePackageDep,\n OverridePackageDep,\n} from './types.ts';\n\n// Rule Schemas\n\nfunction isOverride(value: BazelModulePackageDep): value is OverridePackageDep {\n return 'bazelDepSkipReason' in value;\n}\n\nfunction isMerge(value: BazelModulePackageDep): value is MergePackageDep {\n return 'bazelDepMergeFields' in value;\n}\n\n// This function exists to remove properties that are specific to\n// BazelModulePackageDep. In theory, there is no harm in leaving the properties\n// as it does not invalidate the PackageDependency interface. However, it might\n// be surprising to someone outside the bazel-module code to see the extra\n// properties.\nexport function bazelModulePackageDepToPackageDependency(\n bmpd: BazelModulePackageDep,\n): PackageDependency {\n const copy: BazelModulePackageDep = clone(bmpd);\n // v8 ignore else -- TODO: add test #40625\n if (isOverride(copy)) {\n const partial = copy as Partial<OverridePackageDep>;\n delete partial.bazelDepSkipReason;\n }\n if (isMerge(copy)) {\n const partial = copy as Partial<MergePackageDep>;\n delete partial.bazelDepMergeFields;\n }\n return copy;\n}\n\nconst BazelDepToPackageDep = RuleFragment.extend({\n rule: z.literal('bazel_dep'),\n children: z.object({\n name: StringFragment,\n version: StringFragment.optional(),\n }),\n}).transform(({ rule, children: { name, version } }): BasePackageDep => ({\n datasource: BazelDatasource.id,\n depType: rule,\n depName: name.value,\n currentValue: version?.value,\n ...(version ? {} : { skipReason: 'unspecified-version' }),\n}));\n\nconst GitOverrideToPackageDep = RuleFragment.extend({\n rule: z.literal('git_override'),\n children: z.object({\n module_name: StringFragment,\n remote: StringFragment,\n commit: StringFragment,\n }),\n}).transform(\n ({\n rule,\n children: { module_name: moduleName, remote, commit },\n }): OverridePackageDep => {\n const override: OverridePackageDep = {\n depType: rule,\n depName: moduleName.value,\n bazelDepSkipReason: 'git-dependency',\n currentDigest: commit.value,\n };\n const ghPackageName = githubPackageName(remote.value);\n if (isNonEmptyString(ghPackageName)) {\n override.datasource = GithubTagsDatasource.id;\n override.packageName = ghPackageName;\n } else {\n override.skipReason = 'unsupported-datasource';\n }\n return override;\n },\n);\n\nconst SingleVersionOverrideToPackageDep = RuleFragment.extend({\n rule: z.literal('single_version_override'),\n children: z.object({\n module_name: StringFragment,\n version: StringFragment.optional(),\n registry: StringFragment.optional(),\n }),\n}).transform(\n ({\n rule,\n children: { module_name: moduleName, version, registry },\n }): BasePackageDep => {\n const base: BasePackageDep = {\n depType: rule,\n depName: moduleName.value,\n skipReason: 'ignored',\n };\n // If a version is specified, then add a skipReason to bazel_dep\n if (version) {\n const override = base as OverridePackageDep;\n override.bazelDepSkipReason = 'is-pinned';\n override.currentValue = version.value;\n }\n // If a registry is specified, then merge it into the bazel_dep\n // v8 ignore else -- TODO: add test #40625\n if (registry) {\n const merge = base as MergePackageDep;\n merge.bazelDepMergeFields = ['registryUrls'];\n merge.registryUrls = [registry.value];\n }\n return base;\n },\n);\n\nconst UnsupportedOverrideToPackageDep = RuleFragment.extend({\n rule: z.enum(['archive_override', 'local_path_override']),\n children: z.object({\n module_name: StringFragment,\n }),\n}).transform(\n ({ rule, children: { module_name: moduleName } }): OverridePackageDep => {\n let bazelDepSkipReason: SkipReason = 'unsupported';\n switch (rule) {\n case 'archive_override':\n bazelDepSkipReason = 'file-dependency';\n break;\n case 'local_path_override':\n bazelDepSkipReason = 'local-dependency';\n break;\n }\n return {\n depType: rule,\n depName: moduleName.value,\n skipReason: 'unsupported-datasource',\n bazelDepSkipReason,\n };\n },\n);\n\nexport const RuleToBazelModulePackageDep = z.union([\n BazelDepToPackageDep,\n GitOverrideToPackageDep,\n SingleVersionOverrideToPackageDep,\n UnsupportedOverrideToPackageDep,\n]);\n\nconst githubRemoteRegex = regEx(\n /^https:\\/\\/github\\.com\\/(?<packageName>[^/]+\\/.+)$/,\n);\nfunction githubPackageName(remote: string): string | undefined {\n return parseGithubUrl(remote)?.match(githubRemoteRegex)?.groups?.packageName;\n}\n\nfunction collectByModule(\n packageDeps: BazelModulePackageDep[],\n): BazelModulePackageDep[][] {\n const rulesByModule = new Map<string, BasePackageDep[]>();\n for (const pkgDep of packageDeps) {\n const bmi = coerceArray(rulesByModule.get(pkgDep.depName));\n bmi.push(pkgDep);\n rulesByModule.set(pkgDep.depName, bmi);\n }\n return Array.from(rulesByModule.values());\n}\n\nexport function processModulePkgDeps(\n packageDeps: BazelModulePackageDep[],\n): PackageDependency[] {\n if (!packageDeps.length) {\n return [];\n }\n const moduleName = packageDeps[0].depName;\n const bazelDep = packageDeps.find((pd) => pd.depType === 'bazel_dep');\n if (!bazelDep) {\n logger.debug(`A 'bazel_dep' was not found for '${moduleName}'.`);\n return [];\n }\n // Create a new bazelDep that will be modified. We do not want to change the\n // input.\n const bazelDepOut = { ...bazelDep };\n const deps: PackageDependency[] = [bazelDepOut];\n const merges = packageDeps.filter(isMerge);\n for (const merge of merges) {\n merge.bazelDepMergeFields.forEach((k) => (bazelDepOut[k] = merge[k]));\n }\n const overrides = packageDeps.filter(isOverride);\n if (overrides.length === 0) {\n return deps;\n }\n // It is an error for more than one override to exist for a module. We will\n // ignore the overrides if there is more than one.\n if (overrides.length > 1) {\n const depTypes = overrides.map((o) => o.depType);\n logger.debug(\n { depName: moduleName, depTypes },\n 'More than one override for a module was found',\n );\n return deps;\n }\n const override = overrides[0];\n deps.push(bazelModulePackageDepToPackageDependency(override));\n bazelDepOut.skipReason = override.bazelDepSkipReason;\n return deps;\n}\n\nexport function toPackageDependencies(\n packageDeps: BazelModulePackageDep[],\n): PackageDependency[] {\n return collectByModule(packageDeps).map(processModulePkgDeps).flat();\n}\n\nexport const GitRepositoryToPackageDep = RuleFragment.extend({\n rule: z.union([z.literal('git_repository'), z.literal('new_git_repository')]),\n children: z.object({\n name: StringFragment,\n remote: StringFragment,\n commit: StringFragment.optional(),\n tag: StringFragment.optional(),\n }),\n}).transform(\n ({ rule, children: { name, remote, commit, tag } }): BasePackageDep => {\n const gitRepo: BasePackageDep = {\n depType: rule,\n depName: name.value,\n };\n\n if (commit?.value) {\n gitRepo.currentDigest = commit.value;\n }\n\n if (tag?.value) {\n gitRepo.currentValue = tag.value;\n }\n\n const ghPackageName = githubPackageName(remote.value);\n if (isNonEmptyString(ghPackageName)) {\n gitRepo.datasource = GithubTagsDatasource.id;\n gitRepo.packageName = ghPackageName;\n } else {\n gitRepo.skipReason = 'unsupported-datasource';\n }\n return gitRepo;\n },\n);\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/manager/cargo/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport type { SkipReason } from '../../../types/index.ts';\nimport { Toml, withDepType } from '../../../util/schema-utils/index.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { applyGitSource } from '../util.ts';\nimport type { CargoManagerData } from './types.ts';\n\nconst CargoDep = z.union([\n z\n .object({\n /** Path on disk to the crate sources */\n path: z.string().optional(),\n /** Git URL for the dependency */\n git: z.string().optional(),\n /** Git tag for the dependency */\n tag: z.string().optional(),\n /** Git revision for the dependency */\n rev: z.string().optional(),\n /** Git branch for the dependency */\n branch: z.string().optional(),\n /** Semver version */\n version: z.string().optional(),\n /** Name of a registry whose URL is configured in `.cargo/config.toml` or `.cargo/config` */\n registry: z.string().optional(),\n /** Name of a package to look up */\n package: z.string().optional(),\n /** Whether the dependency is inherited from the workspace */\n workspace: z.boolean().optional(),\n })\n .transform(\n ({\n path,\n git,\n tag,\n rev,\n branch,\n version,\n registry,\n package: pkg,\n workspace,\n }): PackageDependency<CargoManagerData> => {\n let skipReason: SkipReason | undefined;\n let currentValue: string;\n let nestedVersion = false;\n\n if (version) {\n currentValue = version;\n nestedVersion = true;\n } else {\n currentValue = '';\n }\n\n const dep: PackageDependency<CargoManagerData> = {\n currentValue,\n managerData: { nestedVersion },\n datasource: CrateDatasource.id,\n };\n\n if (path) {\n skipReason = 'path-dependency';\n } else if (workspace) {\n skipReason = 'inherited-dependency';\n } else if (git) {\n applyGitSource(dep, git, rev, tag, branch);\n } else if (!version) {\n skipReason = 'invalid-dependency-specification';\n }\n\n if (skipReason) {\n dep.skipReason = skipReason;\n }\n if (pkg && !git) {\n dep.packageName = pkg;\n }\n if (registry) {\n dep.managerData!.registryName = registry;\n }\n\n return dep;\n },\n ),\n z.string().transform(
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/manager/cargo/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport type { SkipReason } from '../../../types/index.ts';\nimport { Toml, withDepType } from '../../../util/schema-utils/index.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { applyGitSource } from '../util.ts';\nimport type { CargoManagerData } from './types.ts';\n\nconst CargoDep = z.union([\n z\n .object({\n /** Path on disk to the crate sources */\n path: z.string().optional(),\n /** Git URL for the dependency */\n git: z.string().optional(),\n /** Git tag for the dependency */\n tag: z.string().optional(),\n /** Git revision for the dependency */\n rev: z.string().optional(),\n /** Git branch for the dependency */\n branch: z.string().optional(),\n /** Semver version */\n version: z.string().optional(),\n /** Name of a registry whose URL is configured in `.cargo/config.toml` or `.cargo/config` */\n registry: z.string().optional(),\n /** Name of a package to look up */\n package: z.string().optional(),\n /** Whether the dependency is inherited from the workspace */\n workspace: z.boolean().optional(),\n })\n .transform(\n ({\n path,\n git,\n tag,\n rev,\n branch,\n version,\n registry,\n package: pkg,\n workspace,\n }): PackageDependency<CargoManagerData> => {\n let skipReason: SkipReason | undefined;\n let currentValue: string;\n let nestedVersion = false;\n\n if (version) {\n currentValue = version;\n nestedVersion = true;\n } else {\n currentValue = '';\n }\n\n const dep: PackageDependency<CargoManagerData> = {\n currentValue,\n managerData: { nestedVersion },\n datasource: CrateDatasource.id,\n };\n\n if (path) {\n skipReason = 'path-dependency';\n } else if (workspace) {\n skipReason = 'inherited-dependency';\n } else if (git) {\n applyGitSource(dep, git, rev, tag, branch);\n } else if (!version) {\n skipReason = 'invalid-dependency-specification';\n }\n\n if (skipReason) {\n dep.skipReason = skipReason;\n }\n if (pkg && !git) {\n dep.packageName = pkg;\n }\n if (registry) {\n dep.managerData!.registryName = registry;\n }\n\n return dep;\n },\n ),\n z.string().transform((version): PackageDependency<CargoManagerData> => ({\n currentValue: version,\n managerData: { nestedVersion: false },\n datasource: CrateDatasource.id,\n })),\n]);\n\nconst CargoDeps = z.record(z.string(), CargoDep).transform((record) => {\n const deps: PackageDependency[] = [];\n\n for (const [depName, dep] of Object.entries(record)) {\n dep.depName = depName;\n deps.push(dep);\n }\n\n return deps;\n});\n\nexport type CargoDeps = z.infer<typeof CargoDeps>;\n\nconst CargoSection = z.object({\n dependencies: withDepType(CargoDeps, 'dependencies').optional(),\n 'dev-dependencies': withDepType(CargoDeps, 'dev-dependencies').optional(),\n 'build-dependencies': withDepType(CargoDeps, 'build-dependencies').optional(),\n});\n\nconst CargoWorkspace = z.object({\n dependencies: withDepType(CargoDeps, 'workspace.dependencies').optional(),\n package: z\n .object({\n version: z.string().optional(),\n })\n .optional(),\n});\n\nconst CargoTarget = z.record(z.string(), CargoSection);\n\nexport const CargoManifest = Toml.pipe(\n CargoSection.extend({\n package: z\n .object({\n version: z\n .union([z.string(), z.object({ workspace: z.literal(true) })])\n .optional(),\n })\n .optional(),\n workspace: CargoWorkspace.optional(),\n target: CargoTarget.optional(),\n }),\n);\n\nconst CargoConfigRegistry = z.object({\n index: z.string().optional(),\n});\n\nconst CargoConfigSource = z.object({\n 'replace-with': z.string().optional(),\n registry: z.string().optional(),\n});\n\nexport const CargoConfig = Toml.pipe(\n z.object({\n registries: z.record(z.string(), CargoConfigRegistry).optional(),\n source: z.record(z.string(), CargoConfigSource).optional(),\n }),\n);\n\nexport type CargoConfig = z.infer<typeof CargoConfig>;\n\nconst CargoLockPackage = z.object({\n name: z.string(),\n version: z.string(),\n source: z.string().optional(),\n});\n\nexport const CargoLock = Toml.pipe(\n z.object({\n package: z.array(CargoLockPackage).optional(),\n }),\n);\n\nexport type CargoLock = z.infer<typeof CargoLock>;\n"],"mappings":";;;;;AAQA,MAAM,WAAW,EAAE,MAAM,CACvB,EACG,OAAO;;CAEN,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;;CAE1B,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;;CAEzB,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;;CAEzB,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;;CAEzB,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;;CAE5B,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;;CAE7B,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS;;CAE9B,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;;CAE7B,WAAW,EAAE,QAAQ,CAAC,CAAC,SAAS;AAClC,CAAC,CAAC,CACD,WACE,EACC,MACA,KACA,KACA,KACA,QACA,SACA,UACA,SAAS,KACT,gBACyC;CACzC,IAAI;CACJ,IAAI;CACJ,IAAI,gBAAgB;CAEpB,IAAI,SAAS;EACX,eAAe;EACf,gBAAgB;CAClB,OACE,eAAe;CAGjB,MAAM,MAA2C;EAC/C;EACA,aAAa,EAAE,cAAc;EAC7B,YAAY,gBAAgB;CAC9B;CAEA,IAAI,MACF,aAAa;MACR,IAAI,WACT,aAAa;MACR,IAAI,KACT,eAAe,KAAK,KAAK,KAAK,KAAK,MAAM;MACpC,IAAI,CAAC,SACV,aAAa;CAGf,IAAI,YACF,IAAI,aAAa;CAEnB,IAAI,OAAO,CAAC,KACV,IAAI,cAAc;CAEpB,IAAI,UACF,IAAI,YAAa,eAAe;CAGlC,OAAO;AACT,CACF,GACF,EAAE,OAAO,CAAC,CAAC,WAAW,aAAkD;CACtE,cAAc;CACd,aAAa,EAAE,eAAe,MAAM;CACpC,YAAY,gBAAgB;AAC9B,EAAE,CACJ,CAAC;AAED,MAAM,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC,WAAW,WAAW;CACrE,MAAM,OAA4B,CAAC;CAEnC,KAAK,MAAM,CAAC,SAAS,QAAQ,OAAO,QAAQ,MAAM,GAAG;EACnD,IAAI,UAAU;EACd,KAAK,KAAK,GAAG;CACf;CAEA,OAAO;AACT,CAAC;AAID,MAAM,eAAe,EAAE,OAAO;CAC5B,cAAc,YAAY,WAAW,cAAc,CAAC,CAAC,SAAS;CAC9D,oBAAoB,YAAY,WAAW,kBAAkB,CAAC,CAAC,SAAS;CACxE,sBAAsB,YAAY,WAAW,oBAAoB,CAAC,CAAC,SAAS;AAC9E,CAAC;AAED,MAAM,iBAAiB,EAAE,OAAO;CAC9B,cAAc,YAAY,WAAW,wBAAwB,CAAC,CAAC,SAAS;CACxE,SAAS,EACN,OAAO,EACN,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,EAC/B,CAAC,CAAC,CACD,SAAS;AACd,CAAC;AAED,MAAM,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,YAAY;AAErD,MAAa,gBAAgB,KAAK,KAChC,aAAa,OAAO;CAClB,SAAS,EACN,OAAO,EACN,SAAS,EACN,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAC7D,SAAS,EACd,CAAC,CAAC,CACD,SAAS;CACZ,WAAW,eAAe,SAAS;CACnC,QAAQ,YAAY,SAAS;AAC/B,CAAC,CACH;AAEA,MAAM,sBAAsB,EAAE,OAAO,EACnC,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,EAC7B,CAAC;AAED,MAAM,oBAAoB,EAAE,OAAO;CACjC,gBAAgB,EAAE,OAAO,CAAC,CAAC,SAAS;CACpC,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS;AAChC,CAAC;AAED,MAAa,cAAc,KAAK,KAC9B,EAAE,OAAO;CACP,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAAC,CAAC,SAAS;CAC/D,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAAC,CAAC,SAAS;AAC3D,CAAC,CACH;AAIA,MAAM,mBAAmB,EAAE,OAAO;CAChC,MAAM,EAAE,OAAO;CACf,SAAS,EAAE,OAAO;CAClB,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;AAC9B,CAAC;AAED,MAAa,YAAY,KAAK,KAC5B,EAAE,OAAO,EACP,SAAS,EAAE,MAAM,gBAAgB,CAAC,CAAC,SAAS,EAC9C,CAAC,CACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":["ubuntuVersioning.id","debianVersioning.id"],"sources":["../../../../lib/modules/manager/dockerfile/extract.ts"],"sourcesContent":["import {\n isNonEmptyStringAndNotWhitespace,\n isNumericString,\n isString,\n} from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport * as debianVersioning from '../../versioning/debian/index.ts';\nimport * as ubuntuVersioning from '../../versioning/ubuntu/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\n\nconst variableMarker = '$';\n\nexport function extractVariables(image: string): Record<string, string> {\n const variables: Record<string, string> = {};\n const variableRegex = regEx(\n /(?<fullvariable>\\\\?\\$(?<simplearg>\\w+)|\\\\?\\${(?<complexarg>\\w+)(?::.+?)?}+)/gi,\n );\n\n let match: RegExpExecArray | null;\n do {\n match = variableRegex.exec(image);\n if (match?.groups?.fullvariable) {\n variables[match.groups.fullvariable] =\n match.groups?.simplearg || match.groups?.complexarg;\n }\n } while (match);\n\n return variables;\n}\n\nfunction getAutoReplaceTemplate(dep: PackageDependency): string | undefined {\n let template = dep.replaceString;\n\n if (dep.currentValue) {\n let placeholder = '{{#if newValue}}{{newValue}}{{/if}}';\n if (!dep.currentDigest) {\n placeholder += '{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n template = template?.replace(dep.currentValue, placeholder);\n }\n\n if (dep.currentDigest) {\n template = template?.replace(\n dep.currentDigest,\n '{{#if newDigest}}{{newDigest}}{{/if}}',\n );\n }\n\n return template;\n}\n\nfunction processDepForAutoReplace(\n dep: PackageDependency,\n lineNumberRanges: number[][],\n lines: string[],\n linefeed: string,\n): void {\n const lineNumberRangesToReplace: number[][] = [];\n for (const lineNumberRange of lineNumberRanges) {\n for (const lineNumber of lineNumberRange) {\n if (\n (isString(dep.currentValue) &&\n lines[lineNumber].includes(dep.currentValue)) ||\n (isString(dep.currentDigest) &&\n lines[lineNumber].includes(dep.currentDigest))\n ) {\n lineNumberRangesToReplace.push(lineNumberRange);\n }\n }\n }\n\n lineNumberRangesToReplace.sort((a, b) => {\n return a[0] - b[0];\n });\n\n const minLine = lineNumberRangesToReplace[0]?.[0];\n const maxLine = lineNumberRangesToReplace.at(-1)?.[1];\n if (\n lineNumberRanges.length === 1 ||\n minLine === undefined ||\n maxLine === undefined\n ) {\n return;\n }\n\n const unfoldedLineNumbers = Array.from(\n { length: maxLine - minLine + 1 },\n (_v, k) => k + minLine,\n );\n\n dep.replaceString = unfoldedLineNumbers\n .map((lineNumber) => lines[lineNumber])\n .join(linefeed);\n\n if (!dep.currentDigest) {\n dep.replaceString += linefeed;\n }\n\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n}\n\nexport function splitImageParts(currentFrom: string): PackageDependency {\n let isVariable = false;\n let cleanedCurrentFrom = currentFrom;\n\n // Check if we have a variable in format of \"${VARIABLE:-<image>:<defaultVal>@<digest>}\"\n // If so, remove everything except the image, defaultVal and digest.\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n const defaultValueRegex = regEx(/^\\${.+?:-\"?(?<value>.*?)\"?}$/);\n const defaultValueMatch =\n defaultValueRegex.exec(cleanedCurrentFrom)?.groups;\n if (defaultValueMatch?.value) {\n isVariable = true;\n cleanedCurrentFrom = defaultValueMatch.value;\n }\n\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n // If cleanedCurrentFrom contains a variable, after cleaning, e.g. \"$REGISTRY/alpine\", we do not support this.\n return {\n skipReason: 'contains-variable',\n };\n }\n }\n\n const [currentDepTag, currentDigest] = cleanedCurrentFrom.split('@');\n const depTagSplit = currentDepTag.split(':');\n let depName: string;\n let currentValue: string | undefined;\n if (depTagSplit.length === 1 || depTagSplit.at(-1)!.includes('/')) {\n depName = currentDepTag;\n } else {\n currentValue = depTagSplit.pop();\n depName = depTagSplit.join(':');\n }\n\n const dep: PackageDependency = {\n depName,\n packageName: depName,\n currentValue,\n currentDigest,\n };\n\n if (isVariable) {\n dep.replaceString = cleanedCurrentFrom;\n\n if (!dep.currentValue) {\n delete dep.currentValue;\n }\n\n if (!dep.currentDigest) {\n delete dep.currentDigest;\n }\n }\n\n return dep;\n}\n\nconst quayRegex = regEx(/^quay\\.io(?::[1-9][0-9]{0,4})?/i);\n\nexport function getDep(\n currentFrom: string | null | undefined,\n specifyReplaceString = true,\n registryAliases?: Record<string, string>,\n): PackageDependency {\n if (\n !isString(currentFrom) ||\n !isNonEmptyStringAndNotWhitespace(currentFrom)\n ) {\n return {\n skipReason: 'invalid-value',\n };\n }\n\n // Resolve registry aliases first so that we don't need special casing later on:\n for (const [name, value] of Object.entries(coerceObject(registryAliases))) {\n // Allow `${VAR}`/`${VAR:-...}` keys to match without a trailing slash\n // (`}` is an unambiguous boundary). Bare identifier keys like\n // `$CI_REGISTRY` still require `/` so they can't eat `$CI_REGISTRY_IMAGE/`.\n const matchedWithSlash = currentFrom.startsWith(`${name}/`);\n const matchedAtBoundary =\n name.endsWith('}') && currentFrom.startsWith(name);\n if (!matchedWithSlash && !matchedAtBoundary) {\n continue;\n }\n const depName = currentFrom.slice(\n matchedWithSlash ? name.length + 1 : name.length,\n );\n // An empty alias value means \"no registry prefix\", i.e. Docker Hub.\n const valueWithSlash = value ? ensureTrailingSlash(value) : '';\n const dep = getDep(`${valueWithSlash}${depName}`, false);\n // TODO: when the inner getDep strips a `library/` prefix (or similar)\n // the depName no longer starts with `valueWithSlash` and the alias-rooted\n // depName is not restored.\n if (dep.depName?.startsWith(valueWithSlash)) {\n dep.packageName = dep.depName;\n const [imageAndTag] = currentFrom.split('@');\n dep.depName = dep.currentValue\n ? imageAndTag.substring(0, imageAndTag.lastIndexOf(':'))\n : imageAndTag;\n }\n if (specifyReplaceString) {\n dep.replaceString = currentFrom;\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n }\n return dep;\n }\n\n const dep = splitImageParts(currentFrom);\n if (specifyReplaceString) {\n dep.replaceString ??= currentFrom;\n dep.autoReplaceStringTemplate =\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n dep.datasource = DockerDatasource.id;\n\n // Pretty up special prefixes\n if (dep.depName) {\n const specialPrefixes = ['amd64', 'arm64', 'library'];\n for (const prefix of specialPrefixes) {\n if (dep.depName.startsWith(`${prefix}/`)) {\n dep.depName = dep.depName.replace(`${prefix}/`, '');\n if (specifyReplaceString) {\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n }\n }\n\n if (dep.depName === 'ubuntu' || dep.depName?.endsWith('/ubuntu')) {\n dep.versioning = ubuntuVersioning.id;\n }\n\n if (\n (dep.depName === 'debian' || dep.depName?.endsWith('/debian')) &&\n debianVersioning.api.isVersion(dep.currentValue)\n ) {\n dep.versioning = debianVersioning.id;\n }\n\n // Don't display quay.io ports\n if (dep.depName && quayRegex.test(dep.depName)) {\n const depName = dep.depName.replace(quayRegex, 'quay.io');\n if (depName !== dep.depName) {\n dep.depName = depName;\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n\n return dep;\n}\n\nexport function extractPackageFile(\n content: string,\n _packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const sanitizedContent = content.replace(regEx(/^\\uFEFF/), ''); // remove bom marker\n const deps: PackageDependency[] = [];\n const stageNames: string[] = [];\n const args: Record<string, string> = {};\n const argsLines: Record<string, number[]> = {};\n\n let escapeChar = '\\\\\\\\';\n let lookForEscapeChar = true;\n let lookForSyntaxDirective = true;\n\n const lineFeed = sanitizedContent.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = sanitizedContent.split(newlineRegex);\n for (let lineNumber = 0; lineNumber < lines.length; ) {\n const lineNumberInstrStart = lineNumber;\n let instruction = lines[lineNumber];\n\n if (lookForEscapeChar) {\n const directivesMatch = regEx(\n /^[ \\t]*#[ \\t]*(?<directive>syntax|escape)[ \\t]*=[ \\t]*(?<escapeChar>\\S)/i,\n ).exec(instruction);\n if (!directivesMatch) {\n lookForEscapeChar = false;\n } else if (directivesMatch.groups?.directive.toLowerCase() === 'escape') {\n if (directivesMatch.groups?.escapeChar === '`') {\n escapeChar = '`';\n }\n lookForEscapeChar = false;\n }\n }\n\n if (lookForSyntaxDirective) {\n const syntaxRegex = regEx(\n '^#[ \\\\t]*syntax[ \\\\t]*=[ \\\\t]*(?<image>\\\\S+)',\n 'im',\n );\n const syntaxMatch = instruction.match(syntaxRegex);\n if (syntaxMatch?.groups?.image) {\n const syntaxImage = syntaxMatch.groups.image;\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n const dep = getDep(syntaxImage, true, config.registryAliases);\n dep.depType = 'syntax';\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile # syntax',\n );\n deps.push(dep);\n }\n lookForSyntaxDirective = false;\n }\n\n const lineContinuationRegex = regEx(`${escapeChar}[ \\\\t]*$|^[ \\\\t]*#`, 'm');\n let lineLookahead = instruction;\n while (\n !lookForEscapeChar &&\n !instruction.trimStart().startsWith('#') &&\n lineContinuationRegex.test(lineLookahead)\n ) {\n lineLookahead = lines[++lineNumber] || '';\n instruction += `\\n${lineLookahead}`;\n }\n\n const argRegex = regEx(\n `^[ \\\\t]*ARG(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+(?<name>\\\\w+)[ =](?<value>\\\\S*)`,\n 'im',\n );\n const argMatch = argRegex.exec(instruction);\n if (argMatch?.groups?.name) {\n argsLines[argMatch.groups.name] = [lineNumberInstrStart, lineNumber];\n let argMatchValue = argMatch.groups?.value;\n\n if (\n (argMatchValue.startsWith('\"') && argMatchValue.endsWith('\"')) ||\n (argMatchValue.startsWith(\"'\") && argMatchValue.endsWith(\"'\"))\n ) {\n argMatchValue = argMatchValue.slice(1, -1);\n }\n\n args[argMatch.groups.name] = argMatchValue || '';\n }\n\n const fromRegex = regEx(\n `^[ \\\\t]*FROM(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--platform=\\\\S+)+(?<image>\\\\S+)(?:(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+as[ \\\\t]+(?<name>\\\\S+))?`,\n 'im',\n );\n const fromMatch = instruction.match(fromRegex);\n if (fromMatch?.groups?.image) {\n let fromImage = fromMatch.groups.image;\n const lineNumberRanges: number[][] = [[lineNumberInstrStart, lineNumber]];\n\n if (fromImage.includes(variableMarker)) {\n const variables = extractVariables(fromImage);\n for (const [fullVariable, argName] of Object.entries(variables)) {\n const resolvedArgValue = args[argName];\n if (resolvedArgValue || resolvedArgValue === '') {\n fromImage = fromImage.replaceAll(fullVariable, resolvedArgValue);\n lineNumberRanges.push(argsLines[argName]);\n }\n }\n }\n\n if (fromMatch.groups?.name) {\n logger.debug(\n `Found a multistage build stage name: ${fromMatch.groups.name}`,\n );\n stageNames.push(fromMatch.groups.name);\n }\n if (fromImage === 'scratch') {\n logger.debug('Skipping scratch');\n } else if (fromImage && stageNames.includes(fromImage)) {\n logger.debug(`Skipping alias FROM image:${fromImage}`);\n } else {\n const dep = getDep(fromImage, true, config.registryAliases);\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile FROM',\n );\n deps.push(dep);\n }\n }\n\n const copyFromRegex = regEx(\n `^[ \\\\t]*COPY(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--from=(?<image>\\\\S+)`,\n 'im',\n );\n const copyFromMatch = instruction.match(copyFromRegex);\n if (copyFromMatch?.groups?.image) {\n if (stageNames.includes(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping alias COPY --from',\n );\n } else if (isNumericString(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping index reference COPY --from',\n );\n } else {\n const dep = getDep(\n copyFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile COPY --from',\n );\n deps.push(dep);\n }\n }\n\n const runMountFromRegex = regEx(\n `^[ \\\\t]*RUN(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--mount=(?:\\\\S*=\\\\S*,)*from=(?<image>[^, ]+)`,\n 'im',\n );\n const runMountFromMatch = instruction.match(runMountFromRegex);\n if (runMountFromMatch?.groups?.image) {\n if (stageNames.includes(runMountFromMatch.groups.image)) {\n logger.debug(\n { image: runMountFromMatch.groups.image },\n 'Skipping alias RUN --mount=from',\n );\n } else {\n const dep = getDep(\n runMountFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile RUN --mount=from',\n );\n deps.push(dep);\n }\n }\n\n lineNumber += 1;\n }\n\n if (!deps.length) {\n return null;\n }\n for (const d of deps) {\n d.depType ??= 'stage';\n }\n // find the last `stage`, and treat it as the `final` stage\n const lastStage = deps.filter((d) => d.depType === 'stage').at(-1);\n if (lastStage) {\n lastStage.depType = 'final';\n }\n return { deps };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extract.js","names":["ubuntuVersioning.id","debianVersioning.id"],"sources":["../../../../lib/modules/manager/dockerfile/extract.ts"],"sourcesContent":["import {\n isNonEmptyStringAndNotWhitespace,\n isNumericString,\n isString,\n} from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport * as debianVersioning from '../../versioning/debian/index.ts';\nimport * as ubuntuVersioning from '../../versioning/ubuntu/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\n\nconst variableMarker = '$';\n\nexport function extractVariables(image: string): Record<string, string> {\n const variables: Record<string, string> = {};\n const variableRegex = regEx(\n /(?<fullvariable>\\\\?\\$(?<simplearg>\\w+)|\\\\?\\${(?<complexarg>\\w+)(?::.+?)?}+)/gi,\n );\n\n let match: RegExpExecArray | null;\n do {\n match = variableRegex.exec(image);\n if (match?.groups?.fullvariable) {\n variables[match.groups.fullvariable] =\n match.groups?.simplearg || match.groups?.complexarg;\n }\n } while (match);\n\n return variables;\n}\n\nfunction getAutoReplaceTemplate(dep: PackageDependency): string | undefined {\n let template = dep.replaceString;\n\n if (dep.currentValue) {\n let placeholder = '{{#if newValue}}{{newValue}}{{/if}}';\n if (!dep.currentDigest) {\n placeholder += '{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n template = template?.replace(dep.currentValue, placeholder);\n }\n\n if (dep.currentDigest) {\n template = template?.replace(\n dep.currentDigest,\n '{{#if newDigest}}{{newDigest}}{{/if}}',\n );\n }\n\n return template;\n}\n\nfunction processDepForAutoReplace(\n dep: PackageDependency,\n lineNumberRanges: number[][],\n lines: string[],\n linefeed: string,\n): void {\n const lineNumberRangesToReplace: number[][] = [];\n for (const lineNumberRange of lineNumberRanges) {\n for (const lineNumber of lineNumberRange) {\n if (\n (isString(dep.currentValue) &&\n lines[lineNumber].includes(dep.currentValue)) ||\n (isString(dep.currentDigest) &&\n lines[lineNumber].includes(dep.currentDigest))\n ) {\n lineNumberRangesToReplace.push(lineNumberRange);\n }\n }\n }\n\n lineNumberRangesToReplace.sort((a, b) => {\n return a[0] - b[0];\n });\n\n const minLine = lineNumberRangesToReplace[0]?.[0];\n const maxLine = lineNumberRangesToReplace.at(-1)?.[1];\n if (\n lineNumberRanges.length === 1 ||\n minLine === undefined ||\n maxLine === undefined\n ) {\n return;\n }\n\n const unfoldedLineNumbers = Array.from(\n { length: maxLine - minLine + 1 },\n (_v, k) => k + minLine,\n );\n\n dep.replaceString = unfoldedLineNumbers\n .map((lineNumber) => lines[lineNumber])\n .join(linefeed);\n\n if (!dep.currentDigest) {\n dep.replaceString += linefeed;\n }\n\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n}\n\nexport function splitImageParts(currentFrom: string): PackageDependency {\n let isVariable = false;\n let cleanedCurrentFrom = currentFrom;\n\n // Check if we have a variable in format of \"${VARIABLE:-<image>:<defaultVal>@<digest>}\"\n // If so, remove everything except the image, defaultVal and digest.\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n const defaultValueRegex = regEx(/^\\${.+?:-\"?(?<value>.*?)\"?}$/);\n const defaultValueMatch =\n defaultValueRegex.exec(cleanedCurrentFrom)?.groups;\n if (defaultValueMatch?.value) {\n isVariable = true;\n cleanedCurrentFrom = defaultValueMatch.value;\n }\n\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n // If cleanedCurrentFrom contains a variable, after cleaning, e.g. \"$REGISTRY/alpine\", we do not support this.\n return {\n skipReason: 'contains-variable',\n };\n }\n }\n\n const [currentDepTag, currentDigest] = cleanedCurrentFrom.split('@');\n const depTagSplit = currentDepTag.split(':');\n let depName: string;\n let currentValue: string | undefined;\n if (depTagSplit.length === 1 || depTagSplit.at(-1)!.includes('/')) {\n depName = currentDepTag;\n } else {\n currentValue = depTagSplit.pop();\n depName = depTagSplit.join(':');\n }\n\n const dep: PackageDependency = {\n depName,\n packageName: depName,\n currentValue,\n currentDigest,\n };\n\n if (isVariable) {\n dep.replaceString = cleanedCurrentFrom;\n\n if (!dep.currentValue) {\n delete dep.currentValue;\n }\n\n if (!dep.currentDigest) {\n delete dep.currentDigest;\n }\n }\n\n return dep;\n}\n\nconst quayRegex = regEx(/^quay\\.io(?::[1-9][0-9]{0,4})?/i);\n\nexport function getDep(\n currentFrom: string | null | undefined,\n specifyReplaceString = true,\n registryAliases?: Record<string, string>,\n): PackageDependency {\n if (\n !isString(currentFrom) ||\n !isNonEmptyStringAndNotWhitespace(currentFrom)\n ) {\n return {\n skipReason: 'invalid-value',\n };\n }\n\n // Resolve registry aliases first so that we don't need special casing later on:\n for (const [name, value] of Object.entries(coerceObject(registryAliases))) {\n // Allow `${VAR}`/`${VAR:-...}` keys to match without a trailing slash\n // (`}` is an unambiguous boundary). Bare identifier keys like\n // `$CI_REGISTRY` still require `/` so they can't eat `$CI_REGISTRY_IMAGE/`.\n const matchedWithSlash = currentFrom.startsWith(`${name}/`);\n const matchedAtBoundary =\n name.endsWith('}') && currentFrom.startsWith(name);\n if (!matchedWithSlash && !matchedAtBoundary) {\n continue;\n }\n const depName = currentFrom.slice(\n matchedWithSlash ? name.length + 1 : name.length,\n );\n // An empty alias value means \"no registry prefix\", i.e. Docker Hub.\n const valueWithSlash = value ? ensureTrailingSlash(value) : '';\n const dep = getDep(`${valueWithSlash}${depName}`, false);\n // TODO: when the inner getDep strips a `library/` prefix (or similar)\n // the depName no longer starts with `valueWithSlash` and the alias-rooted\n // depName is not restored.\n if (dep.depName?.startsWith(valueWithSlash)) {\n dep.packageName = dep.depName;\n const [imageAndTag] = currentFrom.split('@');\n dep.depName = dep.currentValue\n ? imageAndTag.substring(0, imageAndTag.lastIndexOf(':'))\n : imageAndTag;\n }\n if (specifyReplaceString) {\n dep.replaceString = currentFrom;\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n }\n return dep;\n }\n\n const dep = splitImageParts(currentFrom);\n if (specifyReplaceString) {\n dep.replaceString ??= currentFrom;\n dep.autoReplaceStringTemplate =\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n dep.datasource = DockerDatasource.id;\n\n // Pretty up special prefixes\n if (dep.depName) {\n const specialPrefixes = ['amd64', 'arm64', 'library'];\n for (const prefix of specialPrefixes) {\n if (dep.depName.startsWith(`${prefix}/`)) {\n dep.depName = dep.depName.replace(`${prefix}/`, '');\n if (specifyReplaceString) {\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n }\n }\n\n if (dep.depName === 'ubuntu' || dep.depName?.endsWith('/ubuntu')) {\n dep.versioning = ubuntuVersioning.id;\n }\n\n if (\n (dep.depName === 'debian' || dep.depName?.endsWith('/debian')) &&\n debianVersioning.api.isVersion(dep.currentValue)\n ) {\n dep.versioning = debianVersioning.id;\n }\n\n // Don't display quay.io ports\n if (dep.depName && quayRegex.test(dep.depName)) {\n const depName = dep.depName.replace(quayRegex, 'quay.io');\n if (depName !== dep.depName) {\n dep.depName = depName;\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n\n return dep;\n}\n\nexport function extractPackageFile(\n content: string,\n _packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const sanitizedContent = content.replace(regEx(/^\\uFEFF/), ''); // remove bom marker\n const deps: PackageDependency[] = [];\n const stageNames: string[] = [];\n const args: Record<string, string> = {};\n const argsLines: Record<string, number[]> = {};\n\n let escapeChar = '\\\\\\\\';\n let lookForEscapeChar = true;\n let lookForSyntaxDirective = true;\n\n const lineFeed = sanitizedContent.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = sanitizedContent.split(newlineRegex);\n for (let lineNumber = 0; lineNumber < lines.length;) {\n const lineNumberInstrStart = lineNumber;\n let instruction = lines[lineNumber];\n\n if (lookForEscapeChar) {\n const directivesMatch = regEx(\n /^[ \\t]*#[ \\t]*(?<directive>syntax|escape)[ \\t]*=[ \\t]*(?<escapeChar>\\S)/i,\n ).exec(instruction);\n if (!directivesMatch) {\n lookForEscapeChar = false;\n } else if (directivesMatch.groups?.directive.toLowerCase() === 'escape') {\n if (directivesMatch.groups?.escapeChar === '`') {\n escapeChar = '`';\n }\n lookForEscapeChar = false;\n }\n }\n\n if (lookForSyntaxDirective) {\n const syntaxRegex = regEx(\n '^#[ \\\\t]*syntax[ \\\\t]*=[ \\\\t]*(?<image>\\\\S+)',\n 'im',\n );\n const syntaxMatch = instruction.match(syntaxRegex);\n if (syntaxMatch?.groups?.image) {\n const syntaxImage = syntaxMatch.groups.image;\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n const dep = getDep(syntaxImage, true, config.registryAliases);\n dep.depType = 'syntax';\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile # syntax',\n );\n deps.push(dep);\n }\n lookForSyntaxDirective = false;\n }\n\n const lineContinuationRegex = regEx(`${escapeChar}[ \\\\t]*$|^[ \\\\t]*#`, 'm');\n let lineLookahead = instruction;\n while (\n !lookForEscapeChar &&\n !instruction.trimStart().startsWith('#') &&\n lineContinuationRegex.test(lineLookahead)\n ) {\n lineLookahead = lines[++lineNumber] || '';\n instruction += `\\n${lineLookahead}`;\n }\n\n const argRegex = regEx(\n `^[ \\\\t]*ARG(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+(?<name>\\\\w+)[ =](?<value>\\\\S*)`,\n 'im',\n );\n const argMatch = argRegex.exec(instruction);\n if (argMatch?.groups?.name) {\n argsLines[argMatch.groups.name] = [lineNumberInstrStart, lineNumber];\n let argMatchValue = argMatch.groups?.value;\n\n if (\n (argMatchValue.startsWith('\"') && argMatchValue.endsWith('\"')) ||\n (argMatchValue.startsWith(\"'\") && argMatchValue.endsWith(\"'\"))\n ) {\n argMatchValue = argMatchValue.slice(1, -1);\n }\n\n args[argMatch.groups.name] = argMatchValue || '';\n }\n\n const fromRegex = regEx(\n `^[ \\\\t]*FROM(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--platform=\\\\S+)+(?<image>\\\\S+)(?:(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+as[ \\\\t]+(?<name>\\\\S+))?`,\n 'im',\n );\n const fromMatch = instruction.match(fromRegex);\n if (fromMatch?.groups?.image) {\n let fromImage = fromMatch.groups.image;\n const lineNumberRanges: number[][] = [[lineNumberInstrStart, lineNumber]];\n\n if (fromImage.includes(variableMarker)) {\n const variables = extractVariables(fromImage);\n for (const [fullVariable, argName] of Object.entries(variables)) {\n const resolvedArgValue = args[argName];\n if (resolvedArgValue || resolvedArgValue === '') {\n fromImage = fromImage.replaceAll(fullVariable, resolvedArgValue);\n lineNumberRanges.push(argsLines[argName]);\n }\n }\n }\n\n if (fromMatch.groups?.name) {\n logger.debug(\n `Found a multistage build stage name: ${fromMatch.groups.name}`,\n );\n stageNames.push(fromMatch.groups.name);\n }\n if (fromImage === 'scratch') {\n logger.debug('Skipping scratch');\n } else if (fromImage && stageNames.includes(fromImage)) {\n logger.debug(`Skipping alias FROM image:${fromImage}`);\n } else {\n const dep = getDep(fromImage, true, config.registryAliases);\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile FROM',\n );\n deps.push(dep);\n }\n }\n\n const copyFromRegex = regEx(\n `^[ \\\\t]*COPY(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--from=(?<image>\\\\S+)`,\n 'im',\n );\n const copyFromMatch = instruction.match(copyFromRegex);\n if (copyFromMatch?.groups?.image) {\n if (stageNames.includes(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping alias COPY --from',\n );\n } else if (isNumericString(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping index reference COPY --from',\n );\n } else {\n const dep = getDep(\n copyFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile COPY --from',\n );\n deps.push(dep);\n }\n }\n\n const runMountFromRegex = regEx(\n `^[ \\\\t]*RUN(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--mount=(?:\\\\S*=\\\\S*,)*from=(?<image>[^, ]+)`,\n 'im',\n );\n const runMountFromMatch = instruction.match(runMountFromRegex);\n if (runMountFromMatch?.groups?.image) {\n if (stageNames.includes(runMountFromMatch.groups.image)) {\n logger.debug(\n { image: runMountFromMatch.groups.image },\n 'Skipping alias RUN --mount=from',\n );\n } else {\n const dep = getDep(\n runMountFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile RUN --mount=from',\n );\n deps.push(dep);\n }\n }\n\n lineNumber += 1;\n }\n\n if (!deps.length) {\n return null;\n }\n for (const d of deps) {\n d.depType ??= 'stage';\n }\n // find the last `stage`, and treat it as the `final` stage\n const lastStage = deps.filter((d) => d.depType === 'stage').at(-1);\n if (lastStage) {\n lastStage.depType = 'final';\n }\n return { deps };\n}\n"],"mappings":"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"}
|