renovate 44.125.1 → 44.125.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/config/utils.js +28 -25
  2. package/dist/config/utils.js.map +1 -1
  3. package/dist/config/validation.js +1 -1
  4. package/dist/modules/datasource/datasource.js +0 -4
  5. package/dist/modules/datasource/datasource.js.map +1 -1
  6. package/dist/modules/datasource/deno/index.js +0 -1
  7. package/dist/modules/datasource/deno/index.js.map +1 -1
  8. package/dist/modules/datasource/devbox/index.js +0 -1
  9. package/dist/modules/datasource/devbox/index.js.map +1 -1
  10. package/dist/modules/datasource/hermit/index.js +0 -1
  11. package/dist/modules/datasource/hermit/index.js.map +1 -1
  12. package/dist/modules/datasource/index.d.ts +2 -2
  13. package/dist/modules/datasource/index.js +32 -21
  14. package/dist/modules/datasource/index.js.map +1 -1
  15. package/dist/modules/datasource/jsr/index.js +0 -1
  16. package/dist/modules/datasource/jsr/index.js.map +1 -1
  17. package/dist/modules/datasource/npm/index.js +0 -1
  18. package/dist/modules/datasource/npm/index.js.map +1 -1
  19. package/dist/modules/datasource/postprocess-release.js +1 -2
  20. package/dist/modules/datasource/postprocess-release.js.map +1 -1
  21. package/dist/modules/datasource/types.d.ts +31 -26
  22. package/dist/workers/repository/extract/file-match.js +17 -12
  23. package/dist/workers/repository/extract/file-match.js.map +1 -1
  24. package/dist/workers/repository/extract/index.js +3 -3
  25. package/dist/workers/repository/extract/index.js.map +1 -1
  26. package/dist/workers/repository/process/fetch.js +1 -1
  27. package/dist/workers/repository/process/index.js +1 -1
  28. package/dist/workers/repository/process/vulnerabilities.js +1 -1
  29. package/package.json +1 -1
  30. package/renovate-schema.json +2 -2
@@ -1,35 +1,38 @@
1
1
  import { logger } from "../logger/index.js";
2
2
  import { clone } from "../util/clone.js";
3
3
  import { getOptions } from "./options/index.js";
4
+ import { instrument } from "../instrumentation/index.js";
4
5
  import { getHighestVulnerabilitySeverity } from "../util/vulnerability/utils.js";
5
6
  //#region lib/config/utils.ts
6
7
  function mergeChildConfig(parent, child) {
7
- logger.trace({
8
- parent,
9
- child
10
- }, `mergeChildConfig`);
11
- if (!child) return parent;
12
- const parentConfig = clone(parent);
13
- const childConfig = clone(child);
14
- const config = {
15
- ...parentConfig,
16
- ...childConfig
17
- };
18
- if (config?.isVulnerabilityAlert) config.vulnerabilitySeverity = getHighestVulnerabilitySeverity(parent, child);
19
- for (const option of getOptions()) if (option.mergeable && childConfig[option.name] && parentConfig[option.name]) {
20
- logger.trace(`mergeable option: ${option.name}`);
21
- if (option.name === "constraints") config[option.name] = {
22
- ...parentConfig[option.name],
23
- ...childConfig[option.name]
8
+ return instrument("mergeChildConfig", () => {
9
+ logger.trace({
10
+ parent,
11
+ child
12
+ }, `mergeChildConfig`);
13
+ if (!child) return parent;
14
+ const parentConfig = clone(parent);
15
+ const childConfig = clone(child);
16
+ const config = {
17
+ ...parentConfig,
18
+ ...childConfig
24
19
  };
25
- else if (option.type === "array") config[option.name] = parentConfig[option.name].concat(config[option.name]);
26
- else config[option.name] = mergeChildConfig(parentConfig[option.name], childConfig[option.name]);
27
- logger.trace({ result: config[option.name] }, `Merged config.${option.name}`);
28
- }
29
- return {
30
- ...config,
31
- ...config.force
32
- };
20
+ if (config?.isVulnerabilityAlert) config.vulnerabilitySeverity = getHighestVulnerabilitySeverity(parent, child);
21
+ for (const option of getOptions()) if (option.mergeable && childConfig[option.name] && parentConfig[option.name]) {
22
+ logger.trace(`mergeable option: ${option.name}`);
23
+ if (option.name === "constraints") config[option.name] = {
24
+ ...parentConfig[option.name],
25
+ ...childConfig[option.name]
26
+ };
27
+ else if (option.type === "array") config[option.name] = parentConfig[option.name].concat(config[option.name]);
28
+ else config[option.name] = mergeChildConfig(parentConfig[option.name], childConfig[option.name]);
29
+ logger.trace({ result: config[option.name] }, `Merged config.${option.name}`);
30
+ }
31
+ return {
32
+ ...config,
33
+ ...config.force
34
+ };
35
+ });
33
36
  }
34
37
  //#endregion
35
38
  export { mergeChildConfig };
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["options.getOptions"],"sources":["../../lib/config/utils.ts"],"sourcesContent":["import { logger } from '../logger/index.ts';\nimport { clone } from '../util/clone.ts';\nimport { getHighestVulnerabilitySeverity } from '../util/vulnerability/utils.ts';\nimport * as options from './options/index.ts';\nimport type { RenovateConfig } from './types.ts';\n\nexport function mergeChildConfig<\n T extends Record<string, any>,\n TChild extends Record<string, any> | undefined,\n>(parent: T, child: TChild): T & TChild {\n logger.trace({ parent, child }, `mergeChildConfig`);\n if (!child) {\n return parent as never;\n }\n const parentConfig = clone(parent);\n const childConfig = clone(child);\n const config: Record<string, any> = { ...parentConfig, ...childConfig };\n\n // Ensure highest severity survives parent / child merge\n if (config?.isVulnerabilityAlert) {\n config.vulnerabilitySeverity = getHighestVulnerabilitySeverity(\n parent,\n child,\n );\n }\n\n for (const option of options.getOptions()) {\n if (\n option.mergeable &&\n childConfig[option.name] &&\n parentConfig[option.name]\n ) {\n logger.trace(`mergeable option: ${option.name}`);\n\n if (option.name === 'constraints') {\n config[option.name] = {\n ...parentConfig[option.name],\n ...childConfig[option.name],\n };\n } else if (option.type === 'array') {\n config[option.name] = (parentConfig[option.name] as unknown[]).concat(\n config[option.name],\n );\n } else {\n config[option.name] = mergeChildConfig(\n parentConfig[option.name] as RenovateConfig,\n childConfig[option.name] as RenovateConfig,\n );\n }\n logger.trace(\n { result: config[option.name] },\n `Merged config.${option.name}`,\n );\n }\n }\n return { ...config, ...config.force };\n}\n"],"mappings":";;;;;AAMA,SAAgB,iBAGd,QAAW,OAA2B;CACtC,OAAO,MAAM;EAAE;EAAQ;CAAM,GAAG,kBAAkB;CAClD,IAAI,CAAC,OACH,OAAO;CAET,MAAM,eAAe,MAAM,MAAM;CACjC,MAAM,cAAc,MAAM,KAAK;CAC/B,MAAM,SAA8B;EAAE,GAAG;EAAc,GAAG;CAAY;CAGtE,IAAI,QAAQ,sBACV,OAAO,wBAAwB,gCAC7B,QACA,KACF;CAGF,KAAK,MAAM,UAAUA,WAAmB,GACtC,IACE,OAAO,aACP,YAAY,OAAO,SACnB,aAAa,OAAO,OACpB;EACA,OAAO,MAAM,qBAAqB,OAAO,MAAM;EAE/C,IAAI,OAAO,SAAS,eAClB,OAAO,OAAO,QAAQ;GACpB,GAAG,aAAa,OAAO;GACvB,GAAG,YAAY,OAAO;EACxB;OACK,IAAI,OAAO,SAAS,SACzB,OAAO,OAAO,QAAS,aAAa,OAAO,KAAK,CAAe,OAC7D,OAAO,OAAO,KAChB;OAEA,OAAO,OAAO,QAAQ,iBACpB,aAAa,OAAO,OACpB,YAAY,OAAO,KACrB;EAEF,OAAO,MACL,EAAE,QAAQ,OAAO,OAAO,MAAM,GAC9B,iBAAiB,OAAO,MAC1B;CACF;CAEF,OAAO;EAAE,GAAG;EAAQ,GAAG,OAAO;CAAM;AACtC"}
1
+ {"version":3,"file":"utils.js","names":["options.getOptions"],"sources":["../../lib/config/utils.ts"],"sourcesContent":["import { instrument } from '../instrumentation/index.ts';\nimport { logger } from '../logger/index.ts';\nimport { clone } from '../util/clone.ts';\nimport { getHighestVulnerabilitySeverity } from '../util/vulnerability/utils.ts';\nimport * as options from './options/index.ts';\nimport type { RenovateConfig } from './types.ts';\n\nexport function mergeChildConfig<\n T extends Record<string, any>,\n TChild extends Record<string, any> | undefined,\n>(parent: T, child: TChild): T & TChild {\n return instrument('mergeChildConfig', () => {\n logger.trace({ parent, child }, `mergeChildConfig`);\n if (!child) {\n return parent as never;\n }\n const parentConfig = clone(parent);\n const childConfig = clone(child);\n const config: Record<string, any> = { ...parentConfig, ...childConfig };\n\n // Ensure highest severity survives parent / child merge\n if (config?.isVulnerabilityAlert) {\n config.vulnerabilitySeverity = getHighestVulnerabilitySeverity(\n parent,\n child,\n );\n }\n\n for (const option of options.getOptions()) {\n if (\n option.mergeable &&\n childConfig[option.name] &&\n parentConfig[option.name]\n ) {\n logger.trace(`mergeable option: ${option.name}`);\n\n if (option.name === 'constraints') {\n config[option.name] = {\n ...parentConfig[option.name],\n ...childConfig[option.name],\n };\n } else if (option.type === 'array') {\n config[option.name] = (parentConfig[option.name] as unknown[]).concat(\n config[option.name],\n );\n } else {\n config[option.name] = mergeChildConfig(\n parentConfig[option.name] as RenovateConfig,\n childConfig[option.name] as RenovateConfig,\n );\n }\n logger.trace(\n { result: config[option.name] },\n `Merged config.${option.name}`,\n );\n }\n }\n return { ...config, ...config.force };\n });\n}\n"],"mappings":";;;;;;AAOA,SAAgB,iBAGd,QAAW,OAA2B;CACtC,OAAO,WAAW,0BAA0B;EAC1C,OAAO,MAAM;GAAE;GAAQ;EAAM,GAAG,kBAAkB;EAClD,IAAI,CAAC,OACH,OAAO;EAET,MAAM,eAAe,MAAM,MAAM;EACjC,MAAM,cAAc,MAAM,KAAK;EAC/B,MAAM,SAA8B;GAAE,GAAG;GAAc,GAAG;EAAY;EAGtE,IAAI,QAAQ,sBACV,OAAO,wBAAwB,gCAC7B,QACA,KACF;EAGF,KAAK,MAAM,UAAUA,WAAmB,GACtC,IACE,OAAO,aACP,YAAY,OAAO,SACnB,aAAa,OAAO,OACpB;GACA,OAAO,MAAM,qBAAqB,OAAO,MAAM;GAE/C,IAAI,OAAO,SAAS,eAClB,OAAO,OAAO,QAAQ;IACpB,GAAG,aAAa,OAAO;IACvB,GAAG,YAAY,OAAO;GACxB;QACK,IAAI,OAAO,SAAS,SACzB,OAAO,OAAO,QAAS,aAAa,OAAO,KAAK,CAAe,OAC7D,OAAO,OAAO,KAChB;QAEA,OAAO,OAAO,QAAQ,iBACpB,aAAa,OAAO,OACpB,YAAY,OAAO,KACrB;GAEF,OAAO,MACL,EAAE,QAAQ,OAAO,OAAO,MAAM,GAC9B,iBAAiB,OAAO,MAC1B;EACF;EAEF,OAAO;GAAE,GAAG;GAAQ,GAAG,OAAO;EAAM;CACtC,CAAC;AACH"}
@@ -11,8 +11,8 @@ import { supportedDatasources } from "./presets/internal/merge-confidence.preset
11
11
  import { allowedStatusCheckStrings } from "./types.js";
12
12
  import { getOptions } from "./options/index.js";
13
13
  import { parseUrl } from "../util/url.js";
14
- import { migrateConfig } from "./migration.js";
15
14
  import { instrument } from "../instrumentation/index.js";
15
+ import { migrateConfig } from "./migration.js";
16
16
  import { validate } from "../util/template/index.js";
17
17
  import { isCustomManager } from "../modules/manager/custom/index.js";
18
18
  import { packageCacheNamespaces } from "../util/cache/package/namespaces.js";
@@ -51,10 +51,6 @@ var Datasource = class {
51
51
  }
52
52
  throw err;
53
53
  }
54
- // istanbul ignore next: no-op implementation, never called
55
- postprocessRelease(_config, release) {
56
- return Promise.resolve(release);
57
- }
58
54
  };
59
55
  //#endregion
60
56
  export { Datasource };
@@ -1 +1 @@
1
- {"version":3,"file":"datasource.js","names":["HttpError"],"sources":["../../../lib/modules/datasource/datasource.ts"],"sourcesContent":["import { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport type { CachedOptions } from '../../util/cache/package/with-cache.ts';\nimport { withCache } from '../../util/cache/package/with-cache.ts';\nimport { Http, HttpError } from '../../util/http/index.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n SourceUrlSupport,\n} from './types.ts';\n\nexport abstract class Datasource implements DatasourceApi {\n public readonly id: string;\n\n /**\n * The package cache namespace used by {@link Datasource.cached}.\n * Defaults to `datasource-<id>`, which must be registered in\n * `packageCacheNamespaces`.\n */\n protected readonly cacheNamespace: PackageCacheNamespace;\n\n protected constructor(id: string) {\n this.id = id;\n this.http = new Http(id);\n this.cacheNamespace = `datasource-${id}` as PackageCacheNamespace;\n }\n\n caching: boolean | undefined;\n\n defaultConfig: Record<string, unknown> | undefined;\n\n getDefaultRegistryUrls(_packageName: string): string[] | undefined {\n return undefined;\n }\n\n supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n defaultVersioning?: string | undefined;\n\n registryStrategy: RegistryStrategy | undefined = 'first';\n\n releaseTimestampSupport = false;\n releaseTimestampNote?: string | undefined;\n\n sourceUrlSupport: SourceUrlSupport = 'none';\n sourceUrlNote?: string | undefined;\n\n protected http: Http;\n\n abstract getReleases(\n getReleasesConfig: GetReleasesConfig,\n ): Promise<ReleaseResult | null>;\n\n getDigest?(config: DigestConfig, newValue?: string): Promise<string | null>;\n\n handleHttpErrors(_err: HttpError): void {\n // intentionally empty\n }\n\n /**\n * Caches the result of `fn` in the datasource cache namespace.\n *\n * Same as {@link withCache}, except that `namespace` defaults to\n * {@link Datasource.cacheNamespace}.\n */\n protected cached<T>(\n options: Omit<CachedOptions, 'namespace'> & {\n namespace?: PackageCacheNamespace;\n },\n fn: () => T | Promise<T>,\n ): Promise<T> {\n return withCache(\n { ...options, namespace: options.namespace ?? this.cacheNamespace },\n fn,\n );\n }\n\n protected handleGenericErrors(err: Error): never {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n\n if (err instanceof HttpError) {\n this.handleHttpErrors(err);\n\n const statusCode = err.response?.statusCode;\n if (\n statusCode &&\n (statusCode === 429 || (statusCode >= 500 && statusCode < 600))\n ) {\n throw new ExternalHostError(err);\n }\n }\n\n throw err;\n }\n\n // istanbul ignore next: no-op implementation, never called\n postprocessRelease(\n _config: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n return Promise.resolve(release);\n }\n}\n"],"mappings":";;;;;AAiBA,IAAsB,aAAtB,MAA0D;CACxD;;;;;;CAOA;CAEA,YAAsB,IAAY;EAChC,KAAK,KAAK;EACV,KAAK,OAAO,IAAI,KAAK,EAAE;EACvB,KAAK,iBAAiB,cAAc;CACtC;CAEA;CAEA;CAEA,uBAAuB,cAA4C,CAEnE;CAEA,uBAAuB,cAA+B;EACpD,OAAO;CACT;CAEA;CAEA,mBAAiD;CAEjD,0BAA0B;CAC1B;CAEA,mBAAqC;CACrC;CAEA;CAQA,iBAAiB,MAAuB,CAExC;;;;;;;CAQA,OACE,SAGA,IACY;EACZ,OAAO,UACL;GAAE,GAAG;GAAS,WAAW,QAAQ,aAAa,KAAK;EAAe,GAClE,EACF;CACF;CAEA,oBAA8B,KAAmB;EAC/C,IAAI,eAAe,mBACjB,MAAM;EAGR,IAAI,eAAeA,cAAW;GAC5B,KAAK,iBAAiB,GAAG;GAEzB,MAAM,aAAa,IAAI,UAAU;GACjC,IACE,eACC,eAAe,OAAQ,cAAc,OAAO,aAAa,MAE1D,MAAM,IAAI,kBAAkB,GAAG;EAEnC;EAEA,MAAM;CACR;;CAGA,mBACE,SACA,SACmC;EACnC,OAAO,QAAQ,QAAQ,OAAO;CAChC;AACF"}
1
+ {"version":3,"file":"datasource.js","names":["HttpError"],"sources":["../../../lib/modules/datasource/datasource.ts"],"sourcesContent":["import { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport type { CachedOptions } from '../../util/cache/package/with-cache.ts';\nimport { withCache } from '../../util/cache/package/with-cache.ts';\nimport { Http, HttpError } from '../../util/http/index.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n SourceUrlSupport,\n} from './types.ts';\n\nexport abstract class Datasource implements DatasourceApi {\n public readonly id: string;\n\n /**\n * The package cache namespace used by {@link Datasource.cached}.\n * Defaults to `datasource-<id>`, which must be registered in\n * `packageCacheNamespaces`.\n */\n protected readonly cacheNamespace: PackageCacheNamespace;\n\n protected constructor(id: string) {\n this.id = id;\n this.http = new Http(id);\n this.cacheNamespace = `datasource-${id}` as PackageCacheNamespace;\n }\n\n caching: boolean | undefined;\n\n defaultConfig: Record<string, unknown> | undefined;\n\n getDefaultRegistryUrls(_packageName: string): string[] | undefined {\n return undefined;\n }\n\n supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n defaultVersioning?: string | undefined;\n\n registryStrategy: RegistryStrategy = 'first';\n\n releaseTimestampSupport = false;\n releaseTimestampNote?: string | undefined;\n\n sourceUrlSupport: SourceUrlSupport = 'none';\n sourceUrlNote?: string | undefined;\n\n protected http: Http;\n\n abstract getReleases(\n getReleasesConfig: GetReleasesConfig,\n ): Promise<ReleaseResult | null>;\n\n getDigest?(config: DigestConfig, newValue?: string): Promise<string | null>;\n\n postprocessRelease?(\n config: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult>;\n\n handleHttpErrors(_err: HttpError): void {\n // intentionally empty\n }\n\n /**\n * Caches the result of `fn` in the datasource cache namespace.\n *\n * Same as {@link withCache}, except that `namespace` defaults to\n * {@link Datasource.cacheNamespace}.\n */\n protected cached<T>(\n options: Omit<CachedOptions, 'namespace'> & {\n namespace?: PackageCacheNamespace;\n },\n fn: () => T | Promise<T>,\n ): Promise<T> {\n return withCache(\n { ...options, namespace: options.namespace ?? this.cacheNamespace },\n fn,\n );\n }\n\n protected handleGenericErrors(err: Error): never {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n\n if (err instanceof HttpError) {\n this.handleHttpErrors(err);\n\n const statusCode = err.response?.statusCode;\n if (\n statusCode &&\n (statusCode === 429 || (statusCode >= 500 && statusCode < 600))\n ) {\n throw new ExternalHostError(err);\n }\n }\n\n throw err;\n }\n}\n"],"mappings":";;;;;AAiBA,IAAsB,aAAtB,MAA0D;CACxD;;;;;;CAOA;CAEA,YAAsB,IAAY;EAChC,KAAK,KAAK;EACV,KAAK,OAAO,IAAI,KAAK,EAAE;EACvB,KAAK,iBAAiB,cAAc;CACtC;CAEA;CAEA;CAEA,uBAAuB,cAA4C,CAEnE;CAEA,uBAAuB,cAA+B;EACpD,OAAO;CACT;CAEA;CAEA,mBAAqC;CAErC,0BAA0B;CAC1B;CAEA,mBAAqC;CACrC;CAEA;CAaA,iBAAiB,MAAuB,CAExC;;;;;;;CAQA,OACE,SAGA,IACY;EACZ,OAAO,UACL;GAAE,GAAG;GAAS,WAAW,QAAQ,aAAa,KAAK;EAAe,GAClE,EACF;CACF;CAEA,oBAA8B,KAAmB;EAC/C,IAAI,eAAe,mBACjB,MAAM;EAGR,IAAI,eAAeA,cAAW;GAC5B,KAAK,iBAAiB,GAAG;GAEzB,MAAM,aAAa,IAAI,UAAU;GACjC,IACE,eACC,eAAe,OAAQ,cAAc,OAAO,aAAa,MAE1D,MAAM,IAAI,kBAAkB,GAAG;EAEnC;EAEA,MAAM;CACR;AACF"}
@@ -15,7 +15,6 @@ var DenoDatasource = class DenoDatasource extends Datasource {
15
15
  supportsCustomRegistry(_packageName) {
16
16
  return true;
17
17
  }
18
- registryStrategy = "first";
19
18
  defaultVersioning = id;
20
19
  getDefaultRegistryUrls(_packageName) {
21
20
  return ["https://apiland.deno.dev"];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["semanticVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/deno/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as semanticVersioning from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { Release } from '../index.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n DenoAPIModuleResponse,\n DenoAPIModuleVersionResponse,\n} from './schema.ts';\n\nexport class DenoDatasource extends Datasource {\n static readonly id = 'deno';\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = semanticVersioning.id;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://apiland.deno.dev'];\n }\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `uploaded_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(DenoDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const massagedRegistryUrl = registryUrl!;\n\n const extractResult = regEx(\n /^(?:https:\\/\\/deno.land\\/)(?<rawPackageName>[^@\\s]+)/,\n ).exec(packageName);\n const rawPackageName = extractResult?.groups?.rawPackageName;\n if (isNullOrUndefined(rawPackageName)) {\n logger.debug(\n `Could not extract rawPackageName from packageName: \"${packageName}\"`,\n );\n return null;\n }\n\n // remove third-party prefix if defined. The only internal library is `std` and is available under the same API\n const massagedPackageName = rawPackageName.replace('x/', '');\n\n // https://apiland.deno.dev/v2/modules/postgres\n const moduleAPIURL = joinUrlParts(\n massagedRegistryUrl,\n 'v2/modules',\n massagedPackageName,\n );\n\n return await this.getReleaseResult(moduleAPIURL);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getReleaseResult(\n moduleAPIURL: string,\n ): Promise<ReleaseResult> {\n const detailsCacheKey = `details:${moduleAPIURL}`;\n const releasesCache: Record<string, Release> = coerceObject(\n await packageCache.get(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n ),\n );\n let cacheModified = false;\n\n const {\n body: { versions, tags },\n } = await this.http.getJson(moduleAPIURL, DenoAPIModuleResponse);\n\n // get details for the versions\n const releases = await pMap(\n versions,\n async (version) => {\n const cacheRelease = releasesCache[version];\n /* v8 ignore next: hard to test */\n if (cacheRelease) {\n return cacheRelease;\n }\n\n // https://apiland.deno.dev/v2/modules/postgres/v0.17.0\n const url = joinUrlParts(moduleAPIURL, version);\n const { body: release } = await this.http.getJson(\n url,\n DenoAPIModuleVersionResponse.catch(({ error: err }) => {\n logger.warn(\n { err, version },\n 'Deno: failed to get version details',\n );\n return { version };\n }),\n );\n\n releasesCache[release.version] = release;\n cacheModified = true;\n\n return release;\n },\n { concurrency: 5 },\n );\n\n // v8 ignore else -- needs every release already present in the cache\n if (cacheModified) {\n // 1 week. Releases at Deno are immutable, therefore we can use a long term cache here.\n await packageCache.set(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n releasesCache,\n 10080,\n );\n }\n\n return { releases, tags };\n }\n\n getReleaseResult(moduleAPIURL: string): Promise<ReleaseResult> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n key: `getReleaseResult:${moduleAPIURL}`,\n },\n () => this._getReleaseResult(moduleAPIURL),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,mBAAqC;CAErC,oBAAsCA;CAEtC,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,0BAA0B;CACpC;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,sBAAsB;EAK5B,MAAM,iBAHgB,MACpB,sDACF,CAAC,CAAC,KAAK,WAC4B,CAAC,EAAE,QAAQ;EAC9C,IAAI,kBAAkB,cAAc,GAAG;GACrC,OAAO,MACL,uDAAuD,YAAY,EACrE;GACA,OAAO;EACT;EAGA,MAAM,sBAAsB,eAAe,QAAQ,MAAM,EAAE;EAG3D,MAAM,eAAe,aACnB,qBACA,cACA,mBACF;EAEA,OAAO,MAAM,KAAK,iBAAiB,YAAY;CACjD;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GAExC,KAAK,eAAe,OAAO,YAAY,GAAG,OAAO;GACjD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,kBACZ,cACwB;EACxB,MAAM,kBAAkB,WAAW;EACnC,MAAM,gBAAyC,aAC7C,MAAMC,IACJ,cAAc,eAAe,MAC7B,eACF,CACF;EACA,IAAI,gBAAgB;EAEpB,MAAM,EACJ,MAAM,EAAE,UAAU,WAChB,MAAM,KAAK,KAAK,QAAQ,cAAc,qBAAqB;EAG/D,MAAM,WAAW,MAAM,KACrB,UACA,OAAO,YAAY;GACjB,MAAM,eAAe,cAAc;;GAEnC,IAAI,cACF,OAAO;GAIT,MAAM,MAAM,aAAa,cAAc,OAAO;GAC9C,MAAM,EAAE,MAAM,YAAY,MAAM,KAAK,KAAK,QACxC,KACA,6BAA6B,OAAO,EAAE,OAAO,UAAU;IACrD,OAAO,KACL;KAAE;KAAK;IAAQ,GACf,qCACF;IACA,OAAO,EAAE,QAAQ;GACnB,CAAC,CACH;GAEA,cAAc,QAAQ,WAAW;GACjC,gBAAgB;GAEhB,OAAO;EACT,GACA,EAAE,aAAa,EAAE,CACnB;;EAGA,IAAI,eAEF,MAAMC,IACJ,cAAc,eAAe,MAC7B,iBACA,eACA,KACF;EAGF,OAAO;GAAE;GAAU;EAAK;CAC1B;CAEA,iBAAiB,cAA8C;EAC7D,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GACxC,KAAK,oBAAoB;EAC3B,SACM,KAAK,kBAAkB,YAAY,CAC3C;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["semanticVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/deno/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as semanticVersioning from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { Release } from '../index.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n DenoAPIModuleResponse,\n DenoAPIModuleVersionResponse,\n} from './schema.ts';\n\nexport class DenoDatasource extends Datasource {\n static readonly id = 'deno';\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override readonly defaultVersioning = semanticVersioning.id;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://apiland.deno.dev'];\n }\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `uploaded_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(DenoDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const massagedRegistryUrl = registryUrl!;\n\n const extractResult = regEx(\n /^(?:https:\\/\\/deno.land\\/)(?<rawPackageName>[^@\\s]+)/,\n ).exec(packageName);\n const rawPackageName = extractResult?.groups?.rawPackageName;\n if (isNullOrUndefined(rawPackageName)) {\n logger.debug(\n `Could not extract rawPackageName from packageName: \"${packageName}\"`,\n );\n return null;\n }\n\n // remove third-party prefix if defined. The only internal library is `std` and is available under the same API\n const massagedPackageName = rawPackageName.replace('x/', '');\n\n // https://apiland.deno.dev/v2/modules/postgres\n const moduleAPIURL = joinUrlParts(\n massagedRegistryUrl,\n 'v2/modules',\n massagedPackageName,\n );\n\n return await this.getReleaseResult(moduleAPIURL);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getReleaseResult(\n moduleAPIURL: string,\n ): Promise<ReleaseResult> {\n const detailsCacheKey = `details:${moduleAPIURL}`;\n const releasesCache: Record<string, Release> = coerceObject(\n await packageCache.get(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n ),\n );\n let cacheModified = false;\n\n const {\n body: { versions, tags },\n } = await this.http.getJson(moduleAPIURL, DenoAPIModuleResponse);\n\n // get details for the versions\n const releases = await pMap(\n versions,\n async (version) => {\n const cacheRelease = releasesCache[version];\n /* v8 ignore next: hard to test */\n if (cacheRelease) {\n return cacheRelease;\n }\n\n // https://apiland.deno.dev/v2/modules/postgres/v0.17.0\n const url = joinUrlParts(moduleAPIURL, version);\n const { body: release } = await this.http.getJson(\n url,\n DenoAPIModuleVersionResponse.catch(({ error: err }) => {\n logger.warn(\n { err, version },\n 'Deno: failed to get version details',\n );\n return { version };\n }),\n );\n\n releasesCache[release.version] = release;\n cacheModified = true;\n\n return release;\n },\n { concurrency: 5 },\n );\n\n // v8 ignore else -- needs every release already present in the cache\n if (cacheModified) {\n // 1 week. Releases at Deno are immutable, therefore we can use a long term cache here.\n await packageCache.set(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n releasesCache,\n 10080,\n );\n }\n\n return { releases, tags };\n }\n\n getReleaseResult(moduleAPIURL: string): Promise<ReleaseResult> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n key: `getReleaseResult:${moduleAPIURL}`,\n },\n () => this._getReleaseResult(moduleAPIURL),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,oBAAsCA;CAEtC,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,0BAA0B;CACpC;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,sBAAsB;EAK5B,MAAM,iBAHgB,MACpB,sDACF,CAAC,CAAC,KAAK,WAC4B,CAAC,EAAE,QAAQ;EAC9C,IAAI,kBAAkB,cAAc,GAAG;GACrC,OAAO,MACL,uDAAuD,YAAY,EACrE;GACA,OAAO;EACT;EAGA,MAAM,sBAAsB,eAAe,QAAQ,MAAM,EAAE;EAG3D,MAAM,eAAe,aACnB,qBACA,cACA,mBACF;EAEA,OAAO,MAAM,KAAK,iBAAiB,YAAY;CACjD;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GAExC,KAAK,eAAe,OAAO,YAAY,GAAG,OAAO;GACjD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,kBACZ,cACwB;EACxB,MAAM,kBAAkB,WAAW;EACnC,MAAM,gBAAyC,aAC7C,MAAMC,IACJ,cAAc,eAAe,MAC7B,eACF,CACF;EACA,IAAI,gBAAgB;EAEpB,MAAM,EACJ,MAAM,EAAE,UAAU,WAChB,MAAM,KAAK,KAAK,QAAQ,cAAc,qBAAqB;EAG/D,MAAM,WAAW,MAAM,KACrB,UACA,OAAO,YAAY;GACjB,MAAM,eAAe,cAAc;;GAEnC,IAAI,cACF,OAAO;GAIT,MAAM,MAAM,aAAa,cAAc,OAAO;GAC9C,MAAM,EAAE,MAAM,YAAY,MAAM,KAAK,KAAK,QACxC,KACA,6BAA6B,OAAO,EAAE,OAAO,UAAU;IACrD,OAAO,KACL;KAAE;KAAK;IAAQ,GACf,qCACF;IACA,OAAO,EAAE,QAAQ;GACnB,CAAC,CACH;GAEA,cAAc,QAAQ,WAAW;GACjC,gBAAgB;GAEhB,OAAO;EACT,GACA,EAAE,aAAa,EAAE,CACnB;;EAGA,IAAI,eAEF,MAAMC,IACJ,cAAc,eAAe,MAC7B,iBACA,eACA,KACF;EAGF,OAAO;GAAE;GAAU;EAAK;CAC1B;CAEA,iBAAiB,cAA8C;EAC7D,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GACxC,KAAK,oBAAoB;EAC3B,SACM,KAAK,kBAAkB,YAAY,CAC3C;CACF;AACF"}
@@ -17,7 +17,6 @@ var DevboxDatasource = class extends Datasource {
17
17
  return true;
18
18
  }
19
19
  releaseTimestampSupport = true;
20
- registryStrategy = "first";
21
20
  defaultVersioning = id;
22
21
  getDefaultRegistryUrls(_packageName) {
23
22
  return [defaultRegistryUrl];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["devboxVersioning.id","HttpError"],"sources":["../../../../lib/modules/datasource/devbox/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as devboxVersioning from '../../versioning/devbox/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport { DevboxResponse } from './schema.ts';\n\nexport class DevboxDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n override readonly releaseTimestampSupport = true;\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = devboxVersioning.id;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [defaultRegistryUrl];\n }\n\n async getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const res: ReleaseResult = {\n releases: [],\n };\n\n logger.trace({ registryUrl, packageName }, 'fetching devbox release');\n\n const devboxPkgUrl = joinUrlParts(\n registryUrl!,\n `/pkg?name=${encodeURIComponent(packageName)}`,\n );\n\n try {\n const response = await this.http.getJson(devboxPkgUrl, DevboxResponse);\n res.releases = response.body.releases;\n res.homepage = response.body.homepage;\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n return res.releases.length ? res : null;\n }\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAa,mBAAb,cAAsC,WAAW;CAC/C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CACA,0BAA4C;CAE5C,mBAAqC;CAErC,oBAAsCA;CAEtC,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,kBAAkB;CAC5B;CAEA,MAAM,YAAY,EAChB,aACA,eACmD;EACnD,MAAM,MAAqB,EACzB,UAAU,CAAC,EACb;EAEA,OAAO,MAAM;GAAE;GAAa;EAAY,GAAG,yBAAyB;EAEpE,MAAM,eAAe,aACnB,aACA,aAAa,mBAAmB,WAAW,GAC7C;EAEA,IAAI;GACF,MAAM,WAAW,MAAM,KAAK,KAAK,QAAQ,cAAc,cAAc;GACrE,IAAI,WAAW,SAAS,KAAK;GAC7B,IAAI,WAAW,SAAS,KAAK;EAC/B,SAAS,KAAK;GACZ,IAAI,eAAeC,gBAAa,IAAI,UAAU,eAAe,KAC3D,MAAM,IAAI,kBAAkB,GAAG;GAEjC,KAAK,oBAAoB,GAAG;EAC9B;EACA,OAAO,IAAI,SAAS,SAAS,MAAM;CACrC;AACF"}
1
+ {"version":3,"file":"index.js","names":["devboxVersioning.id","HttpError"],"sources":["../../../../lib/modules/datasource/devbox/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as devboxVersioning from '../../versioning/devbox/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport { DevboxResponse } from './schema.ts';\n\nexport class DevboxDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n override readonly releaseTimestampSupport = true;\n\n override readonly defaultVersioning = devboxVersioning.id;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [defaultRegistryUrl];\n }\n\n async getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const res: ReleaseResult = {\n releases: [],\n };\n\n logger.trace({ registryUrl, packageName }, 'fetching devbox release');\n\n const devboxPkgUrl = joinUrlParts(\n registryUrl!,\n `/pkg?name=${encodeURIComponent(packageName)}`,\n );\n\n try {\n const response = await this.http.getJson(devboxPkgUrl, DevboxResponse);\n res.releases = response.body.releases;\n res.homepage = response.body.homepage;\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n return res.releases.length ? res : null;\n }\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAa,mBAAb,cAAsC,WAAW;CAC/C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CACA,0BAA4C;CAE5C,oBAAsCA;CAEtC,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,kBAAkB;CAC5B;CAEA,MAAM,YAAY,EAChB,aACA,eACmD;EACnD,MAAM,MAAqB,EACzB,UAAU,CAAC,EACb;EAEA,OAAO,MAAM;GAAE;GAAa;EAAY,GAAG,yBAAyB;EAEpE,MAAM,eAAe,aACnB,aACA,aAAa,mBAAmB,WAAW,GAC7C;EAEA,IAAI;GACF,MAAM,WAAW,MAAM,KAAK,KAAK,QAAQ,cAAc,cAAc;GACrE,IAAI,WAAW,SAAS,KAAK;GAC7B,IAAI,WAAW,SAAS,KAAK;EAC/B,SAAS,KAAK;GACZ,IAAI,eAAeC,gBAAa,IAAI,UAAU,eAAe,KAC3D,MAAM,IAAI,kBAAkB,GAAG;GAEjC,KAAK,oBAAoB,GAAG;EAC9B;EACA,OAAO,IAAI,SAAS,SAAS,MAAM;CACrC;AACF"}
@@ -19,7 +19,6 @@ var HermitDatasource = class HermitDatasource extends Datasource {
19
19
  supportsCustomRegistry(_packageName) {
20
20
  return true;
21
21
  }
22
- registryStrategy = "first";
23
22
  defaultVersioning = id;
24
23
  getDefaultRegistryUrls(_packageName) {
25
24
  return ["https://github.com/cashapp/hermit-packages"];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/hermit/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport type { GithubRestRelease } from '../../../util/github/types.ts';\nimport { getApiBaseUrl } from '../../../util/github/url.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { streamToString } from '../../../util/streams.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { id } from '../../versioning/hermit/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport type { HermitSearchResult } from './types.ts';\n\n/**\n * Hermit Datasource searches a given package from the specified `hermit-packages`\n * repository. It expects the search manifest to come from an asset `index.json` from\n * a release named index.\n */\nexport class HermitDatasource extends Datasource {\n static readonly id = 'hermit';\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = id;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://github.com/cashapp/hermit-packages'];\n }\n\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `Repository` field in the results.';\n\n pathRegex: RegExp;\n\n constructor() {\n super(HermitDatasource.id);\n this.http = new GithubHttp(id);\n this.pathRegex = regEx('^/(?<owner>[^/]+)/(?<repo>[^/]+)$');\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n logger.trace(`HermitDataSource.getReleases()`);\n\n if (!registryUrl) {\n logger.error('registryUrl must be supplied');\n return null;\n }\n\n const parsedUrl = parseUrl(registryUrl);\n if (parsedUrl === null) {\n logger.warn({ registryUrl }, 'invalid registryUrl given');\n return null;\n }\n\n if (!registryUrl.startsWith('https://github.com/')) {\n logger.warn({ registryUrl }, 'Only Github registryUrl is supported');\n return null;\n }\n\n const items = await this.getHermitSearchManifest(parsedUrl);\n\n if (items === null) {\n return null;\n }\n\n const res = items.find((i) => i.Name === packageName);\n\n if (!res) {\n logger.debug(\n `Could not find hermit package ${packageName} at URL ${registryUrl}`,\n );\n return null;\n }\n\n const sourceUrl = res.Repository;\n\n return {\n sourceUrl,\n releases: [\n ...res.Versions.map((v) => ({\n version: v,\n sourceUrl,\n })),\n ...res.Channels.map((v) => ({\n version: v,\n sourceUrl,\n })),\n ],\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${HermitDatasource.id}`,\n key: `getReleases:${config.registryUrl ?? ''}-${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * getHermitSearchManifest fetch the index.json from release\n * named index, parses it and returned the parsed JSON result\n */\n private async _getHermitSearchManifest(\n u: URL,\n ): Promise<HermitSearchResult[] | null> {\n const registryUrl = u.toString();\n const host = coerceString(u.host);\n const groups = this.pathRegex.exec(coerceString(u.pathname))?.groups;\n if (!groups) {\n logger.warn(\n { registryUrl },\n 'failed to get owner and repo from given url',\n );\n return null;\n }\n\n const { owner, repo } = groups;\n\n const apiBaseUrl = getApiBaseUrl(`https://${host}`);\n\n const indexRelease = await this.http.getJsonUnchecked<GithubRestRelease>(\n `${apiBaseUrl}repos/${owner}/${repo}/releases/tags/index`,\n );\n\n // finds asset with name index.json\n const asset = indexRelease.body.assets.find(\n (asset) => asset.name === 'index.json',\n );\n\n if (!asset) {\n logger.warn(\n { registryUrl },\n `can't find asset index.json in the given registryUrl`,\n );\n return null;\n }\n\n // stream down the content of index.json\n // Note: need to use stream here with\n // the accept header as octet-stream to\n // download asset from private github repository\n // see GithubDoc:\n // https://docs.github.com/en/rest/releases/assets#get-a-release-asset\n const indexContent = await streamToString(\n this.http.stream(asset.url, {\n headers: {\n accept: 'application/octet-stream',\n },\n }),\n );\n\n try {\n return JSON.parse(indexContent) as HermitSearchResult[];\n } catch {\n logger.warn('error parsing hermit search manifest from remote respond');\n }\n\n return null;\n }\n\n getHermitSearchManifest(u: URL): Promise<HermitSearchResult[] | null> {\n return withCache(\n {\n namespace: `datasource-${HermitDatasource.id}`,\n key: `getHermitSearchManifest:${u.toString()}`,\n },\n () => this._getHermitSearchManifest(u),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,IAAa,mBAAb,MAAa,yBAAyB,WAAW;CAC/C,OAAgB,KAAK;CAErB,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,mBAAqC;CAErC,oBAAsC;CAEtC,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,4CAA4C;CACtD;CAEA,mBAAqC;CACrC,gBACE;CAEF;CAEA,cAAc;EACZ,MAAM,iBAAiB,EAAE;EACzB,KAAK,OAAO,IAAI,WAAW,EAAE;EAC7B,KAAK,YAAY,MAAM,mCAAmC;CAC5D;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,OAAO,MAAM,gCAAgC;EAE7C,IAAI,CAAC,aAAa;GAChB,OAAO,MAAM,8BAA8B;GAC3C,OAAO;EACT;EAEA,MAAM,YAAY,SAAS,WAAW;EACtC,IAAI,cAAc,MAAM;GACtB,OAAO,KAAK,EAAE,YAAY,GAAG,2BAA2B;GACxD,OAAO;EACT;EAEA,IAAI,CAAC,YAAY,WAAW,qBAAqB,GAAG;GAClD,OAAO,KAAK,EAAE,YAAY,GAAG,sCAAsC;GACnE,OAAO;EACT;EAEA,MAAM,QAAQ,MAAM,KAAK,wBAAwB,SAAS;EAE1D,IAAI,UAAU,MACZ,OAAO;EAGT,MAAM,MAAM,MAAM,MAAM,MAAM,EAAE,SAAS,WAAW;EAEpD,IAAI,CAAC,KAAK;GACR,OAAO,MACL,iCAAiC,YAAY,UAAU,aACzD;GACA,OAAO;EACT;EAEA,MAAM,YAAY,IAAI;EAEtB,OAAO;GACL;GACA,UAAU,CACR,GAAG,IAAI,SAAS,KAAK,OAAO;IAC1B,SAAS;IACT;GACF,EAAE,GACF,GAAG,IAAI,SAAS,KAAK,OAAO;IAC1B,SAAS;IACT;GACF,EAAE,CACJ;EACF;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,iBAAiB;GAC1C,KAAK,eAAe,OAAO,eAAe,GAAG,GAAG,OAAO;GACvD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;;;;;CAMA,MAAc,yBACZ,GACsC;EACtC,MAAM,cAAc,EAAE,SAAS;EAC/B,MAAM,OAAO,aAAa,EAAE,IAAI;EAChC,MAAM,SAAS,KAAK,UAAU,KAAK,aAAa,EAAE,QAAQ,CAAC,CAAC,EAAE;EAC9D,IAAI,CAAC,QAAQ;GACX,OAAO,KACL,EAAE,YAAY,GACd,6CACF;GACA,OAAO;EACT;EAEA,MAAM,EAAE,OAAO,SAAS;EAExB,MAAM,aAAa,cAAc,WAAW,MAAM;EAOlD,MAAM,SAAQ,MALa,KAAK,KAAK,iBACnC,GAAG,WAAW,QAAQ,MAAM,GAAG,KAAK,qBACtC,EAAA,CAG2B,KAAK,OAAO,MACpC,UAAU,MAAM,SAAS,YAC5B;EAEA,IAAI,CAAC,OAAO;GACV,OAAO,KACL,EAAE,YAAY,GACd,sDACF;GACA,OAAO;EACT;EAQA,MAAM,eAAe,MAAM,eACzB,KAAK,KAAK,OAAO,MAAM,KAAK,EAC1B,SAAS,EACP,QAAQ,2BACV,EACF,CAAC,CACH;EAEA,IAAI;GACF,OAAO,KAAK,MAAM,YAAY;EAChC,QAAQ;GACN,OAAO,KAAK,0DAA0D;EACxE;EAEA,OAAO;CACT;CAEA,wBAAwB,GAA8C;EACpE,OAAO,UACL;GACE,WAAW,cAAc,iBAAiB;GAC1C,KAAK,2BAA2B,EAAE,SAAS;EAC7C,SACM,KAAK,yBAAyB,CAAC,CACvC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/hermit/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport type { GithubRestRelease } from '../../../util/github/types.ts';\nimport { getApiBaseUrl } from '../../../util/github/url.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { streamToString } from '../../../util/streams.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { id } from '../../versioning/hermit/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport type { HermitSearchResult } from './types.ts';\n\n/**\n * Hermit Datasource searches a given package from the specified `hermit-packages`\n * repository. It expects the search manifest to come from an asset `index.json` from\n * a release named index.\n */\nexport class HermitDatasource extends Datasource {\n static readonly id = 'hermit';\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override readonly defaultVersioning = id;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://github.com/cashapp/hermit-packages'];\n }\n\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `Repository` field in the results.';\n\n pathRegex: RegExp;\n\n constructor() {\n super(HermitDatasource.id);\n this.http = new GithubHttp(id);\n this.pathRegex = regEx('^/(?<owner>[^/]+)/(?<repo>[^/]+)$');\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n logger.trace(`HermitDataSource.getReleases()`);\n\n if (!registryUrl) {\n logger.error('registryUrl must be supplied');\n return null;\n }\n\n const parsedUrl = parseUrl(registryUrl);\n if (parsedUrl === null) {\n logger.warn({ registryUrl }, 'invalid registryUrl given');\n return null;\n }\n\n if (!registryUrl.startsWith('https://github.com/')) {\n logger.warn({ registryUrl }, 'Only Github registryUrl is supported');\n return null;\n }\n\n const items = await this.getHermitSearchManifest(parsedUrl);\n\n if (items === null) {\n return null;\n }\n\n const res = items.find((i) => i.Name === packageName);\n\n if (!res) {\n logger.debug(\n `Could not find hermit package ${packageName} at URL ${registryUrl}`,\n );\n return null;\n }\n\n const sourceUrl = res.Repository;\n\n return {\n sourceUrl,\n releases: [\n ...res.Versions.map((v) => ({\n version: v,\n sourceUrl,\n })),\n ...res.Channels.map((v) => ({\n version: v,\n sourceUrl,\n })),\n ],\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${HermitDatasource.id}`,\n key: `getReleases:${config.registryUrl ?? ''}-${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * getHermitSearchManifest fetch the index.json from release\n * named index, parses it and returned the parsed JSON result\n */\n private async _getHermitSearchManifest(\n u: URL,\n ): Promise<HermitSearchResult[] | null> {\n const registryUrl = u.toString();\n const host = coerceString(u.host);\n const groups = this.pathRegex.exec(coerceString(u.pathname))?.groups;\n if (!groups) {\n logger.warn(\n { registryUrl },\n 'failed to get owner and repo from given url',\n );\n return null;\n }\n\n const { owner, repo } = groups;\n\n const apiBaseUrl = getApiBaseUrl(`https://${host}`);\n\n const indexRelease = await this.http.getJsonUnchecked<GithubRestRelease>(\n `${apiBaseUrl}repos/${owner}/${repo}/releases/tags/index`,\n );\n\n // finds asset with name index.json\n const asset = indexRelease.body.assets.find(\n (asset) => asset.name === 'index.json',\n );\n\n if (!asset) {\n logger.warn(\n { registryUrl },\n `can't find asset index.json in the given registryUrl`,\n );\n return null;\n }\n\n // stream down the content of index.json\n // Note: need to use stream here with\n // the accept header as octet-stream to\n // download asset from private github repository\n // see GithubDoc:\n // https://docs.github.com/en/rest/releases/assets#get-a-release-asset\n const indexContent = await streamToString(\n this.http.stream(asset.url, {\n headers: {\n accept: 'application/octet-stream',\n },\n }),\n );\n\n try {\n return JSON.parse(indexContent) as HermitSearchResult[];\n } catch {\n logger.warn('error parsing hermit search manifest from remote respond');\n }\n\n return null;\n }\n\n getHermitSearchManifest(u: URL): Promise<HermitSearchResult[] | null> {\n return withCache(\n {\n namespace: `datasource-${HermitDatasource.id}`,\n key: `getHermitSearchManifest:${u.toString()}`,\n },\n () => this._getHermitSearchManifest(u),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,IAAa,mBAAb,MAAa,yBAAyB,WAAW;CAC/C,OAAgB,KAAK;CAErB,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,oBAAsC;CAEtC,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,4CAA4C;CACtD;CAEA,mBAAqC;CACrC,gBACE;CAEF;CAEA,cAAc;EACZ,MAAM,iBAAiB,EAAE;EACzB,KAAK,OAAO,IAAI,WAAW,EAAE;EAC7B,KAAK,YAAY,MAAM,mCAAmC;CAC5D;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,OAAO,MAAM,gCAAgC;EAE7C,IAAI,CAAC,aAAa;GAChB,OAAO,MAAM,8BAA8B;GAC3C,OAAO;EACT;EAEA,MAAM,YAAY,SAAS,WAAW;EACtC,IAAI,cAAc,MAAM;GACtB,OAAO,KAAK,EAAE,YAAY,GAAG,2BAA2B;GACxD,OAAO;EACT;EAEA,IAAI,CAAC,YAAY,WAAW,qBAAqB,GAAG;GAClD,OAAO,KAAK,EAAE,YAAY,GAAG,sCAAsC;GACnE,OAAO;EACT;EAEA,MAAM,QAAQ,MAAM,KAAK,wBAAwB,SAAS;EAE1D,IAAI,UAAU,MACZ,OAAO;EAGT,MAAM,MAAM,MAAM,MAAM,MAAM,EAAE,SAAS,WAAW;EAEpD,IAAI,CAAC,KAAK;GACR,OAAO,MACL,iCAAiC,YAAY,UAAU,aACzD;GACA,OAAO;EACT;EAEA,MAAM,YAAY,IAAI;EAEtB,OAAO;GACL;GACA,UAAU,CACR,GAAG,IAAI,SAAS,KAAK,OAAO;IAC1B,SAAS;IACT;GACF,EAAE,GACF,GAAG,IAAI,SAAS,KAAK,OAAO;IAC1B,SAAS;IACT;GACF,EAAE,CACJ;EACF;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,iBAAiB;GAC1C,KAAK,eAAe,OAAO,eAAe,GAAG,GAAG,OAAO;GACvD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;;;;;CAMA,MAAc,yBACZ,GACsC;EACtC,MAAM,cAAc,EAAE,SAAS;EAC/B,MAAM,OAAO,aAAa,EAAE,IAAI;EAChC,MAAM,SAAS,KAAK,UAAU,KAAK,aAAa,EAAE,QAAQ,CAAC,CAAC,EAAE;EAC9D,IAAI,CAAC,QAAQ;GACX,OAAO,KACL,EAAE,YAAY,GACd,6CACF;GACA,OAAO;EACT;EAEA,MAAM,EAAE,OAAO,SAAS;EAExB,MAAM,aAAa,cAAc,WAAW,MAAM;EAOlD,MAAM,SAAQ,MALa,KAAK,KAAK,iBACnC,GAAG,WAAW,QAAQ,MAAM,GAAG,KAAK,qBACtC,EAAA,CAG2B,KAAK,OAAO,MACpC,UAAU,MAAM,SAAS,YAC5B;EAEA,IAAI,CAAC,OAAO;GACV,OAAO,KACL,EAAE,YAAY,GACd,sDACF;GACA,OAAO;EACT;EAQA,MAAM,eAAe,MAAM,eACzB,KAAK,KAAK,OAAO,MAAM,KAAK,EAC1B,SAAS,EACP,QAAQ,2BACV,EACF,CAAC,CACH;EAEA,IAAI;GACF,OAAO,KAAK,MAAM,YAAY;EAChC,QAAQ;GACN,OAAO,KAAK,0DAA0D;EACxE;EAEA,OAAO;CACT;CAEA,wBAAwB,GAA8C;EACpE,OAAO,UACL;GACE,WAAW,cAAc,iBAAiB;GAC1C,KAAK,2BAA2B,EAAE,SAAS;EAC7C,SACM,KAAK,yBAAyB,CAAC,CACvC;CACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { DatasourceApi, DigestConfig, GetDigestInputConfig, GetPkgReleasesConfig, GetReleasesConfig, PostprocessReleaseConfig, PostprocessReleaseResult, RegistryStrategy, Release, ReleaseResult, ReleaseTags, SourceUrlSupport } from "./types.js";
1
+ import { DatasourceApi, DigestConfig, GetDigestInputConfig, GetPkgReleasesConfig, GetReleasesConfig, PostprocessReleaseConfig, PostprocessReleaseResult, RegistryStrategy, RegistryUrlsConfig, Release, ReleaseResult, ReleaseTags, SourceUrlSupport } from "./types.js";
2
2
  import { AsyncResult } from "../../util/result.js";
3
3
  import { isGetPkgReleasesConfig } from "./common.js";
4
4
  //#region lib/modules/datasource/index.d.ts
@@ -11,5 +11,5 @@ export declare function supportsDigests(datasource: string | undefined): boolean
11
11
  export declare function getDigest(config: GetDigestInputConfig, value?: string): Promise<string | null>;
12
12
  export declare function getDefaultConfig(datasource: string): Promise<Record<string, unknown>>;
13
13
  //#endregion
14
- export { DatasourceApi, DigestConfig, GetDigestInputConfig, GetPkgReleasesConfig, GetReleasesConfig, PostprocessReleaseConfig, PostprocessReleaseResult, RegistryStrategy, Release, ReleaseResult, ReleaseTags, SourceUrlSupport, isGetPkgReleasesConfig };
14
+ export { DatasourceApi, DigestConfig, GetDigestInputConfig, GetPkgReleasesConfig, GetReleasesConfig, PostprocessReleaseConfig, PostprocessReleaseResult, RegistryStrategy, RegistryUrlsConfig, Release, ReleaseResult, ReleaseTags, SourceUrlSupport, isGetPkgReleasesConfig };
15
15
  //# sourceMappingURL=index.d.ts.map
@@ -29,6 +29,23 @@ function getDatasources() {
29
29
  function getDatasourceList() {
30
30
  return Array.from(api.keys());
31
31
  }
32
+ /**
33
+ * Projects the registry-level config onto the fields a datasource
34
+ * implementation is allowed to see.
35
+ */
36
+ function toGetReleasesConfig(config, registryUrl = config.registryUrl) {
37
+ const { customDatasources, datasource, packageName, currentValue, constraints, constraintsVersioning, constraintsFiltering } = config;
38
+ return {
39
+ customDatasources,
40
+ datasource,
41
+ packageName,
42
+ registryUrl,
43
+ currentValue,
44
+ constraints,
45
+ constraintsVersioning,
46
+ constraintsFiltering
47
+ };
48
+ }
32
49
  function logError(datasource, packageName, err) {
33
50
  const { statusCode, code: errCode, url } = err;
34
51
  if (statusCode === 404) logger.debug({
@@ -67,10 +84,7 @@ async function getRegistryReleases(datasource, config, registryUrl) {
67
84
  }
68
85
  DatasourceCacheStats.miss(datasource.id, registryUrl, config.packageName);
69
86
  }
70
- const res = await instrument("getReleases", () => datasource.getReleases({
71
- ...config,
72
- registryUrl
73
- }), { attributes: {
87
+ const res = await instrument("getReleases", () => datasource.getReleases(toGetReleasesConfig(config, registryUrl)), { attributes: {
74
88
  [ATTR_CODE_FUNCTION_NAME]: "getReleases",
75
89
  [ATTR_RENOVATE_DATASOURCE]: datasource.id,
76
90
  [ATTR_RENOVATE_REGISTRY_URL]: registryUrl,
@@ -180,7 +194,7 @@ async function mergeRegistries(config, datasource, registryUrls) {
180
194
  function massageRegistryUrls(registryUrls) {
181
195
  return registryUrls.filter(isTruthy).map(trimTrailingSlash);
182
196
  }
183
- function resolveRegistryUrls(datasource, packageName, defaultRegistryUrls, registryUrls, additionalRegistryUrls) {
197
+ function resolveRegistryUrls(datasource, packageName, { defaultRegistryUrls, registryUrls, additionalRegistryUrls }) {
184
198
  const customRegistrySupport = datasource.supportsCustomRegistry(packageName);
185
199
  const datasourceDefaultRegistryUrls = datasource.getDefaultRegistryUrls(packageName);
186
200
  if (!customRegistrySupport) {
@@ -193,16 +207,10 @@ function resolveRegistryUrls(datasource, packageName, defaultRegistryUrls, regis
193
207
  return coerceArray(datasourceDefaultRegistryUrls);
194
208
  }
195
209
  const customUrls = registryUrls?.filter(isTruthy);
196
- let resolvedUrls = [];
197
- if (isNonEmptyArray(customUrls)) resolvedUrls = [...customUrls];
198
- else if (isNonEmptyArray(defaultRegistryUrls)) {
199
- resolvedUrls = [...defaultRegistryUrls];
200
- resolvedUrls = resolvedUrls.concat(coerceArray(additionalRegistryUrls));
201
- } else if (isNonEmptyArray(datasourceDefaultRegistryUrls)) {
202
- resolvedUrls = [...datasourceDefaultRegistryUrls];
203
- resolvedUrls = resolvedUrls.concat(coerceArray(additionalRegistryUrls));
204
- }
205
- return massageRegistryUrls(resolvedUrls);
210
+ if (isNonEmptyArray(customUrls)) return massageRegistryUrls(customUrls);
211
+ const defaultUrls = isNonEmptyArray(defaultRegistryUrls) ? defaultRegistryUrls : datasourceDefaultRegistryUrls;
212
+ if (!isNonEmptyArray(defaultUrls)) return [];
213
+ return massageRegistryUrls([...defaultUrls, ...coerceArray(additionalRegistryUrls)]);
206
214
  }
207
215
  function applyReplacements(config) {
208
216
  if (config.replacementName && config.replacementVersion) return {
@@ -212,7 +220,7 @@ function applyReplacements(config) {
212
220
  }
213
221
  async function fetchReleases(config) {
214
222
  const { datasource: datasourceName } = config;
215
- let { registryUrls } = config;
223
+ let registryUrlsConfig = config;
216
224
  // istanbul ignore if: need test
217
225
  if (!datasourceName || getDatasourceFor(datasourceName) === void 0) {
218
226
  logger.warn({ datasource: datasourceName }, "Unknown datasource");
@@ -221,7 +229,10 @@ async function fetchReleases(config) {
221
229
  if (datasourceName === "npm") {
222
230
  if (isString(config.npmrc)) setNpmrc(config.npmrc);
223
231
  // v8 ignore else -- npm lookups here never arrive with explicit registryUrls
224
- if (!isNonEmptyArray(registryUrls)) registryUrls = [resolveRegistryUrl(config.packageName)];
232
+ if (!isNonEmptyArray(config.registryUrls)) registryUrlsConfig = {
233
+ ...config,
234
+ registryUrls: [resolveRegistryUrl(config.packageName)]
235
+ };
225
236
  }
226
237
  const datasource = getDatasourceFor(datasourceName);
227
238
  // istanbul ignore if: needs test
@@ -229,15 +240,15 @@ async function fetchReleases(config) {
229
240
  logger.warn({ datasource: datasourceName }, "Unknown datasource");
230
241
  return null;
231
242
  }
232
- registryUrls = resolveRegistryUrls(datasource, config.packageName, config.defaultRegistryUrls, registryUrls, config.additionalRegistryUrls);
243
+ const registryUrls = resolveRegistryUrls(datasource, config.packageName, registryUrlsConfig);
233
244
  let dep = null;
234
- const registryStrategy = config.registryStrategy ?? datasource.registryStrategy ?? "hunt";
245
+ const registryStrategy = config.registryStrategy ?? datasource.registryStrategy;
235
246
  try {
236
247
  if (isNonEmptyArray(registryUrls)) {
237
248
  if (registryStrategy === "first") dep = await firstRegistry(config, datasource, registryUrls);
238
249
  else if (registryStrategy === "hunt") dep = await huntRegistries(config, datasource, registryUrls);
239
250
  else dep = await mergeRegistries(config, datasource, registryUrls);
240
- } else dep = await instrument("getReleases", () => datasource.getReleases(config), { attributes: {
251
+ } else dep = await instrument("getReleases", () => datasource.getReleases(toGetReleasesConfig(config)), { attributes: {
241
252
  [ATTR_CODE_FUNCTION_NAME]: "getReleases",
242
253
  [ATTR_RENOVATE_DATASOURCE]: datasource.id,
243
254
  [ATTR_RENOVATE_REGISTRY_URL]: config.registryUrl ?? "",
@@ -312,7 +323,7 @@ function getDigestConfig(datasource, config) {
312
323
  return {
313
324
  lookupName,
314
325
  packageName,
315
- registryUrl: config.registryUrl ?? resolveRegistryUrls(datasource, packageName, config.defaultRegistryUrls, config.registryUrls, config.additionalRegistryUrls)[0],
326
+ registryUrl: config.registryUrl ?? resolveRegistryUrls(datasource, packageName, config)[0],
316
327
  currentValue,
317
328
  currentDigest
318
329
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["datasources","packageCache.get","packageCache.set","versioning.get","memCache.get"],"sources":["../../../lib/modules/datasource/index.ts"],"sourcesContent":["import { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport { isNonEmptyArray, isString, isTruthy } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_BLOCKED, HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport {\n ATTR_RENOVATE_DATASOURCE,\n ATTR_RENOVATE_PACKAGE_NAME,\n ATTR_RENOVATE_REGISTRY_URL,\n} from '../../instrumentation/types.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport * as packageCache from '../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport { clone } from '../../util/clone.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { AsyncResult, Result } from '../../util/result.ts';\nimport { DatasourceCacheStats } from '../../util/stats.ts';\nimport { safeStringify } from '../../util/stringify.ts';\nimport { trimTrailingSlash } from '../../util/url.ts';\nimport * as versioning from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport {\n applyConstraintsFiltering,\n applyExtractVersion,\n applyVersionCompatibility,\n filterValidVersions,\n getDatasourceFor,\n sortAndRemoveDuplicates,\n} from './common.ts';\nimport { addMetaData } from './metadata.ts';\nimport { setNpmrc } from './npm/index.ts';\nimport { resolveRegistryUrl } from './npm/npmrc.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetDigestInputConfig,\n GetPkgReleasesConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport { isGetPkgReleasesConfig } from './common.ts';\nexport * from './types.ts';\n\nexport function getDatasources(): Map<string, DatasourceApi> {\n return datasources;\n}\nexport function getDatasourceList(): string[] {\n return Array.from(datasources.keys());\n}\n\ntype GetReleasesInternalConfig = GetReleasesConfig & GetPkgReleasesConfig;\n\n// TODO: fix error Type\nfunction logError(datasource: string, packageName: string, err: any): void {\n const { statusCode, code: errCode, url } = err;\n if (statusCode === 404) {\n logger.debug({ datasource, packageName, url }, 'Datasource 404');\n } else if (statusCode === 401 || statusCode === 403) {\n logger.debug({ datasource, packageName, url }, 'Datasource unauthorized');\n } else if (errCode) {\n logger.debug(\n { datasource, packageName, url, errCode },\n 'Datasource connection error',\n );\n } else {\n logger.debug({ datasource, packageName, err }, 'Datasource unknown error');\n }\n}\n\nasync function getRegistryReleases(\n datasource: DatasourceApi,\n config: GetReleasesConfig,\n registryUrl: string,\n): Promise<ReleaseResult | null> {\n const cacheNamespace: PackageCacheNamespace = `datasource-releases-${datasource.id}`;\n const cacheKey = `${registryUrl}:${config.packageName}`;\n\n const cacheEnabled = !!datasource.caching; // tells if `isPrivate` flag is supported in datasource result\n const cacheForced = GlobalConfig.get('cachePrivatePackages'); // tells if caching is forced via admin config\n\n if (cacheEnabled || cacheForced) {\n const cachedResult = await packageCache.get<ReleaseResult>(\n cacheNamespace,\n cacheKey,\n );\n\n if (cachedResult) {\n logger.trace({ cacheKey }, 'Returning cached datasource response');\n DatasourceCacheStats.hit(datasource.id, registryUrl, config.packageName);\n return cachedResult;\n }\n\n DatasourceCacheStats.miss(datasource.id, registryUrl, config.packageName);\n }\n\n const res = await instrument(\n 'getReleases',\n () => datasource.getReleases({ ...config, registryUrl }),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: registryUrl,\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n if (res?.releases.length) {\n res.registryUrl ??= registryUrl;\n }\n\n if (!res) {\n return null;\n }\n\n let cache = false;\n if (cacheForced) {\n cache = true;\n } else if (cacheEnabled && !res.isPrivate) {\n cache = true;\n }\n\n if (cache) {\n logger.trace({ cacheKey }, 'Caching datasource response');\n await packageCache.set(cacheNamespace, cacheKey, res, 15);\n DatasourceCacheStats.set(datasource.id, registryUrl, config.packageName);\n } else {\n DatasourceCacheStats.skip(datasource.id, registryUrl, config.packageName);\n }\n\n return res;\n}\n\nfunction firstRegistry(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n if (registryUrls.length > 1) {\n logger.warn(\n {\n datasource: datasource.id,\n packageName: config.packageName,\n registryUrls,\n },\n 'Excess registryUrls found for datasource lookup - using first configured only',\n );\n }\n const registryUrl = registryUrls[0];\n return getRegistryReleases(datasource, config, registryUrl);\n}\n\nasync function huntRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let res: ReleaseResult | null = null;\n let caughtError: Error | undefined;\n for (const registryUrl of registryUrls) {\n try {\n res = await getRegistryReleases(datasource, config, registryUrl);\n if (res) {\n break;\n }\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // We'll always save the last-thrown error\n caughtError = err;\n logger.trace({ err }, 'datasource hunt failure');\n }\n }\n if (res) {\n return res;\n }\n if (caughtError) {\n throw caughtError;\n }\n return null;\n}\n\nasync function mergeRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let combinedRes: ReleaseResult | undefined;\n let lastErr: Error | undefined;\n let externalHostError: ExternalHostError | undefined;\n let singleRegistry = true;\n const releaseVersioning = versioning.get(config.versioning);\n for (const registryUrl of registryUrls) {\n try {\n // Merging must not mutate responses shared by the package cache.\n const res = clone(\n await getRegistryReleases(datasource, config, registryUrl),\n );\n if (!res) {\n continue;\n }\n\n if (!combinedRes) {\n // This is the first registry, so we can just use it and continue\n combinedRes = res;\n continue;\n }\n\n if (singleRegistry) {\n // This is the second registry\n // We need to move the registryUrl from the package level to the release level\n for (const release of coerceArray(combinedRes.releases)) {\n release.registryUrl ??= combinedRes.registryUrl;\n }\n singleRegistry = false;\n }\n\n const releases = coerceArray(res.releases);\n for (const release of releases) {\n // We have more than one registry, so we need to move the registryUrl\n // from the package level to the release level before merging\n release.registryUrl ??= res.registryUrl;\n }\n\n combinedRes.releases.push(...releases);\n\n // Merge the tags from the two results\n let tags = combinedRes.tags;\n if (tags) {\n // v8 ignore else -- needs merged registries where only one carries tags\n if (res.tags) {\n // Both results had tags, so we need to compare them\n for (const tag of ['release', 'latest']) {\n const existingTag = combinedRes?.tags?.[tag];\n const newTag = res.tags?.[tag];\n // v8 ignore else -- needs a merged registry whose tag is not a version\n if (isString(newTag) && releaseVersioning.isVersion(newTag)) {\n if (\n isString(existingTag) &&\n releaseVersioning.isVersion(existingTag)\n ) {\n // We need to compare them\n if (releaseVersioning.isGreaterThan(newTag, existingTag)) {\n // New tag is greater than the existing one\n tags[tag] = newTag;\n }\n } else {\n // Existing tag was not present or not a version\n // so we can just use the new one\n tags[tag] = newTag;\n }\n }\n }\n }\n } else {\n // Existing results had no tags, so we can just use the new ones\n tags = res.tags;\n }\n combinedRes = { ...res, ...combinedRes };\n if (tags) {\n combinedRes.tags = tags;\n }\n // Remove the registryUrl from the package level when more than one registry\n delete combinedRes.registryUrl;\n } catch (err) {\n if (err instanceof ExternalHostError) {\n // Don't abort the merge if another registry already returned releases;\n // a single rate-limited registry shouldn't discard results we have\n externalHostError = err;\n logger.debug(\n { err, registryUrl },\n 'datasource merge: external host error from registry; continuing so releases from other registries are not discarded',\n );\n continue;\n }\n\n lastErr = err;\n logger.trace({ err }, 'datasource merge failure');\n }\n }\n\n if (!combinedRes) {\n if (externalHostError) {\n throw externalHostError;\n }\n\n if (lastErr) {\n throw lastErr;\n }\n\n return null;\n }\n\n const seenVersions = new Set<string>();\n combinedRes.releases = filterMap(combinedRes.releases, (release) => {\n if (seenVersions.has(release.version)) {\n return null;\n }\n seenVersions.add(release.version);\n return release;\n });\n\n return combinedRes;\n}\n\nfunction massageRegistryUrls(registryUrls: string[]): string[] {\n return registryUrls.filter(isTruthy).map(trimTrailingSlash);\n}\n\nfunction resolveRegistryUrls(\n datasource: DatasourceApi,\n packageName: string,\n defaultRegistryUrls: string[] | undefined,\n registryUrls: string[] | undefined | null,\n additionalRegistryUrls: string[] | undefined,\n): string[] {\n const customRegistrySupport = datasource.supportsCustomRegistry(packageName);\n const datasourceDefaultRegistryUrls =\n datasource.getDefaultRegistryUrls(packageName);\n\n if (!customRegistrySupport) {\n if (\n isNonEmptyArray(registryUrls) ||\n isNonEmptyArray(defaultRegistryUrls) ||\n isNonEmptyArray(additionalRegistryUrls)\n ) {\n logger.warn(\n {\n datasource: datasource.id,\n registryUrls,\n defaultRegistryUrls,\n additionalRegistryUrls,\n },\n 'Custom registries are not allowed for this datasource and will be ignored',\n );\n }\n return coerceArray(datasourceDefaultRegistryUrls);\n }\n const customUrls = registryUrls?.filter(isTruthy);\n let resolvedUrls: string[] = [];\n if (isNonEmptyArray(customUrls)) {\n resolvedUrls = [...customUrls];\n } else if (isNonEmptyArray(defaultRegistryUrls)) {\n resolvedUrls = [...defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(coerceArray(additionalRegistryUrls));\n } else if (isNonEmptyArray(datasourceDefaultRegistryUrls)) {\n resolvedUrls = [...datasourceDefaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(coerceArray(additionalRegistryUrls));\n }\n return massageRegistryUrls(resolvedUrls);\n}\n\nfunction applyReplacements(\n config: GetReleasesInternalConfig,\n): Pick<ReleaseResult, 'replacementName' | 'replacementVersion'> | undefined {\n if (config.replacementName && config.replacementVersion) {\n return {\n replacementName: config.replacementName,\n replacementVersion: config.replacementVersion,\n };\n }\n return undefined;\n}\n\nasync function fetchReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let { registryUrls } = config;\n // istanbul ignore if: need test\n if (!datasourceName || getDatasourceFor(datasourceName) === undefined) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n if (datasourceName === 'npm') {\n if (isString(config.npmrc)) {\n setNpmrc(config.npmrc);\n }\n // v8 ignore else -- npm lookups here never arrive with explicit registryUrls\n if (!isNonEmptyArray(registryUrls)) {\n registryUrls = [resolveRegistryUrl(config.packageName)];\n }\n }\n const datasource = getDatasourceFor(datasourceName);\n // istanbul ignore if: needs test\n if (!datasource) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n registryUrls = resolveRegistryUrls(\n datasource,\n config.packageName,\n config.defaultRegistryUrls,\n registryUrls,\n config.additionalRegistryUrls,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy ?? 'hunt';\n try {\n if (isNonEmptyArray(registryUrls)) {\n if (registryStrategy === 'first') {\n dep = await firstRegistry(config, datasource, registryUrls);\n } else if (registryStrategy === 'hunt') {\n dep = await huntRegistries(config, datasource, registryUrls);\n } else {\n // `merge` is the only remaining strategy\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await instrument(\n 'getReleases',\n () => datasource.getReleases(config),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: config.registryUrl ?? '',\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n }\n } catch (err) {\n if (\n [HOST_BLOCKED, HOST_DISABLED].includes(err.message) ||\n [HOST_BLOCKED, HOST_DISABLED].includes(err.err?.message)\n ) {\n return null;\n }\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logError(datasource.id, config.packageName, err);\n }\n if (!dep || dequal(dep, { releases: [] })) {\n return null;\n }\n addMetaData(dep, datasourceName, config.packageName);\n dep = { ...dep, ...applyReplacements(config) };\n return dep;\n}\n\nfunction fetchCachedReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource, packageName, registryUrls } = config;\n const cacheKey = `datasource-mem:releases:${datasource}:${packageName}:${config.registryStrategy}:${safeStringify(\n [registryUrls, config.defaultRegistryUrls, config.additionalRegistryUrls],\n )}`;\n // By returning a Promise and reusing it, we should only fetch each package at most once\n const cachedResult = memCache.get<Promise<ReleaseResult | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = fetchReleases(config);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function getRawPkgReleases(\n config: GetPkgReleasesConfig,\n): AsyncResult<\n ReleaseResult,\n Error | 'no-datasource' | 'no-package-name' | 'no-result'\n> {\n if (!config.datasource) {\n logger.warn('No datasource found');\n return AsyncResult.err('no-datasource');\n }\n\n const packageName = config.packageName;\n if (!packageName) {\n logger.error({ config }, 'Datasource getReleases without packageName');\n return AsyncResult.err('no-package-name');\n }\n\n return Result.wrapNullable(fetchCachedReleases(config), 'no-result' as const)\n .catch((e) => {\n if (e instanceof ExternalHostError) {\n e.hostType = config.datasource;\n e.packageName = packageName;\n }\n return Result.err(e);\n })\n .transform(clone);\n}\n\nexport function applyDatasourceFilters(\n releaseResult: ReleaseResult,\n config: GetPkgReleasesConfig,\n): ReleaseResult {\n let res = releaseResult;\n res = applyExtractVersion(res, config.extractVersion);\n res = applyVersionCompatibility(\n res,\n config.versionCompatibility,\n config.currentCompatibility,\n );\n res = filterValidVersions(res, config);\n res = sortAndRemoveDuplicates(res, config);\n res = applyConstraintsFiltering(res, config);\n return res;\n}\n\nexport async function getPkgReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { val = null, err } = await getRawPkgReleases(config)\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (err instanceof Error) {\n throw err;\n }\n\n return val;\n}\n\nexport function supportsDigests(datasource: string | undefined): boolean {\n const ds = !!datasource && getDatasourceFor(datasource);\n return !!ds && 'getDigest' in ds;\n}\n\nfunction getDigestConfig(\n datasource: DatasourceApi,\n config: GetDigestInputConfig,\n): DigestConfig {\n const { lookupName, currentValue, currentDigest } = config;\n const packageName = config.replacementName ?? config.packageName;\n // Prefer registryUrl from getReleases() lookup if it has been passed\n const registryUrl =\n config.registryUrl ??\n resolveRegistryUrls(\n datasource,\n packageName,\n config.defaultRegistryUrls,\n config.registryUrls,\n config.additionalRegistryUrls,\n )[0];\n return { lookupName, packageName, registryUrl, currentValue, currentDigest };\n}\n\nexport function getDigest(\n config: GetDigestInputConfig,\n value?: string,\n): Promise<string | null> {\n const datasource = getDatasourceFor(config.datasource);\n // istanbul ignore if: need test\n if (!datasource || !('getDigest' in datasource)) {\n return Promise.resolve(null);\n }\n const digestConfig = getDigestConfig(datasource, config);\n return datasource.getDigest!(digestConfig, value);\n}\n\nexport function getDefaultConfig(\n datasource: string,\n): Promise<Record<string, unknown>> {\n const loadedDatasource = getDatasourceFor(datasource);\n return Promise.resolve<Record<string, unknown>>(\n loadedDatasource?.defaultConfig ?? Object.create({}),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["datasources","packageCache.get","packageCache.set","versioning.get","memCache.get"],"sources":["../../../lib/modules/datasource/index.ts"],"sourcesContent":["import { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport { isNonEmptyArray, isString, isTruthy } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_BLOCKED, HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport {\n ATTR_RENOVATE_DATASOURCE,\n ATTR_RENOVATE_PACKAGE_NAME,\n ATTR_RENOVATE_REGISTRY_URL,\n} from '../../instrumentation/types.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport * as packageCache from '../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport { clone } from '../../util/clone.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { AsyncResult, Result } from '../../util/result.ts';\nimport { DatasourceCacheStats } from '../../util/stats.ts';\nimport { safeStringify } from '../../util/stringify.ts';\nimport { trimTrailingSlash } from '../../util/url.ts';\nimport * as versioning from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport {\n applyConstraintsFiltering,\n applyExtractVersion,\n applyVersionCompatibility,\n filterValidVersions,\n getDatasourceFor,\n sortAndRemoveDuplicates,\n} from './common.ts';\nimport { addMetaData } from './metadata.ts';\nimport { setNpmrc } from './npm/index.ts';\nimport { resolveRegistryUrl } from './npm/npmrc.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetDigestInputConfig,\n GetPkgReleasesConfig,\n GetReleasesConfig,\n RegistryUrlsConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport { isGetPkgReleasesConfig } from './common.ts';\nexport * from './types.ts';\n\nexport function getDatasources(): Map<string, DatasourceApi> {\n return datasources;\n}\nexport function getDatasourceList(): string[] {\n return Array.from(datasources.keys());\n}\n\n/**\n * Projects the registry-level config onto the fields a datasource\n * implementation is allowed to see.\n */\nfunction toGetReleasesConfig(\n config: GetPkgReleasesConfig,\n registryUrl = config.registryUrl,\n): GetReleasesConfig {\n const {\n customDatasources,\n datasource,\n packageName,\n currentValue,\n constraints,\n constraintsVersioning,\n constraintsFiltering,\n } = config;\n return {\n customDatasources,\n datasource,\n packageName,\n registryUrl,\n currentValue,\n constraints,\n constraintsVersioning,\n constraintsFiltering,\n };\n}\n\n// TODO: fix error Type\nfunction logError(datasource: string, packageName: string, err: any): void {\n const { statusCode, code: errCode, url } = err;\n if (statusCode === 404) {\n logger.debug({ datasource, packageName, url }, 'Datasource 404');\n } else if (statusCode === 401 || statusCode === 403) {\n logger.debug({ datasource, packageName, url }, 'Datasource unauthorized');\n } else if (errCode) {\n logger.debug(\n { datasource, packageName, url, errCode },\n 'Datasource connection error',\n );\n } else {\n logger.debug({ datasource, packageName, err }, 'Datasource unknown error');\n }\n}\n\nasync function getRegistryReleases(\n datasource: DatasourceApi,\n config: GetPkgReleasesConfig,\n registryUrl: string,\n): Promise<ReleaseResult | null> {\n const cacheNamespace: PackageCacheNamespace = `datasource-releases-${datasource.id}`;\n const cacheKey = `${registryUrl}:${config.packageName}`;\n\n const cacheEnabled = !!datasource.caching; // tells if `isPrivate` flag is supported in datasource result\n const cacheForced = GlobalConfig.get('cachePrivatePackages'); // tells if caching is forced via admin config\n\n if (cacheEnabled || cacheForced) {\n const cachedResult = await packageCache.get<ReleaseResult>(\n cacheNamespace,\n cacheKey,\n );\n\n if (cachedResult) {\n logger.trace({ cacheKey }, 'Returning cached datasource response');\n DatasourceCacheStats.hit(datasource.id, registryUrl, config.packageName);\n return cachedResult;\n }\n\n DatasourceCacheStats.miss(datasource.id, registryUrl, config.packageName);\n }\n\n const res = await instrument(\n 'getReleases',\n () => datasource.getReleases(toGetReleasesConfig(config, registryUrl)),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: registryUrl,\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n if (res?.releases.length) {\n res.registryUrl ??= registryUrl;\n }\n\n if (!res) {\n return null;\n }\n\n let cache = false;\n if (cacheForced) {\n cache = true;\n } else if (cacheEnabled && !res.isPrivate) {\n cache = true;\n }\n\n if (cache) {\n logger.trace({ cacheKey }, 'Caching datasource response');\n await packageCache.set(cacheNamespace, cacheKey, res, 15);\n DatasourceCacheStats.set(datasource.id, registryUrl, config.packageName);\n } else {\n DatasourceCacheStats.skip(datasource.id, registryUrl, config.packageName);\n }\n\n return res;\n}\n\nfunction firstRegistry(\n config: GetPkgReleasesConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n if (registryUrls.length > 1) {\n logger.warn(\n {\n datasource: datasource.id,\n packageName: config.packageName,\n registryUrls,\n },\n 'Excess registryUrls found for datasource lookup - using first configured only',\n );\n }\n const registryUrl = registryUrls[0];\n return getRegistryReleases(datasource, config, registryUrl);\n}\n\nasync function huntRegistries(\n config: GetPkgReleasesConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let res: ReleaseResult | null = null;\n let caughtError: Error | undefined;\n for (const registryUrl of registryUrls) {\n try {\n res = await getRegistryReleases(datasource, config, registryUrl);\n if (res) {\n break;\n }\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // We'll always save the last-thrown error\n caughtError = err;\n logger.trace({ err }, 'datasource hunt failure');\n }\n }\n if (res) {\n return res;\n }\n if (caughtError) {\n throw caughtError;\n }\n return null;\n}\n\nasync function mergeRegistries(\n config: GetPkgReleasesConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let combinedRes: ReleaseResult | undefined;\n let lastErr: Error | undefined;\n let externalHostError: ExternalHostError | undefined;\n let singleRegistry = true;\n const releaseVersioning = versioning.get(config.versioning);\n for (const registryUrl of registryUrls) {\n try {\n // Merging must not mutate responses shared by the package cache.\n const res = clone(\n await getRegistryReleases(datasource, config, registryUrl),\n );\n if (!res) {\n continue;\n }\n\n if (!combinedRes) {\n // This is the first registry, so we can just use it and continue\n combinedRes = res;\n continue;\n }\n\n if (singleRegistry) {\n // This is the second registry\n // We need to move the registryUrl from the package level to the release level\n for (const release of coerceArray(combinedRes.releases)) {\n release.registryUrl ??= combinedRes.registryUrl;\n }\n singleRegistry = false;\n }\n\n const releases = coerceArray(res.releases);\n for (const release of releases) {\n // We have more than one registry, so we need to move the registryUrl\n // from the package level to the release level before merging\n release.registryUrl ??= res.registryUrl;\n }\n\n combinedRes.releases.push(...releases);\n\n // Merge the tags from the two results\n let tags = combinedRes.tags;\n if (tags) {\n // v8 ignore else -- needs merged registries where only one carries tags\n if (res.tags) {\n // Both results had tags, so we need to compare them\n for (const tag of ['release', 'latest']) {\n const existingTag = combinedRes?.tags?.[tag];\n const newTag = res.tags?.[tag];\n // v8 ignore else -- needs a merged registry whose tag is not a version\n if (isString(newTag) && releaseVersioning.isVersion(newTag)) {\n if (\n isString(existingTag) &&\n releaseVersioning.isVersion(existingTag)\n ) {\n // We need to compare them\n if (releaseVersioning.isGreaterThan(newTag, existingTag)) {\n // New tag is greater than the existing one\n tags[tag] = newTag;\n }\n } else {\n // Existing tag was not present or not a version\n // so we can just use the new one\n tags[tag] = newTag;\n }\n }\n }\n }\n } else {\n // Existing results had no tags, so we can just use the new ones\n tags = res.tags;\n }\n combinedRes = { ...res, ...combinedRes };\n if (tags) {\n combinedRes.tags = tags;\n }\n // Remove the registryUrl from the package level when more than one registry\n delete combinedRes.registryUrl;\n } catch (err) {\n if (err instanceof ExternalHostError) {\n // Don't abort the merge if another registry already returned releases;\n // a single rate-limited registry shouldn't discard results we have\n externalHostError = err;\n logger.debug(\n { err, registryUrl },\n 'datasource merge: external host error from registry; continuing so releases from other registries are not discarded',\n );\n continue;\n }\n\n lastErr = err;\n logger.trace({ err }, 'datasource merge failure');\n }\n }\n\n if (!combinedRes) {\n if (externalHostError) {\n throw externalHostError;\n }\n\n if (lastErr) {\n throw lastErr;\n }\n\n return null;\n }\n\n const seenVersions = new Set<string>();\n combinedRes.releases = filterMap(combinedRes.releases, (release) => {\n if (seenVersions.has(release.version)) {\n return null;\n }\n seenVersions.add(release.version);\n return release;\n });\n\n return combinedRes;\n}\n\nfunction massageRegistryUrls(registryUrls: string[]): string[] {\n return registryUrls.filter(isTruthy).map(trimTrailingSlash);\n}\n\nfunction resolveRegistryUrls(\n datasource: DatasourceApi,\n packageName: string,\n {\n defaultRegistryUrls,\n registryUrls,\n additionalRegistryUrls,\n }: RegistryUrlsConfig,\n): string[] {\n const customRegistrySupport = datasource.supportsCustomRegistry(packageName);\n const datasourceDefaultRegistryUrls =\n datasource.getDefaultRegistryUrls(packageName);\n\n if (!customRegistrySupport) {\n if (\n isNonEmptyArray(registryUrls) ||\n isNonEmptyArray(defaultRegistryUrls) ||\n isNonEmptyArray(additionalRegistryUrls)\n ) {\n logger.warn(\n {\n datasource: datasource.id,\n registryUrls,\n defaultRegistryUrls,\n additionalRegistryUrls,\n },\n 'Custom registries are not allowed for this datasource and will be ignored',\n );\n }\n return coerceArray(datasourceDefaultRegistryUrls);\n }\n const customUrls = registryUrls?.filter(isTruthy);\n if (isNonEmptyArray(customUrls)) {\n return massageRegistryUrls(customUrls);\n }\n const defaultUrls = isNonEmptyArray(defaultRegistryUrls)\n ? defaultRegistryUrls\n : datasourceDefaultRegistryUrls;\n if (!isNonEmptyArray(defaultUrls)) {\n return [];\n }\n return massageRegistryUrls([\n ...defaultUrls,\n ...coerceArray(additionalRegistryUrls),\n ]);\n}\n\nfunction applyReplacements(\n config: GetPkgReleasesConfig,\n): Pick<ReleaseResult, 'replacementName' | 'replacementVersion'> | undefined {\n if (config.replacementName && config.replacementVersion) {\n return {\n replacementName: config.replacementName,\n replacementVersion: config.replacementVersion,\n };\n }\n return undefined;\n}\n\nasync function fetchReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let registryUrlsConfig: RegistryUrlsConfig = config;\n // istanbul ignore if: need test\n if (!datasourceName || getDatasourceFor(datasourceName) === undefined) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n if (datasourceName === 'npm') {\n if (isString(config.npmrc)) {\n setNpmrc(config.npmrc);\n }\n // v8 ignore else -- npm lookups here never arrive with explicit registryUrls\n if (!isNonEmptyArray(config.registryUrls)) {\n registryUrlsConfig = {\n ...config,\n registryUrls: [resolveRegistryUrl(config.packageName)],\n };\n }\n }\n const datasource = getDatasourceFor(datasourceName);\n // istanbul ignore if: needs test\n if (!datasource) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n const registryUrls = resolveRegistryUrls(\n datasource,\n config.packageName,\n registryUrlsConfig,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy;\n try {\n if (isNonEmptyArray(registryUrls)) {\n if (registryStrategy === 'first') {\n dep = await firstRegistry(config, datasource, registryUrls);\n } else if (registryStrategy === 'hunt') {\n dep = await huntRegistries(config, datasource, registryUrls);\n } else {\n // `merge` is the only remaining strategy\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await instrument(\n 'getReleases',\n () => datasource.getReleases(toGetReleasesConfig(config)),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: config.registryUrl ?? '',\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n }\n } catch (err) {\n if (\n [HOST_BLOCKED, HOST_DISABLED].includes(err.message) ||\n [HOST_BLOCKED, HOST_DISABLED].includes(err.err?.message)\n ) {\n return null;\n }\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logError(datasource.id, config.packageName, err);\n }\n if (!dep || dequal(dep, { releases: [] })) {\n return null;\n }\n addMetaData(dep, datasourceName, config.packageName);\n dep = { ...dep, ...applyReplacements(config) };\n return dep;\n}\n\nfunction fetchCachedReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { datasource, packageName, registryUrls } = config;\n const cacheKey = `datasource-mem:releases:${datasource}:${packageName}:${config.registryStrategy}:${safeStringify(\n [registryUrls, config.defaultRegistryUrls, config.additionalRegistryUrls],\n )}`;\n // By returning a Promise and reusing it, we should only fetch each package at most once\n const cachedResult = memCache.get<Promise<ReleaseResult | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = fetchReleases(config);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function getRawPkgReleases(\n config: GetPkgReleasesConfig,\n): AsyncResult<\n ReleaseResult,\n Error | 'no-datasource' | 'no-package-name' | 'no-result'\n> {\n if (!config.datasource) {\n logger.warn('No datasource found');\n return AsyncResult.err('no-datasource');\n }\n\n const packageName = config.packageName;\n if (!packageName) {\n logger.error({ config }, 'Datasource getReleases without packageName');\n return AsyncResult.err('no-package-name');\n }\n\n return Result.wrapNullable(fetchCachedReleases(config), 'no-result' as const)\n .catch((e) => {\n if (e instanceof ExternalHostError) {\n e.hostType = config.datasource;\n e.packageName = packageName;\n }\n return Result.err(e);\n })\n .transform(clone);\n}\n\nexport function applyDatasourceFilters(\n releaseResult: ReleaseResult,\n config: GetPkgReleasesConfig,\n): ReleaseResult {\n let res = releaseResult;\n res = applyExtractVersion(res, config.extractVersion);\n res = applyVersionCompatibility(\n res,\n config.versionCompatibility,\n config.currentCompatibility,\n );\n res = filterValidVersions(res, config);\n res = sortAndRemoveDuplicates(res, config);\n res = applyConstraintsFiltering(res, config);\n return res;\n}\n\nexport async function getPkgReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { val = null, err } = await getRawPkgReleases(config)\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (err instanceof Error) {\n throw err;\n }\n\n return val;\n}\n\nexport function supportsDigests(datasource: string | undefined): boolean {\n const ds = !!datasource && getDatasourceFor(datasource);\n return !!ds && 'getDigest' in ds;\n}\n\nfunction getDigestConfig(\n datasource: DatasourceApi,\n config: GetDigestInputConfig,\n): DigestConfig {\n const { lookupName, currentValue, currentDigest } = config;\n const packageName = config.replacementName ?? config.packageName;\n // Prefer registryUrl from getReleases() lookup if it has been passed\n const registryUrl =\n config.registryUrl ??\n resolveRegistryUrls(datasource, packageName, config)[0];\n return { lookupName, packageName, registryUrl, currentValue, currentDigest };\n}\n\nexport function getDigest(\n config: GetDigestInputConfig,\n value?: string,\n): Promise<string | null> {\n const datasource = getDatasourceFor(config.datasource);\n // istanbul ignore if: need test\n if (!datasource || !('getDigest' in datasource)) {\n return Promise.resolve(null);\n }\n const digestConfig = getDigestConfig(datasource, config);\n return datasource.getDigest!(digestConfig, value);\n}\n\nexport function getDefaultConfig(\n datasource: string,\n): Promise<Record<string, unknown>> {\n const loadedDatasource = getDatasourceFor(datasource);\n return Promise.resolve<Record<string, unknown>>(\n loadedDatasource?.defaultConfig ?? Object.create({}),\n );\n}\n"],"mappings":"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"}
@@ -13,7 +13,6 @@ var JsrDatasource = class JsrDatasource extends Datasource {
13
13
  supportsCustomRegistry(_packageName) {
14
14
  return false;
15
15
  }
16
- registryStrategy = "first";
17
16
  defaultVersioning = id;
18
17
  getDefaultRegistryUrls(_packageName) {
19
18
  return defaultRegistryUrls;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["semverId"],"sources":["../../../../lib/modules/datasource/jsr/index.ts"],"sourcesContent":["import { isNull } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as semverId } from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrls } from './common.ts';\nimport { JsrPackageMetadata } from './schema.ts';\nimport { extractJsrPackageName } from './util.ts';\n\nexport class JsrDatasource extends Datasource {\n static readonly id = 'jsr';\n\n // custom registry support is not yet supported\n // https://github.com/jsr-io/jsr/issues/203\n override supportsCustomRegistry(_packageName: string): boolean {\n return false;\n }\n\n override readonly registryStrategy = 'first';\n // https://jsr.io/docs/using-packages#semver-resolution\n override readonly defaultVersioning = semverId;\n\n // use npm compatible registry api url due to returns\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return defaultRegistryUrls;\n }\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `createdAt` field in the results. For packages without explicit timestamps, defaults to 2025-09-18.';\n\n constructor() {\n super(JsrDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const validJsrPackageName = extractJsrPackageName(packageName);\n if (isNull(validJsrPackageName)) {\n logger.debug(`Could not extract packageName: \"${packageName}\"`);\n return null;\n }\n // construct a package metadata url\n // https://jsr.io/docs/api#package-metadata\n const packageInfoUrl = joinUrlParts(registryUrl, packageName, 'meta.json');\n\n const result: ReleaseResult = {\n homepage: joinUrlParts(registryUrl, packageName),\n registryUrl,\n releases: [],\n };\n\n try {\n const { body } = await this.http.getJson(\n packageInfoUrl,\n JsrPackageMetadata,\n );\n result.releases.push(...body);\n } catch (err) {\n logger.warn({ err }, 'JSR: failed to get package details');\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${JsrDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAIrB,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,mBAAqC;CAErC,oBAAsCA;CAGtC,uBAAgC,cAAgC;EAC9D,OAAO;CACT;CAEA,0BAA4C;CAC5C,uBACE;CAEF,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,sBAAsB,sBAAsB,WAAW;EAC7D,IAAI,OAAO,mBAAmB,GAAG;GAC/B,OAAO,MAAM,mCAAmC,YAAY,EAAE;GAC9D,OAAO;EACT;EAGA,MAAM,iBAAiB,aAAa,aAAa,aAAa,WAAW;EAEzE,MAAM,SAAwB;GAC5B,UAAU,aAAa,aAAa,WAAW;GAC/C;GACA,UAAU,CAAC;EACb;EAEA,IAAI;GACF,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAC/B,gBACA,kBACF;GACA,OAAO,SAAS,KAAK,GAAG,IAAI;EAC9B,SAAS,KAAK;GACZ,OAAO,KAAK,EAAE,IAAI,GAAG,oCAAoC;GACzD,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GAEvC,KAAK,eAAe,OAAO,YAAY,GAAG,OAAO;GACjD,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["semverId"],"sources":["../../../../lib/modules/datasource/jsr/index.ts"],"sourcesContent":["import { isNull } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as semverId } from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrls } from './common.ts';\nimport { JsrPackageMetadata } from './schema.ts';\nimport { extractJsrPackageName } from './util.ts';\n\nexport class JsrDatasource extends Datasource {\n static readonly id = 'jsr';\n\n // custom registry support is not yet supported\n // https://github.com/jsr-io/jsr/issues/203\n override supportsCustomRegistry(_packageName: string): boolean {\n return false;\n }\n\n // https://jsr.io/docs/using-packages#semver-resolution\n override readonly defaultVersioning = semverId;\n\n // use npm compatible registry api url due to returns\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return defaultRegistryUrls;\n }\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `createdAt` field in the results. For packages without explicit timestamps, defaults to 2025-09-18.';\n\n constructor() {\n super(JsrDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const validJsrPackageName = extractJsrPackageName(packageName);\n if (isNull(validJsrPackageName)) {\n logger.debug(`Could not extract packageName: \"${packageName}\"`);\n return null;\n }\n // construct a package metadata url\n // https://jsr.io/docs/api#package-metadata\n const packageInfoUrl = joinUrlParts(registryUrl, packageName, 'meta.json');\n\n const result: ReleaseResult = {\n homepage: joinUrlParts(registryUrl, packageName),\n registryUrl,\n releases: [],\n };\n\n try {\n const { body } = await this.http.getJson(\n packageInfoUrl,\n JsrPackageMetadata,\n );\n result.releases.push(...body);\n } catch (err) {\n logger.warn({ err }, 'JSR: failed to get package details');\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${JsrDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAIrB,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAGA,oBAAsCA;CAGtC,uBAAgC,cAAgC;EAC9D,OAAO;CACT;CAEA,0BAA4C;CAC5C,uBACE;CAEF,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,sBAAsB,sBAAsB,WAAW;EAC7D,IAAI,OAAO,mBAAmB,GAAG;GAC/B,OAAO,MAAM,mCAAmC,YAAY,EAAE;GAC9D,OAAO;EACT;EAGA,MAAM,iBAAiB,aAAa,aAAa,aAAa,WAAW;EAEzE,MAAM,SAAwB;GAC5B,UAAU,aAAa,aAAa,WAAW;GAC/C;GACA,UAAU,CAAC;EACb;EAEA,IAAI;GACF,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAC/B,gBACA,kBACF;GACA,OAAO,SAAS,KAAK,GAAG,IAAI;EAC9B,SAAS,KAAK;GACZ,OAAO,KAAK,EAAE,IAAI,GAAG,oCAAoC;GACzD,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GAEvC,KAAK,eAAe,OAAO,YAAY,GAAG,OAAO;GACjD,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
@@ -9,7 +9,6 @@ var NpmDatasource = class NpmDatasource extends Datasource {
9
9
  supportsCustomRegistry(_packageName) {
10
10
  return true;
11
11
  }
12
- registryStrategy = "first";
13
12
  defaultVersioning = "npm";
14
13
  getDefaultRegistryUrls(_packageName) {
15
14
  return [defaultRegistryUrl];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/npm/index.ts"],"sourcesContent":["import * as npmVersioning from '../../versioning/npm/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrl } from './common.ts';\nimport { getDependency } from './get.ts';\n\nexport { setNpmrc } from './npmrc.ts';\n\nexport class NpmDatasource extends Datasource {\n static readonly id = 'npm';\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = npmVersioning.id;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [defaultRegistryUrl];\n }\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `time` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(NpmDatasource.id);\n }\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const res = await getDependency(this.http, registryUrl, packageName);\n return res;\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAErB,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,mBAAqC;CAErC,oBAAsC;CAEtC,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,kBAAkB;CAC5B;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;CAEA,MAAM,YAAY,EAChB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAIT,OAAO,MADW,cAAc,KAAK,MAAM,aAAa,WAAW;CAErE;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/npm/index.ts"],"sourcesContent":["import * as npmVersioning from '../../versioning/npm/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrl } from './common.ts';\nimport { getDependency } from './get.ts';\n\nexport { setNpmrc } from './npmrc.ts';\n\nexport class NpmDatasource extends Datasource {\n static readonly id = 'npm';\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override readonly defaultVersioning = npmVersioning.id;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [defaultRegistryUrl];\n }\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `time` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(NpmDatasource.id);\n }\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const res = await getDependency(this.http, registryUrl, packageName);\n return res;\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAErB,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,oBAAsC;CAEtC,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,kBAAkB;CAC5B;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;CAEA,MAAM,YAAY,EAChB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAIT,OAAO,MADW,cAAc,KAAK,MAAM,aAAa,WAAW;CAErE;AACF"}
@@ -1,5 +1,4 @@
1
1
  import { logger } from "../../logger/index.js";
2
- import { Datasource } from "./datasource.js";
3
2
  import { getDatasourceFor } from "./common.js";
4
3
  //#region lib/modules/datasource/postprocess-release.ts
5
4
  async function postprocessRelease(config, release) {
@@ -9,7 +8,7 @@ async function postprocessRelease(config, release) {
9
8
  logger.once.warn({ datasource }, "Failed to resolve datasource during release postprocessing");
10
9
  return release;
11
10
  }
12
- if (ds.constructor.prototype.postprocessRelease === Datasource.prototype.postprocessRelease) return release;
11
+ if (!ds.postprocessRelease) return release;
13
12
  const { packageName } = config;
14
13
  if (!packageName) {
15
14
  logger.once.warn({ datasource }, "Release postprocessing is not supported for empty `packageName` field");
@@ -1 +1 @@
1
- {"version":3,"file":"postprocess-release.js","names":[],"sources":["../../../lib/modules/datasource/postprocess-release.ts"],"sourcesContent":["import { logger } from '../../logger/index.ts';\nimport type {\n LookupUpdateConfig,\n UpdateResult,\n} from '../../workers/repository/process/lookup/types.ts';\nimport { getDatasourceFor } from './common.ts';\nimport { Datasource } from './datasource.ts';\nimport type { Release } from './types.ts';\n\ntype Config = Partial<LookupUpdateConfig & UpdateResult>;\n\nexport async function postprocessRelease(\n config: Config,\n release: Release,\n): Promise<Release | null> {\n const { datasource } = config;\n\n const ds = datasource && getDatasourceFor(datasource);\n if (!ds) {\n logger.once.warn(\n { datasource },\n 'Failed to resolve datasource during release postprocessing',\n );\n return release;\n }\n\n if (\n ds.constructor.prototype.postprocessRelease ===\n Datasource.prototype.postprocessRelease\n ) {\n return release;\n }\n\n const { packageName } = config;\n if (!packageName) {\n logger.once.warn(\n { datasource },\n 'Release postprocessing is not supported for empty `packageName` field',\n );\n return release;\n }\n\n // Prefer the registry that actually reported this release (set by `mergeRegistries`\n // for the `merge` registryStrategy) over the configured/default registry, otherwise\n // we may probe a registry that never had this artifact and wrongly reject it.\n const registryUrl =\n release.registryUrl ??\n config.registryUrl ??\n config.registryUrls?.at(0) ??\n null;\n\n try {\n const result = await ds.postprocessRelease(\n { packageName, registryUrl },\n release,\n );\n\n if (result === 'reject') {\n logger.debug(\n {\n datasource,\n packageName,\n registryUrl,\n version: release.version,\n versionOrig: release.versionOrig,\n },\n 'Rejected release',\n );\n return null;\n }\n\n return result;\n } catch (err) {\n logger.once.warn({ err, datasource }, 'Release interceptor failed');\n return release;\n }\n}\n"],"mappings":";;;;AAWA,eAAsB,mBACpB,QACA,SACyB;CACzB,MAAM,EAAE,eAAe;CAEvB,MAAM,KAAK,cAAc,iBAAiB,UAAU;CACpD,IAAI,CAAC,IAAI;EACP,OAAO,KAAK,KACV,EAAE,WAAW,GACb,4DACF;EACA,OAAO;CACT;CAEA,IACE,GAAG,YAAY,UAAU,uBACzB,WAAW,UAAU,oBAErB,OAAO;CAGT,MAAM,EAAE,gBAAgB;CACxB,IAAI,CAAC,aAAa;EAChB,OAAO,KAAK,KACV,EAAE,WAAW,GACb,uEACF;EACA,OAAO;CACT;CAKA,MAAM,cACJ,QAAQ,eACR,OAAO,eACP,OAAO,cAAc,GAAG,CAAC,KACzB;CAEF,IAAI;EACF,MAAM,SAAS,MAAM,GAAG,mBACtB;GAAE;GAAa;EAAY,GAC3B,OACF;EAEA,IAAI,WAAW,UAAU;GACvB,OAAO,MACL;IACE;IACA;IACA;IACA,SAAS,QAAQ;IACjB,aAAa,QAAQ;GACvB,GACA,kBACF;GACA,OAAO;EACT;EAEA,OAAO;CACT,SAAS,KAAK;EACZ,OAAO,KAAK,KAAK;GAAE;GAAK;EAAW,GAAG,4BAA4B;EAClE,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"postprocess-release.js","names":[],"sources":["../../../lib/modules/datasource/postprocess-release.ts"],"sourcesContent":["import { logger } from '../../logger/index.ts';\nimport type {\n LookupUpdateConfig,\n UpdateResult,\n} from '../../workers/repository/process/lookup/types.ts';\nimport { getDatasourceFor } from './common.ts';\nimport type { Release } from './types.ts';\n\ntype Config = Partial<LookupUpdateConfig & UpdateResult>;\n\nexport async function postprocessRelease(\n config: Config,\n release: Release,\n): Promise<Release | null> {\n const { datasource } = config;\n\n const ds = datasource && getDatasourceFor(datasource);\n if (!ds) {\n logger.once.warn(\n { datasource },\n 'Failed to resolve datasource during release postprocessing',\n );\n return release;\n }\n\n if (!ds.postprocessRelease) {\n return release;\n }\n\n const { packageName } = config;\n if (!packageName) {\n logger.once.warn(\n { datasource },\n 'Release postprocessing is not supported for empty `packageName` field',\n );\n return release;\n }\n\n // Prefer the registry that actually reported this release (set by `mergeRegistries`\n // for the `merge` registryStrategy) over the configured/default registry, otherwise\n // we may probe a registry that never had this artifact and wrongly reject it.\n const registryUrl =\n release.registryUrl ??\n config.registryUrl ??\n config.registryUrls?.at(0) ??\n null;\n\n try {\n const result = await ds.postprocessRelease(\n { packageName, registryUrl },\n release,\n );\n\n if (result === 'reject') {\n logger.debug(\n {\n datasource,\n packageName,\n registryUrl,\n version: release.version,\n versionOrig: release.versionOrig,\n },\n 'Rejected release',\n );\n return null;\n }\n\n return result;\n } catch (err) {\n logger.once.warn({ err, datasource }, 'Release interceptor failed');\n return release;\n }\n}\n"],"mappings":";;;AAUA,eAAsB,mBACpB,QACA,SACyB;CACzB,MAAM,EAAE,eAAe;CAEvB,MAAM,KAAK,cAAc,iBAAiB,UAAU;CACpD,IAAI,CAAC,IAAI;EACP,OAAO,KAAK,KACV,EAAE,WAAW,GACb,4DACF;EACA,OAAO;CACT;CAEA,IAAI,CAAC,GAAG,oBACN,OAAO;CAGT,MAAM,EAAE,gBAAgB;CACxB,IAAI,CAAC,aAAa;EAChB,OAAO,KAAK,KACV,EAAE,WAAW,GACb,uEACF;EACA,OAAO;CACT;CAKA,MAAM,cACJ,QAAQ,eACR,OAAO,eACP,OAAO,cAAc,GAAG,CAAC,KACzB;CAEF,IAAI;EACF,MAAM,SAAS,MAAM,GAAG,mBACtB;GAAE;GAAa;EAAY,GAC3B,OACF;EAEA,IAAI,WAAW,UAAU;GACvB,OAAO,MACL;IACE;IACA;IACA;IACA,SAAS,QAAQ;IACjB,aAAa,QAAQ;GACvB,GACA,kBACF;GACA,OAAO;EACT;EAEA,OAAO;CACT,SAAS,KAAK;EACZ,OAAO,KAAK,KAAK;GAAE;GAAK;EAAW,GAAG,4BAA4B;EAClE,OAAO;CACT;AACF"}
@@ -4,18 +4,19 @@ import { ModuleApi } from "../../types/base.js";
4
4
  import "../../types/index.js";
5
5
  import { ConstraintsFilter, CustomDatasourceConfig } from "../../config/types.js";
6
6
  //#region lib/modules/datasource/types.d.ts
7
- export interface GetDigestInputConfig {
8
- datasource: string;
9
- packageName: string;
7
+ /**
8
+ * The inputs of registry URL resolution, see `resolveRegistryUrls()` in the
9
+ * datasource index.
10
+ */
11
+ export interface RegistryUrlsConfig {
10
12
  defaultRegistryUrls?: string[];
11
13
  registryUrls?: string[] | null;
12
- registryUrl?: string;
13
- lookupName?: string;
14
14
  additionalRegistryUrls?: string[];
15
- currentValue?: string;
16
- currentDigest?: string;
17
- replacementName?: string;
18
15
  }
16
+ /**
17
+ * What a datasource's `getDigest()` receives: a single, already resolved
18
+ * registry.
19
+ */
19
20
  export interface DigestConfig {
20
21
  packageName: string;
21
22
  lookupName?: string;
@@ -23,6 +24,17 @@ export interface DigestConfig {
23
24
  currentValue?: string;
24
25
  currentDigest?: string;
25
26
  }
27
+ /**
28
+ * What the datasource index's `getDigest()` receives from the lookup worker.
29
+ */
30
+ export interface GetDigestInputConfig extends DigestConfig, RegistryUrlsConfig {
31
+ datasource: string;
32
+ replacementName?: string;
33
+ }
34
+ /**
35
+ * What a datasource's `getReleases()` receives: a single, already resolved
36
+ * registry.
37
+ */
26
38
  export interface GetReleasesConfig {
27
39
  customDatasources?: Record<string, CustomDatasourceConfig>;
28
40
  datasource?: string;
@@ -36,27 +48,19 @@ export interface GetReleasesConfig {
36
48
  constraintsVersioning?: Partial<Record<AdditionalConstraintName, string>>;
37
49
  constraintsFiltering?: ConstraintsFilter;
38
50
  }
39
- export interface GetPkgReleasesConfig {
40
- customDatasources?: Record<string, CustomDatasourceConfig>;
41
- npmrc?: string;
42
- defaultRegistryUrls?: string[];
43
- registryUrls?: string[] | null;
44
- additionalRegistryUrls?: string[];
51
+ /**
52
+ * What the datasource index's `getPkgReleases()` receives from the lookup
53
+ * worker: the registry URL inputs plus the settings applied to the result.
54
+ */
55
+ export interface GetPkgReleasesConfig extends GetReleasesConfig, RegistryUrlsConfig {
45
56
  datasource: string;
46
- packageName: string;
47
- currentValue?: string;
57
+ npmrc?: string;
48
58
  versioning?: string;
49
59
  extractVersion?: string;
50
60
  versionCompatibility?: string;
51
61
  currentCompatibility?: string;
52
- constraints?: Partial<Record<ConstraintName, string>>;
53
62
  replacementName?: string;
54
63
  replacementVersion?: string;
55
- constraintsFiltering?: ConstraintsFilter;
56
- /**
57
- * Any specific overrides for the versioning for the `AdditionalConstraintName`s.
58
- */
59
- constraintsVersioning?: Partial<Record<AdditionalConstraintName, string>>;
60
64
  registryStrategy?: RegistryStrategy;
61
65
  }
62
66
  export interface Release {
@@ -118,6 +122,8 @@ export type RegistryStrategy =
118
122
  * Only the first registry URL is queried.
119
123
  *
120
124
  * If multiple URLs are configured a warning is logged and the rest are ignored. Returns whatever the first registry returns, including `null`.
125
+ *
126
+ * The default.
121
127
  */
122
128
  'first' |
123
129
  /**
@@ -127,8 +133,6 @@ export type RegistryStrategy =
127
133
  * An `ExternalHostError` aborts immediately (unless the cause is `HOST_DISABLED`, which returns `null`).
128
134
  *
129
135
  * Returns `null` when all registries are exhausted without a result.
130
- *
131
- * The default when `registryStrategy` is `undefined`.
132
136
  */
133
137
  'hunt' |
134
138
  /**
@@ -154,10 +158,11 @@ export interface DatasourceApi extends ModuleApi {
154
158
  defaultConfig?: Record<string, unknown> | undefined;
155
159
  /**
156
160
  * Strategy to use when multiple registryUrls are available to the datasource.
161
+ * Defaults to `first`.
157
162
  *
158
163
  * @see RegistryStrategy
159
164
  */
160
- registryStrategy?: RegistryStrategy | undefined;
165
+ registryStrategy: RegistryStrategy;
161
166
  /**
162
167
  * Whether release timestamp can be returned.
163
168
  */
@@ -197,7 +202,7 @@ export interface DatasourceApi extends ModuleApi {
197
202
  *
198
203
  * In other cases, the original `Release` parameter should be returned.
199
204
  */
200
- postprocessRelease(config: PostprocessReleaseConfig, release: Release): Promise<PostprocessReleaseResult>;
205
+ postprocessRelease?(config: PostprocessReleaseConfig, release: Release): Promise<PostprocessReleaseResult>;
201
206
  }
202
207
  //#endregion
203
208
  //# sourceMappingURL=types.d.ts.map
@@ -1,6 +1,7 @@
1
1
  import { minimatch } from "../../../util/minimatch.js";
2
2
  import { matchRegexOrGlob } from "../../../util/string-match.js";
3
3
  import { logger } from "../../../logger/index.js";
4
+ import { instrument } from "../../../instrumentation/index.js";
4
5
  //#region lib/workers/repository/extract/file-match.ts
5
6
  function getIncludedFiles(fileList, includePaths) {
6
7
  if (!includePaths?.length) return [...fileList];
@@ -11,20 +12,24 @@ function filterIgnoredFiles(fileList, ignorePaths) {
11
12
  return fileList.filter((file) => !ignorePaths.some((ignorePath) => file.includes(ignorePath) || minimatch(ignorePath, { dot: true }).match(file)));
12
13
  }
13
14
  function getFilteredFileList(config, fileList) {
14
- const { includePaths, ignorePaths } = config;
15
- let filteredList = getIncludedFiles(fileList, includePaths);
16
- filteredList = filterIgnoredFiles(filteredList, ignorePaths);
17
- return filteredList;
15
+ return instrument("getFilteredFileList", () => {
16
+ const { includePaths, ignorePaths } = config;
17
+ let filteredList = getIncludedFiles(fileList, includePaths);
18
+ filteredList = filterIgnoredFiles(filteredList, ignorePaths);
19
+ return filteredList;
20
+ });
18
21
  }
19
22
  function getMatchingFiles(config, allFiles) {
20
- const fileList = getFilteredFileList(config, allFiles);
21
- const { managerFilePatterns, manager } = config;
22
- let matchedFiles = [];
23
- for (const pattern of managerFilePatterns) {
24
- logger.debug(`Using file pattern: ${pattern} for manager ${manager}`);
25
- matchedFiles = matchedFiles.concat(fileList.filter((file) => matchRegexOrGlob(file, pattern)));
26
- }
27
- return [...new Set(matchedFiles)].sort();
23
+ return instrument("getMatchingFiles", () => {
24
+ const fileList = getFilteredFileList(config, allFiles);
25
+ const { managerFilePatterns, manager } = config;
26
+ let matchedFiles = [];
27
+ for (const pattern of managerFilePatterns) {
28
+ logger.debug(`Using file pattern: ${pattern} for manager ${manager}`);
29
+ matchedFiles = matchedFiles.concat(fileList.filter((file) => matchRegexOrGlob(file, pattern)));
30
+ }
31
+ return [...new Set(matchedFiles)].sort();
32
+ });
28
33
  }
29
34
  //#endregion
30
35
  export { filterIgnoredFiles, getFilteredFileList, getIncludedFiles, getMatchingFiles };
@@ -1 +1 @@
1
- {"version":3,"file":"file-match.js","names":[],"sources":["../../../../lib/workers/repository/extract/file-match.ts"],"sourcesContent":["import type { RenovateConfig } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { minimatch } from '../../../util/minimatch.ts';\nimport { matchRegexOrGlob } from '../../../util/string-match.ts';\n\nexport function getIncludedFiles(\n fileList: string[],\n includePaths: string[],\n): string[] {\n if (!includePaths?.length) {\n return [...fileList];\n }\n return fileList.filter((file) =>\n includePaths.some(\n (includePath) =>\n file === includePath ||\n minimatch(includePath, { dot: true }).match(file),\n ),\n );\n}\n\nexport function filterIgnoredFiles(\n fileList: string[],\n ignorePaths: string[],\n): string[] {\n if (!ignorePaths?.length) {\n return [...fileList];\n }\n return fileList.filter(\n (file) =>\n !ignorePaths.some(\n (ignorePath) =>\n file.includes(ignorePath) ||\n minimatch(ignorePath, { dot: true }).match(file),\n ),\n );\n}\n\nexport function getFilteredFileList(\n config: RenovateConfig,\n fileList: string[],\n): string[] {\n const { includePaths, ignorePaths } = config;\n // TODO #22198\n\n let filteredList = getIncludedFiles(fileList, includePaths!);\n filteredList = filterIgnoredFiles(filteredList, ignorePaths!);\n return filteredList;\n}\n\nexport function getMatchingFiles(\n config: RenovateConfig,\n allFiles: string[],\n): string[] {\n const fileList = getFilteredFileList(config, allFiles);\n const { managerFilePatterns, manager } = config;\n let matchedFiles: string[] = [];\n // TODO: types (#22198)\n for (const pattern of managerFilePatterns!) {\n logger.debug(`Using file pattern: ${pattern} for manager ${manager!}`);\n matchedFiles = matchedFiles.concat(\n fileList.filter((file) => matchRegexOrGlob(file, pattern)),\n );\n }\n // filter out duplicates\n return [...new Set(matchedFiles)].sort();\n}\n"],"mappings":";;;;AAKA,SAAgB,iBACd,UACA,cACU;CACV,IAAI,CAAC,cAAc,QACjB,OAAO,CAAC,GAAG,QAAQ;CAErB,OAAO,SAAS,QAAQ,SACtB,aAAa,MACV,gBACC,SAAS,eACT,UAAU,aAAa,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,CACpD,CACF;AACF;AAEA,SAAgB,mBACd,UACA,aACU;CACV,IAAI,CAAC,aAAa,QAChB,OAAO,CAAC,GAAG,QAAQ;CAErB,OAAO,SAAS,QACb,SACC,CAAC,YAAY,MACV,eACC,KAAK,SAAS,UAAU,KACxB,UAAU,YAAY,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,CACnD,CACJ;AACF;AAEA,SAAgB,oBACd,QACA,UACU;CACV,MAAM,EAAE,cAAc,gBAAgB;CAGtC,IAAI,eAAe,iBAAiB,UAAU,YAAa;CAC3D,eAAe,mBAAmB,cAAc,WAAY;CAC5D,OAAO;AACT;AAEA,SAAgB,iBACd,QACA,UACU;CACV,MAAM,WAAW,oBAAoB,QAAQ,QAAQ;CACrD,MAAM,EAAE,qBAAqB,YAAY;CACzC,IAAI,eAAyB,CAAC;CAE9B,KAAK,MAAM,WAAW,qBAAsB;EAC1C,OAAO,MAAM,uBAAuB,QAAQ,eAAe,SAAU;EACrE,eAAe,aAAa,OAC1B,SAAS,QAAQ,SAAS,iBAAiB,MAAM,OAAO,CAAC,CAC3D;CACF;CAEA,OAAO,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK;AACzC"}
1
+ {"version":3,"file":"file-match.js","names":[],"sources":["../../../../lib/workers/repository/extract/file-match.ts"],"sourcesContent":["import type { RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { minimatch } from '../../../util/minimatch.ts';\nimport { matchRegexOrGlob } from '../../../util/string-match.ts';\n\nexport function getIncludedFiles(\n fileList: string[],\n includePaths: string[],\n): string[] {\n if (!includePaths?.length) {\n return [...fileList];\n }\n return fileList.filter((file) =>\n includePaths.some(\n (includePath) =>\n file === includePath ||\n minimatch(includePath, { dot: true }).match(file),\n ),\n );\n}\n\nexport function filterIgnoredFiles(\n fileList: string[],\n ignorePaths: string[],\n): string[] {\n if (!ignorePaths?.length) {\n return [...fileList];\n }\n return fileList.filter(\n (file) =>\n !ignorePaths.some(\n (ignorePath) =>\n file.includes(ignorePath) ||\n minimatch(ignorePath, { dot: true }).match(file),\n ),\n );\n}\n\nexport function getFilteredFileList(\n config: RenovateConfig,\n fileList: string[],\n): string[] {\n return instrument('getFilteredFileList', () => {\n const { includePaths, ignorePaths } = config;\n // TODO #22198\n\n let filteredList = getIncludedFiles(fileList, includePaths!);\n filteredList = filterIgnoredFiles(filteredList, ignorePaths!);\n return filteredList;\n });\n}\n\nexport function getMatchingFiles(\n config: RenovateConfig,\n allFiles: string[],\n): string[] {\n return instrument('getMatchingFiles', () => {\n const fileList = getFilteredFileList(config, allFiles);\n const { managerFilePatterns, manager } = config;\n let matchedFiles: string[] = [];\n // TODO: types (#22198)\n for (const pattern of managerFilePatterns!) {\n logger.debug(`Using file pattern: ${pattern} for manager ${manager!}`);\n matchedFiles = matchedFiles.concat(\n fileList.filter((file) => matchRegexOrGlob(file, pattern)),\n );\n }\n // filter out duplicates\n return [...new Set(matchedFiles)].sort();\n });\n}\n"],"mappings":";;;;;AAMA,SAAgB,iBACd,UACA,cACU;CACV,IAAI,CAAC,cAAc,QACjB,OAAO,CAAC,GAAG,QAAQ;CAErB,OAAO,SAAS,QAAQ,SACtB,aAAa,MACV,gBACC,SAAS,eACT,UAAU,aAAa,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,CACpD,CACF;AACF;AAEA,SAAgB,mBACd,UACA,aACU;CACV,IAAI,CAAC,aAAa,QAChB,OAAO,CAAC,GAAG,QAAQ;CAErB,OAAO,SAAS,QACb,SACC,CAAC,YAAY,MACV,eACC,KAAK,SAAS,UAAU,KACxB,UAAU,YAAY,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,CACnD,CACJ;AACF;AAEA,SAAgB,oBACd,QACA,UACU;CACV,OAAO,WAAW,6BAA6B;EAC7C,MAAM,EAAE,cAAc,gBAAgB;EAGtC,IAAI,eAAe,iBAAiB,UAAU,YAAa;EAC3D,eAAe,mBAAmB,cAAc,WAAY;EAC5D,OAAO;CACT,CAAC;AACH;AAEA,SAAgB,iBACd,QACA,UACU;CACV,OAAO,WAAW,0BAA0B;EAC1C,MAAM,WAAW,oBAAoB,QAAQ,QAAQ;EACrD,MAAM,EAAE,qBAAqB,YAAY;EACzC,IAAI,eAAyB,CAAC;EAE9B,KAAK,MAAM,WAAW,qBAAsB;GAC1C,OAAO,MAAM,uBAAuB,QAAQ,eAAe,SAAU;GACrE,eAAe,aAAa,OAC1B,SAAS,QAAQ,SAAS,iBAAiB,MAAM,OAAO,CAAC,CAC3D;EACF;EAEA,OAAO,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK;CACzC,CAAC;AACH"}
@@ -1,7 +1,7 @@
1
1
  import { coerceArray } from "../../../util/array.js";
2
2
  import { logger } from "../../../logger/index.js";
3
- import { mergeChildConfig } from "../../../config/utils.js";
4
3
  import { instrument } from "../../../instrumentation/index.js";
4
+ import { mergeChildConfig } from "../../../config/utils.js";
5
5
  import { isCustomManager } from "../../../modules/manager/custom/index.js";
6
6
  import { scm } from "../../../modules/platform/scm.js";
7
7
  import { hashMap } from "../../../modules/manager/fingerprint.generated.js";
@@ -27,14 +27,14 @@ async function extractAllDependencies(config) {
27
27
  });
28
28
  }
29
29
  instrument("filter packageFiles for managers", () => {
30
- for (const manager of managerList) {
30
+ for (const manager of managerList) instrument(`filter packageFiles for manager=${manager}`, () => {
31
31
  const managerConfig = getManagerConfig(config, manager);
32
32
  managerConfig.manager = manager;
33
33
  if (isCustomManager(manager)) {
34
34
  const filteredCustomManagers = coerceArray(config.customManagers).filter((mgr) => mgr.customType === manager);
35
35
  for (const customManager of filteredCustomManagers) tryConfig(mergeChildConfig(managerConfig, customManager));
36
36
  } else tryConfig(managerConfig);
37
- }
37
+ });
38
38
  });
39
39
  const extractResult = {
40
40
  packageFiles: {},
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/workers/repository/extract/index.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { getManagerConfig, mergeChildConfig } from '../../../config/index.ts';\nimport type { ManagerConfig, RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { isCustomManager } from '../../../modules/manager/custom/index.ts';\nimport {\n getEnabledManagersList,\n hashMap,\n} from '../../../modules/manager/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { ExtractResult, WorkerExtractConfig } from '../../types.ts';\nimport { getMatchingFiles } from './file-match.ts';\nimport { getManagerPackageFiles } from './manager-files.ts';\nimport { processSupersedesManagers } from './supersedes.ts';\nimport { hasVulnerabilityAlertsRules } from './vulnerability-alerts.ts';\n\nexport async function extractAllDependencies(\n config: RenovateConfig,\n): Promise<ExtractResult> {\n const managerList = getEnabledManagersList(config.enabledManagers);\n const extractList: WorkerExtractConfig[] = [];\n const fileList = await scm.getFileList();\n const hasAlertRules = hasVulnerabilityAlertsRules(config);\n\n function tryConfig(managerConfig: ManagerConfig): void {\n const matchingFileList = getMatchingFiles(managerConfig, fileList);\n if (matchingFileList.length) {\n extractList.push({\n ...managerConfig,\n hasVulnerabilityAlertsRules: hasAlertRules,\n fileList: matchingFileList,\n });\n }\n }\n\n instrument('filter packageFiles for managers', () => {\n for (const manager of managerList) {\n const managerConfig = getManagerConfig(config, manager);\n managerConfig.manager = manager;\n if (isCustomManager(manager)) {\n const filteredCustomManagers = coerceArray(\n config.customManagers,\n ).filter((mgr) => mgr.customType === manager);\n for (const customManager of filteredCustomManagers) {\n tryConfig(mergeChildConfig(managerConfig, customManager));\n }\n } else {\n tryConfig(managerConfig);\n }\n }\n });\n\n const extractResult: ExtractResult = {\n packageFiles: {},\n extractionFingerprints: {},\n };\n\n // Store the fingerprint of all managers which match any file (even if they do not find any dependencies)\n // The cached result needs to be invalidated if the fingerprint of any matching manager changes\n for (const { manager } of extractList) {\n extractResult.extractionFingerprints[manager] = hashMap.get(manager);\n }\n\n const extractDurations: Record<string, number> = {};\n const extractResults = await Promise.all(\n extractList.map(async (managerConfig) => {\n const start = Date.now();\n const packageFiles = await instrument(\n managerConfig.manager,\n async () => await getManagerPackageFiles(managerConfig),\n );\n const durationMs = Math.round(Date.now() - start);\n extractDurations[managerConfig.manager] = durationMs;\n return { manager: managerConfig.manager, packageFiles };\n }),\n );\n\n // De-duplicate results using supersedesManagers\n processSupersedesManagers(extractResults);\n\n // Sort alphabetically for stable log output. See #40091\n const sortedExtractDurations = Object.keys(extractDurations)\n .sort()\n .reduce<Record<string, number>>((acc, key) => {\n acc[key] = extractDurations[key];\n return acc;\n }, {});\n\n logger.debug(\n { managers: sortedExtractDurations },\n 'manager extract durations (ms)',\n );\n let fileCount = 0;\n for (const { manager, packageFiles } of extractResults) {\n if (packageFiles?.length) {\n fileCount += packageFiles.length;\n logger.debug(`Found ${manager} package files`);\n extractResult.packageFiles[manager] = (\n extractResult.packageFiles[manager] || []\n ).concat(packageFiles);\n }\n }\n logger.debug(`Found ${fileCount} package file(s)`);\n\n // If enabledManagers is non-empty, check that each of them has at least one extraction.\n // If not, log a warning to indicate possible misconfiguration.\n if (isNonEmptyArray(config.enabledManagers)) {\n for (const enabledManager of config.enabledManagers) {\n if (\n !(enabledManager.replace('custom.', '') in extractResult.packageFiles)\n ) {\n logger.debug(\n { manager: enabledManager },\n `Manager explicitly enabled in \"enabledManagers\" config, but found no results. Possible config error?`,\n );\n }\n }\n }\n\n return extractResult;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,eAAsB,uBACpB,QACwB;CACxB,MAAM,cAAc,uBAAuB,OAAO,eAAe;CACjE,MAAM,cAAqC,CAAC;CAC5C,MAAM,WAAW,MAAM,IAAI,YAAY;CACvC,MAAM,gBAAgB,4BAA4B,MAAM;CAExD,SAAS,UAAU,eAAoC;EACrD,MAAM,mBAAmB,iBAAiB,eAAe,QAAQ;EACjE,IAAI,iBAAiB,QACnB,YAAY,KAAK;GACf,GAAG;GACH,6BAA6B;GAC7B,UAAU;EACZ,CAAC;CAEL;CAEA,WAAW,0CAA0C;EACnD,KAAK,MAAM,WAAW,aAAa;GACjC,MAAM,gBAAgB,iBAAiB,QAAQ,OAAO;GACtD,cAAc,UAAU;GACxB,IAAI,gBAAgB,OAAO,GAAG;IAC5B,MAAM,yBAAyB,YAC7B,OAAO,cACT,CAAC,CAAC,QAAQ,QAAQ,IAAI,eAAe,OAAO;IAC5C,KAAK,MAAM,iBAAiB,wBAC1B,UAAU,iBAAiB,eAAe,aAAa,CAAC;GAE5D,OACE,UAAU,aAAa;EAE3B;CACF,CAAC;CAED,MAAM,gBAA+B;EACnC,cAAc,CAAC;EACf,wBAAwB,CAAC;CAC3B;CAIA,KAAK,MAAM,EAAE,aAAa,aACxB,cAAc,uBAAuB,WAAW,QAAQ,IAAI,OAAO;CAGrE,MAAM,mBAA2C,CAAC;CAClD,MAAM,iBAAiB,MAAM,QAAQ,IACnC,YAAY,IAAI,OAAO,kBAAkB;EACvC,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,eAAe,MAAM,WACzB,cAAc,SACd,YAAY,MAAM,uBAAuB,aAAa,CACxD;EACA,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,KAAK;EAChD,iBAAiB,cAAc,WAAW;EAC1C,OAAO;GAAE,SAAS,cAAc;GAAS;EAAa;CACxD,CAAC,CACH;CAGA,0BAA0B,cAAc;CAGxC,MAAM,yBAAyB,OAAO,KAAK,gBAAgB,CAAC,CACzD,KAAK,CAAC,CACN,QAAgC,KAAK,QAAQ;EAC5C,IAAI,OAAO,iBAAiB;EAC5B,OAAO;CACT,GAAG,CAAC,CAAC;CAEP,OAAO,MACL,EAAE,UAAU,uBAAuB,GACnC,gCACF;CACA,IAAI,YAAY;CAChB,KAAK,MAAM,EAAE,SAAS,kBAAkB,gBACtC,IAAI,cAAc,QAAQ;EACxB,aAAa,aAAa;EAC1B,OAAO,MAAM,SAAS,QAAQ,eAAe;EAC7C,cAAc,aAAa,YACzB,cAAc,aAAa,YAAY,CAAC,EAAA,CACxC,OAAO,YAAY;CACvB;CAEF,OAAO,MAAM,SAAS,UAAU,iBAAiB;CAIjD,IAAI,gBAAgB,OAAO,eAAe,GACnC;OAAA,MAAM,kBAAkB,OAAO,iBAClC,IACE,EAAE,eAAe,QAAQ,WAAW,EAAE,KAAK,cAAc,eAEzD,OAAO,MACL,EAAE,SAAS,eAAe,GAC1B,sGACF;CAAA;CAKN,OAAO;AACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/workers/repository/extract/index.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { getManagerConfig, mergeChildConfig } from '../../../config/index.ts';\nimport type { ManagerConfig, RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { isCustomManager } from '../../../modules/manager/custom/index.ts';\nimport {\n getEnabledManagersList,\n hashMap,\n} from '../../../modules/manager/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { ExtractResult, WorkerExtractConfig } from '../../types.ts';\nimport { getMatchingFiles } from './file-match.ts';\nimport { getManagerPackageFiles } from './manager-files.ts';\nimport { processSupersedesManagers } from './supersedes.ts';\nimport { hasVulnerabilityAlertsRules } from './vulnerability-alerts.ts';\n\nexport async function extractAllDependencies(\n config: RenovateConfig,\n): Promise<ExtractResult> {\n const managerList = getEnabledManagersList(config.enabledManagers);\n const extractList: WorkerExtractConfig[] = [];\n const fileList = await scm.getFileList();\n const hasAlertRules = hasVulnerabilityAlertsRules(config);\n\n function tryConfig(managerConfig: ManagerConfig): void {\n const matchingFileList = getMatchingFiles(managerConfig, fileList);\n if (matchingFileList.length) {\n extractList.push({\n ...managerConfig,\n hasVulnerabilityAlertsRules: hasAlertRules,\n fileList: matchingFileList,\n });\n }\n }\n\n instrument('filter packageFiles for managers', () => {\n for (const manager of managerList) {\n instrument(`filter packageFiles for manager=${manager}`, () => {\n const managerConfig = getManagerConfig(config, manager);\n managerConfig.manager = manager;\n if (isCustomManager(manager)) {\n const filteredCustomManagers = coerceArray(\n config.customManagers,\n ).filter((mgr) => mgr.customType === manager);\n for (const customManager of filteredCustomManagers) {\n tryConfig(mergeChildConfig(managerConfig, customManager));\n }\n } else {\n tryConfig(managerConfig);\n }\n });\n }\n });\n\n const extractResult: ExtractResult = {\n packageFiles: {},\n extractionFingerprints: {},\n };\n\n // Store the fingerprint of all managers which match any file (even if they do not find any dependencies)\n // The cached result needs to be invalidated if the fingerprint of any matching manager changes\n for (const { manager } of extractList) {\n extractResult.extractionFingerprints[manager] = hashMap.get(manager);\n }\n\n const extractDurations: Record<string, number> = {};\n const extractResults = await Promise.all(\n extractList.map(async (managerConfig) => {\n const start = Date.now();\n const packageFiles = await instrument(\n managerConfig.manager,\n async () => await getManagerPackageFiles(managerConfig),\n );\n const durationMs = Math.round(Date.now() - start);\n extractDurations[managerConfig.manager] = durationMs;\n return { manager: managerConfig.manager, packageFiles };\n }),\n );\n\n // De-duplicate results using supersedesManagers\n processSupersedesManagers(extractResults);\n\n // Sort alphabetically for stable log output. See #40091\n const sortedExtractDurations = Object.keys(extractDurations)\n .sort()\n .reduce<Record<string, number>>((acc, key) => {\n acc[key] = extractDurations[key];\n return acc;\n }, {});\n\n logger.debug(\n { managers: sortedExtractDurations },\n 'manager extract durations (ms)',\n );\n let fileCount = 0;\n for (const { manager, packageFiles } of extractResults) {\n if (packageFiles?.length) {\n fileCount += packageFiles.length;\n logger.debug(`Found ${manager} package files`);\n extractResult.packageFiles[manager] = (\n extractResult.packageFiles[manager] || []\n ).concat(packageFiles);\n }\n }\n logger.debug(`Found ${fileCount} package file(s)`);\n\n // If enabledManagers is non-empty, check that each of them has at least one extraction.\n // If not, log a warning to indicate possible misconfiguration.\n if (isNonEmptyArray(config.enabledManagers)) {\n for (const enabledManager of config.enabledManagers) {\n if (\n !(enabledManager.replace('custom.', '') in extractResult.packageFiles)\n ) {\n logger.debug(\n { manager: enabledManager },\n `Manager explicitly enabled in \"enabledManagers\" config, but found no results. Possible config error?`,\n );\n }\n }\n }\n\n return extractResult;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,eAAsB,uBACpB,QACwB;CACxB,MAAM,cAAc,uBAAuB,OAAO,eAAe;CACjE,MAAM,cAAqC,CAAC;CAC5C,MAAM,WAAW,MAAM,IAAI,YAAY;CACvC,MAAM,gBAAgB,4BAA4B,MAAM;CAExD,SAAS,UAAU,eAAoC;EACrD,MAAM,mBAAmB,iBAAiB,eAAe,QAAQ;EACjE,IAAI,iBAAiB,QACnB,YAAY,KAAK;GACf,GAAG;GACH,6BAA6B;GAC7B,UAAU;EACZ,CAAC;CAEL;CAEA,WAAW,0CAA0C;EACnD,KAAK,MAAM,WAAW,aACpB,WAAW,mCAAmC,iBAAiB;GAC7D,MAAM,gBAAgB,iBAAiB,QAAQ,OAAO;GACtD,cAAc,UAAU;GACxB,IAAI,gBAAgB,OAAO,GAAG;IAC5B,MAAM,yBAAyB,YAC7B,OAAO,cACT,CAAC,CAAC,QAAQ,QAAQ,IAAI,eAAe,OAAO;IAC5C,KAAK,MAAM,iBAAiB,wBAC1B,UAAU,iBAAiB,eAAe,aAAa,CAAC;GAE5D,OACE,UAAU,aAAa;EAE3B,CAAC;CAEL,CAAC;CAED,MAAM,gBAA+B;EACnC,cAAc,CAAC;EACf,wBAAwB,CAAC;CAC3B;CAIA,KAAK,MAAM,EAAE,aAAa,aACxB,cAAc,uBAAuB,WAAW,QAAQ,IAAI,OAAO;CAGrE,MAAM,mBAA2C,CAAC;CAClD,MAAM,iBAAiB,MAAM,QAAQ,IACnC,YAAY,IAAI,OAAO,kBAAkB;EACvC,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,eAAe,MAAM,WACzB,cAAc,SACd,YAAY,MAAM,uBAAuB,aAAa,CACxD;EACA,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,KAAK;EAChD,iBAAiB,cAAc,WAAW;EAC1C,OAAO;GAAE,SAAS,cAAc;GAAS;EAAa;CACxD,CAAC,CACH;CAGA,0BAA0B,cAAc;CAGxC,MAAM,yBAAyB,OAAO,KAAK,gBAAgB,CAAC,CACzD,KAAK,CAAC,CACN,QAAgC,KAAK,QAAQ;EAC5C,IAAI,OAAO,iBAAiB;EAC5B,OAAO;CACT,GAAG,CAAC,CAAC;CAEP,OAAO,MACL,EAAE,UAAU,uBAAuB,GACnC,gCACF;CACA,IAAI,YAAY;CAChB,KAAK,MAAM,EAAE,SAAS,kBAAkB,gBACtC,IAAI,cAAc,QAAQ;EACxB,aAAa,aAAa;EAC1B,OAAO,MAAM,SAAS,QAAQ,eAAe;EAC7C,cAAc,aAAa,YACzB,cAAc,aAAa,YAAY,CAAC,EAAA,CACxC,OAAO,YAAY;CACvB;CAEF,OAAO,MAAM,SAAS,UAAU,iBAAiB;CAIjD,IAAI,gBAAgB,OAAO,eAAe,GACnC;OAAA,MAAM,kBAAkB,OAAO,iBAClC,IACE,EAAE,eAAe,QAAQ,WAAW,EAAE,KAAK,cAAc,eAEzD,OAAO,MACL,EAAE,SAAS,eAAe,GAC1B,sGACF;CAAA;CAKN,OAAO;AACT"}
@@ -1,8 +1,8 @@
1
1
  import { logger } from "../../../logger/index.js";
2
2
  import { clone } from "../../../util/clone.js";
3
- import { mergeChildConfig } from "../../../config/utils.js";
4
3
  import { LookupStats } from "../../../util/stats.js";
5
4
  import { instrument } from "../../../instrumentation/index.js";
5
+ import { mergeChildConfig } from "../../../config/utils.js";
6
6
  import { ExternalHostError } from "../../../types/errors/external-host-error.js";
7
7
  import { Result } from "../../../util/result.js";
8
8
  import { all } from "../../../util/promises.js";
@@ -3,9 +3,9 @@ import { GlobalConfig } from "../../../config/global.js";
3
3
  import { getRegexPredicate } from "../../../util/string-match.js";
4
4
  import { addMeta, logger, removeMeta } from "../../../logger/index.js";
5
5
  import { clone } from "../../../util/clone.js";
6
- import { mergeChildConfig } from "../../../config/utils.js";
7
6
  import { ATTR_RENOVATE_SPLIT } from "../../../instrumentation/types.js";
8
7
  import { instrument } from "../../../instrumentation/index.js";
8
+ import { mergeChildConfig } from "../../../config/utils.js";
9
9
  import { resolveConfigPresets } from "../../../config/presets/index.js";
10
10
  import { getCache } from "../../../util/cache/repository/index.js";
11
11
  import { getBranchList } from "../../../util/git/index.js";
@@ -2,9 +2,9 @@ import { regEx } from "../../../util/regex.js";
2
2
  import { coerceArray } from "../../../util/array.js";
3
3
  import { titleCase } from "../../../util/string.js";
4
4
  import { logger } from "../../../logger/index.js";
5
+ import { instrument } from "../../../instrumentation/index.js";
5
6
  import { getFixedVersionConstraint, getLastAffectedVersionConstraint } from "../../../util/vulnerability/utils.js";
6
7
  import { mergeChildConfig } from "../../../config/utils.js";
7
- import { instrument } from "../../../instrumentation/index.js";
8
8
  import { get } from "../../../modules/versioning/index.js";
9
9
  import { all } from "../../../util/promises.js";
10
10
  import { getDefaultVersioning } from "../../../modules/datasource/common.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "44.125.1",
4
+ "version": "44.125.2",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 44.125.1 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 44.125.2 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "44.125.1",
5
+ "x-renovate-version": "44.125.2",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {