renovate 43.118.2 → 43.120.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  import { pkg } from "../expose.js";
2
+ import { GetDatasourceReleasesSpanProcessor } from "../modules/datasource/span-processor.js";
2
3
  import { GitOperationSpanProcessor } from "../util/git/span-processor.js";
3
4
  import { getResourceDetectors } from "./detectors.js";
4
5
  import { isTraceDebuggingEnabled, isTraceSendingEnabled, isTracingEnabled, massageThrowable } from "./utils.js";
@@ -19,7 +20,7 @@ import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from "@opentelemetry/semantic
19
20
  //#region lib/instrumentation/index.ts
20
21
  let instrumentations = [];
21
22
  function init() {
22
- const spanProcessors = [new GitOperationSpanProcessor()];
23
+ const spanProcessors = [new GitOperationSpanProcessor(), new GetDatasourceReleasesSpanProcessor()];
23
24
  if (!isTracingEnabled()) {
24
25
  new NodeTracerProvider({ spanProcessors }).register({ contextManager: new AsyncLocalStorageContextManager() });
25
26
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../lib/instrumentation/index.ts"],"sourcesContent":["import { ClientRequest, ServerResponse } from 'node:http';\nimport type { Context, Span, Tracer, TracerProvider } from '@opentelemetry/api';\nimport * as api from '@opentelemetry/api';\nimport { ProxyTracerProvider, SpanStatusCode } from '@opentelemetry/api';\nimport { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport type { Instrumentation } from '@opentelemetry/instrumentation';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport { BunyanInstrumentation } from '@opentelemetry/instrumentation-bunyan';\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http';\nimport { RedisInstrumentation } from '@opentelemetry/instrumentation-redis';\nimport {\n detectResources,\n resourceFromAttributes,\n} from '@opentelemetry/resources';\nimport {\n BatchSpanProcessor,\n ConsoleSpanExporter,\n SimpleSpanProcessor,\n type SpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n} from '@opentelemetry/semantic-conventions';\nimport { isPromise } from '@sindresorhus/is';\nimport { pkg } from '../expose.ts';\nimport { GitOperationSpanProcessor } from '../util/git/span-processor.ts';\nimport { getResourceDetectors } from './detectors.ts';\nimport type { RenovateSpanOptions } from './types.ts';\nimport {\n isTraceDebuggingEnabled,\n isTraceSendingEnabled,\n isTracingEnabled,\n massageThrowable,\n} from './utils.ts';\n\nlet instrumentations: Instrumentation[] = [];\n\nexport function init(): void {\n const spanProcessors: SpanProcessor[] = [new GitOperationSpanProcessor()];\n\n if (!isTracingEnabled()) {\n const traceProvider = new NodeTracerProvider({ spanProcessors });\n traceProvider.register({\n contextManager: new AsyncLocalStorageContextManager(),\n });\n return;\n }\n\n // v8 ignore if -- TODO add tests\n if (process.env.OTEL_LOG_LEVEL) {\n api.diag.setLogger(\n new api.DiagConsoleLogger(),\n api.DiagLogLevel[\n process.env.OTEL_LOG_LEVEL.toUpperCase() as keyof typeof api.DiagLogLevel\n ],\n );\n }\n\n // add processors\n if (isTraceDebuggingEnabled()) {\n spanProcessors.push(new SimpleSpanProcessor(new ConsoleSpanExporter()));\n }\n\n // OTEL specification environment variable\n if (isTraceSendingEnabled()) {\n const exporter = new OTLPTraceExporter();\n spanProcessors.push(new BatchSpanProcessor(exporter));\n }\n\n const env = process.env; // don't use getEnv() here to avoid circular dependency with env variables used in the resource detectors\n const baseResource = resourceFromAttributes({\n // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#semantic-attributes-with-sdk-provided-default-value\n [ATTR_SERVICE_NAME]: env.OTEL_SERVICE_NAME ?? 'renovate',\n // https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions#unstable-semconv\n // https://github.com/open-telemetry/opentelemetry-js/blob/e9d3c71918635d490b6a9ac9f8259265b38394d0/semantic-conventions/src/experimental_attributes.ts#L7688\n ['service.namespace']: env.OTEL_SERVICE_NAMESPACE ?? 'renovatebot.com',\n [ATTR_SERVICE_VERSION]: env.OTEL_SERVICE_VERSION ?? pkg.version,\n });\n\n const detectedResource = detectResources({\n detectors: getResourceDetectors(env),\n });\n\n const traceProvider = new NodeTracerProvider({\n resource: baseResource.merge(detectedResource),\n spanProcessors,\n });\n\n const contextManager = new AsyncLocalStorageContextManager();\n traceProvider.register({\n contextManager,\n });\n\n instrumentations = [\n new HttpInstrumentation({\n /* v8 ignore start -- not easily testable */\n applyCustomAttributesOnSpan: (span, request, response) => {\n // ignore 404 errors when the branch protection of Github could not be found. This is expected if no rules are configured\n if (\n request instanceof ClientRequest &&\n request.host === `api.github.com` &&\n request.path.endsWith(`/protection`) &&\n response.statusCode === 404\n ) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else if (\n request instanceof ClientRequest &&\n request.path === '/v2/' &&\n request.method === 'GET' &&\n !request.getHeader('authorization') &&\n response instanceof ServerResponse &&\n response.getHeader('www-authenticate') &&\n response.getHeader('docker-distribution-api-version') &&\n response.statusCode === 401\n ) {\n // Docker API test expects 401 with `www-authenticate` header when registry requires authentication, so ignore this error\n span.setStatus({ code: SpanStatusCode.OK });\n }\n },\n /* v8 ignore stop -- not easily testable */\n }),\n new BunyanInstrumentation(),\n new RedisInstrumentation(),\n ];\n registerInstrumentations({\n instrumentations,\n });\n}\n\n// https://github.com/open-telemetry/opentelemetry-js-api/issues/34\n/* v8 ignore next -- not easily testable */\nexport async function shutdown(): Promise<void> {\n const traceProvider = getTracerProvider();\n if (traceProvider instanceof NodeTracerProvider) {\n await traceProvider.shutdown();\n } else if (traceProvider instanceof ProxyTracerProvider) {\n const delegateProvider = traceProvider.getDelegate();\n if (delegateProvider instanceof NodeTracerProvider) {\n await delegateProvider.shutdown();\n }\n }\n}\n\nexport function disableInstrumentations(): void {\n for (const instrumentation of instrumentations) {\n instrumentation.disable();\n }\n}\n\nexport function getTracerProvider(): TracerProvider {\n return api.trace.getTracerProvider();\n}\n\nfunction getTracer(): Tracer {\n return getTracerProvider().getTracer('renovate');\n}\n\nexport function instrument<F extends () => ReturnType<F>>(\n name: string,\n fn: F,\n): ReturnType<F>;\nexport function instrument<F extends () => ReturnType<F>>(\n name: string,\n fn: F,\n options: RenovateSpanOptions,\n): ReturnType<F>;\nexport function instrument<F extends () => ReturnType<F>>(\n name: string,\n fn: F,\n options: RenovateSpanOptions,\n context: Context,\n): ReturnType<F>;\nexport function instrument<F extends () => ReturnType<F>>(\n name: string,\n fn: F,\n options: RenovateSpanOptions = {},\n context: Context = api.context.active(),\n): ReturnType<F> {\n return getTracer().startActiveSpan(name, options, context, (span: Span) => {\n try {\n const ret = fn();\n if (isPromise(ret)) {\n return ret\n .catch((e) => {\n span.recordException(e);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: massageThrowable(e),\n });\n throw e;\n })\n .finally(() => span.end()) as ReturnType<F>;\n }\n span.end();\n return ret;\n } catch (e) {\n span.recordException(e);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: massageThrowable(e),\n });\n span.end();\n throw e;\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../lib/instrumentation/index.ts"],"sourcesContent":["import { ClientRequest, ServerResponse } from 'node:http';\nimport type { Context, Span, Tracer, TracerProvider } from '@opentelemetry/api';\nimport * as api from '@opentelemetry/api';\nimport { ProxyTracerProvider, SpanStatusCode } from '@opentelemetry/api';\nimport { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport type { Instrumentation } from '@opentelemetry/instrumentation';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport { BunyanInstrumentation } from '@opentelemetry/instrumentation-bunyan';\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http';\nimport { RedisInstrumentation } from '@opentelemetry/instrumentation-redis';\nimport {\n detectResources,\n resourceFromAttributes,\n} from '@opentelemetry/resources';\nimport {\n BatchSpanProcessor,\n ConsoleSpanExporter,\n SimpleSpanProcessor,\n type SpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n} from '@opentelemetry/semantic-conventions';\nimport { isPromise } from '@sindresorhus/is';\nimport { pkg } from '../expose.ts';\nimport { GetDatasourceReleasesSpanProcessor } from '../modules/datasource/span-processor.ts';\nimport { GitOperationSpanProcessor } from '../util/git/span-processor.ts';\nimport { getResourceDetectors } from './detectors.ts';\nimport type { RenovateSpanOptions } from './types.ts';\nimport {\n isTraceDebuggingEnabled,\n isTraceSendingEnabled,\n isTracingEnabled,\n massageThrowable,\n} from './utils.ts';\n\nlet instrumentations: Instrumentation[] = [];\n\nexport function init(): void {\n const spanProcessors: SpanProcessor[] = [\n new GitOperationSpanProcessor(),\n new GetDatasourceReleasesSpanProcessor(),\n ];\n\n if (!isTracingEnabled()) {\n const traceProvider = new NodeTracerProvider({ spanProcessors });\n traceProvider.register({\n contextManager: new AsyncLocalStorageContextManager(),\n });\n return;\n }\n\n // v8 ignore if -- TODO add tests\n if (process.env.OTEL_LOG_LEVEL) {\n api.diag.setLogger(\n new api.DiagConsoleLogger(),\n api.DiagLogLevel[\n process.env.OTEL_LOG_LEVEL.toUpperCase() as keyof typeof api.DiagLogLevel\n ],\n );\n }\n\n // add processors\n if (isTraceDebuggingEnabled()) {\n spanProcessors.push(new SimpleSpanProcessor(new ConsoleSpanExporter()));\n }\n\n // OTEL specification environment variable\n if (isTraceSendingEnabled()) {\n const exporter = new OTLPTraceExporter();\n spanProcessors.push(new BatchSpanProcessor(exporter));\n }\n\n const env = process.env; // don't use getEnv() here to avoid circular dependency with env variables used in the resource detectors\n const baseResource = resourceFromAttributes({\n // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#semantic-attributes-with-sdk-provided-default-value\n [ATTR_SERVICE_NAME]: env.OTEL_SERVICE_NAME ?? 'renovate',\n // https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions#unstable-semconv\n // https://github.com/open-telemetry/opentelemetry-js/blob/e9d3c71918635d490b6a9ac9f8259265b38394d0/semantic-conventions/src/experimental_attributes.ts#L7688\n ['service.namespace']: env.OTEL_SERVICE_NAMESPACE ?? 'renovatebot.com',\n [ATTR_SERVICE_VERSION]: env.OTEL_SERVICE_VERSION ?? pkg.version,\n });\n\n const detectedResource = detectResources({\n detectors: getResourceDetectors(env),\n });\n\n const traceProvider = new NodeTracerProvider({\n resource: baseResource.merge(detectedResource),\n spanProcessors,\n });\n\n const contextManager = new AsyncLocalStorageContextManager();\n traceProvider.register({\n contextManager,\n });\n\n instrumentations = [\n new HttpInstrumentation({\n /* v8 ignore start -- not easily testable */\n applyCustomAttributesOnSpan: (span, request, response) => {\n // ignore 404 errors when the branch protection of Github could not be found. This is expected if no rules are configured\n if (\n request instanceof ClientRequest &&\n request.host === `api.github.com` &&\n request.path.endsWith(`/protection`) &&\n response.statusCode === 404\n ) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else if (\n request instanceof ClientRequest &&\n request.path === '/v2/' &&\n request.method === 'GET' &&\n !request.getHeader('authorization') &&\n response instanceof ServerResponse &&\n response.getHeader('www-authenticate') &&\n response.getHeader('docker-distribution-api-version') &&\n response.statusCode === 401\n ) {\n // Docker API test expects 401 with `www-authenticate` header when registry requires authentication, so ignore this error\n span.setStatus({ code: SpanStatusCode.OK });\n }\n },\n /* v8 ignore stop -- not easily testable */\n }),\n new BunyanInstrumentation(),\n new RedisInstrumentation(),\n ];\n registerInstrumentations({\n instrumentations,\n });\n}\n\n// https://github.com/open-telemetry/opentelemetry-js-api/issues/34\n/* v8 ignore next -- not easily testable */\nexport async function shutdown(): Promise<void> {\n const traceProvider = getTracerProvider();\n if (traceProvider instanceof NodeTracerProvider) {\n await traceProvider.shutdown();\n } else if (traceProvider instanceof ProxyTracerProvider) {\n const delegateProvider = traceProvider.getDelegate();\n if (delegateProvider instanceof NodeTracerProvider) {\n await delegateProvider.shutdown();\n }\n }\n}\n\nexport function disableInstrumentations(): void {\n for (const instrumentation of instrumentations) {\n instrumentation.disable();\n }\n}\n\nexport function getTracerProvider(): TracerProvider {\n return api.trace.getTracerProvider();\n}\n\nfunction getTracer(): Tracer {\n return getTracerProvider().getTracer('renovate');\n}\n\nexport function instrument<F extends () => ReturnType<F>>(\n name: string,\n fn: F,\n): ReturnType<F>;\nexport function instrument<F extends () => ReturnType<F>>(\n name: string,\n fn: F,\n options: RenovateSpanOptions,\n): ReturnType<F>;\nexport function instrument<F extends () => ReturnType<F>>(\n name: string,\n fn: F,\n options: RenovateSpanOptions,\n context: Context,\n): ReturnType<F>;\nexport function instrument<F extends () => ReturnType<F>>(\n name: string,\n fn: F,\n options: RenovateSpanOptions = {},\n context: Context = api.context.active(),\n): ReturnType<F> {\n return getTracer().startActiveSpan(name, options, context, (span: Span) => {\n try {\n const ret = fn();\n if (isPromise(ret)) {\n return ret\n .catch((e) => {\n span.recordException(e);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: massageThrowable(e),\n });\n throw e;\n })\n .finally(() => span.end()) as ReturnType<F>;\n }\n span.end();\n return ret;\n } catch (e) {\n span.recordException(e);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: massageThrowable(e),\n });\n span.end();\n throw e;\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuCA,IAAI,mBAAsC,EAAE;AAE5C,SAAgB,OAAa;CAC3B,MAAM,iBAAkC,CACtC,IAAI,2BAA2B,EAC/B,IAAI,oCAAoC,CACzC;AAED,KAAI,CAAC,kBAAkB,EAAE;AACD,MAAI,mBAAmB,EAAE,gBAAgB,CAAC,CAClD,SAAS,EACrB,gBAAgB,IAAI,iCAAiC,EACtD,CAAC;AACF;;;AAIF,KAAI,QAAQ,IAAI,eACd,KAAI,KAAK,UACP,IAAI,IAAI,mBAAmB,EAC3B,IAAI,aACF,QAAQ,IAAI,eAAe,aAAa,EAE3C;AAIH,KAAI,yBAAyB,CAC3B,gBAAe,KAAK,IAAI,oBAAoB,IAAI,qBAAqB,CAAC,CAAC;AAIzE,KAAI,uBAAuB,EAAE;EAC3B,MAAM,WAAW,IAAI,mBAAmB;AACxC,iBAAe,KAAK,IAAI,mBAAmB,SAAS,CAAC;;CAGvD,MAAM,MAAM,QAAQ;CACpB,MAAM,eAAe,uBAAuB;GAEzC,oBAAoB,IAAI,qBAAqB;GAG7C,sBAAsB,IAAI,0BAA0B;GACpD,uBAAuB,IAAI,wBAAwB,IAAI;EACzD,CAAC;CAEF,MAAM,mBAAmB,gBAAgB,EACvC,WAAW,qBAAqB,IAAI,EACrC,CAAC;CAEF,MAAM,gBAAgB,IAAI,mBAAmB;EAC3C,UAAU,aAAa,MAAM,iBAAiB;EAC9C;EACD,CAAC;CAEF,MAAM,iBAAiB,IAAI,iCAAiC;AAC5D,eAAc,SAAS,EACrB,gBACD,CAAC;AAEF,oBAAmB;EACjB,IAAI,oBAAoB,EAEtB,8BAA8B,MAAM,SAAS,aAAa;AAExD,OACE,mBAAmB,iBACnB,QAAQ,SAAS,oBACjB,QAAQ,KAAK,SAAS,cAAc,IACpC,SAAS,eAAe,IAExB,MAAK,UAAU,EAAE,MAAM,eAAe,IAAI,CAAC;YAE3C,mBAAmB,iBACnB,QAAQ,SAAS,UACjB,QAAQ,WAAW,SACnB,CAAC,QAAQ,UAAU,gBAAgB,IACnC,oBAAoB,kBACpB,SAAS,UAAU,mBAAmB,IACtC,SAAS,UAAU,kCAAkC,IACrD,SAAS,eAAe,IAGxB,MAAK,UAAU,EAAE,MAAM,eAAe,IAAI,CAAC;KAIhD,CAAC;EACF,IAAI,uBAAuB;EAC3B,IAAI,sBAAsB;EAC3B;AACD,0BAAyB,EACvB,kBACD,CAAC;;;AAKJ,eAAsB,WAA0B;CAC9C,MAAM,gBAAgB,mBAAmB;AACzC,KAAI,yBAAyB,mBAC3B,OAAM,cAAc,UAAU;UACrB,yBAAyB,qBAAqB;EACvD,MAAM,mBAAmB,cAAc,aAAa;AACpD,MAAI,4BAA4B,mBAC9B,OAAM,iBAAiB,UAAU;;;AAWvC,SAAgB,oBAAoC;AAClD,QAAO,IAAI,MAAM,mBAAmB;;AAGtC,SAAS,YAAoB;AAC3B,QAAO,mBAAmB,CAAC,UAAU,WAAW;;AAkBlD,SAAgB,WACd,MACA,IACA,UAA+B,EAAE,EACjC,UAAmB,IAAI,QAAQ,QAAQ,EACxB;AACf,QAAO,WAAW,CAAC,gBAAgB,MAAM,SAAS,UAAU,SAAe;AACzE,MAAI;GACF,MAAM,MAAM,IAAI;AAChB,OAAI,UAAU,IAAI,CAChB,QAAO,IACJ,OAAO,MAAM;AACZ,SAAK,gBAAgB,EAAE;AACvB,SAAK,UAAU;KACb,MAAM,eAAe;KACrB,SAAS,iBAAiB,EAAE;KAC7B,CAAC;AACF,UAAM;KACN,CACD,cAAc,KAAK,KAAK,CAAC;AAE9B,QAAK,KAAK;AACV,UAAO;WACA,GAAG;AACV,QAAK,gBAAgB,EAAE;AACvB,QAAK,UAAU;IACb,MAAM,eAAe;IACrB,SAAS,iBAAiB,EAAE;IAC7B,CAAC;AACF,QAAK,KAAK;AACV,SAAM;;GAER"}
@@ -4,6 +4,7 @@ import { BranchCache } from "../util/cache/repository/types.js";
4
4
  import { PackageFile } from "../modules/manager/types.js";
5
5
  import { RenovateSplit } from "../config/types.js";
6
6
  import { Attributes, SpanKind, SpanOptions } from "@opentelemetry/api";
7
+ import { ATTR_CODE_FUNCTION_NAME } from "@opentelemetry/semantic-conventions";
7
8
 
8
9
  //#region lib/instrumentation/types.d.ts
9
10
  type RenovateSpanOptions = {
@@ -12,6 +13,10 @@ type RenovateSpanOptions = {
12
13
  type RenovateSpanAttributes = {
13
14
  [ATTR_RENOVATE_SPLIT]?: RenovateSplit;
14
15
  [ATTR_VCS_GIT_OPERATION_TYPE]?: GitOperationType;
16
+ [ATTR_CODE_FUNCTION_NAME]?: string;
17
+ [ATTR_RENOVATE_DATASOURCE]?: string;
18
+ [ATTR_RENOVATE_REGISTRY_URL]?: string;
19
+ [ATTR_RENOVATE_PACKAGE_NAME]?: string;
15
20
  } & Attributes;
16
21
  /**
17
22
  * The instrumentation parameters.
@@ -57,6 +62,18 @@ interface DependencyStatus {
57
62
  total: number;
58
63
  }
59
64
  declare const ATTR_RENOVATE_SPLIT = "renovate.split";
65
+ /**
66
+ * The name of a Renovate datasource (ex: `github-tags`, `npm`, `docker`, etc).
67
+ */
68
+ declare const ATTR_RENOVATE_DATASOURCE = "renovate.datasource";
69
+ /**
70
+ * The registry URL of a registry URL as might be used with a datasource and package name.
71
+ */
72
+ declare const ATTR_RENOVATE_REGISTRY_URL = "renovate.registryUrl";
73
+ /**
74
+ * The package name of a package.
75
+ */
76
+ declare const ATTR_RENOVATE_PACKAGE_NAME = "renovate.packageName";
60
77
  /**
61
78
  * the Git Version Control System (VCS)'s Operation Type
62
79
  *
@@ -72,5 +89,5 @@ declare const ATTR_VCS_GIT_OPERATION_TYPE = "vcs.git.operation.type";
72
89
  * */
73
90
  declare const ATTR_VCS_GIT_SUBCOMMAND = "vcs.git.subcommand";
74
91
  //#endregion
75
- export { ATTR_RENOVATE_SPLIT, ATTR_VCS_GIT_OPERATION_TYPE, ATTR_VCS_GIT_SUBCOMMAND, DependencyStatus, LibYears, LibYearsWithStatus, RenovateSpanAttributes, RenovateSpanOptions, Report, SpanParameters };
92
+ export { ATTR_RENOVATE_DATASOURCE, ATTR_RENOVATE_PACKAGE_NAME, ATTR_RENOVATE_REGISTRY_URL, ATTR_RENOVATE_SPLIT, ATTR_VCS_GIT_OPERATION_TYPE, ATTR_VCS_GIT_SUBCOMMAND, DependencyStatus, LibYears, LibYearsWithStatus, RenovateSpanAttributes, RenovateSpanOptions, Report, SpanParameters };
76
93
  //# sourceMappingURL=types.d.ts.map
@@ -1,6 +1,18 @@
1
1
  //#region lib/instrumentation/types.ts
2
2
  const ATTR_RENOVATE_SPLIT = "renovate.split";
3
3
  /**
4
+ * The name of a Renovate datasource (ex: `github-tags`, `npm`, `docker`, etc).
5
+ */
6
+ const ATTR_RENOVATE_DATASOURCE = "renovate.datasource";
7
+ /**
8
+ * The registry URL of a registry URL as might be used with a datasource and package name.
9
+ */
10
+ const ATTR_RENOVATE_REGISTRY_URL = "renovate.registryUrl";
11
+ /**
12
+ * The package name of a package.
13
+ */
14
+ const ATTR_RENOVATE_PACKAGE_NAME = "renovate.packageName";
15
+ /**
4
16
  * the Git Version Control System (VCS)'s Operation Type
5
17
  *
6
18
  * @see GitOperationType
@@ -15,6 +27,6 @@ const ATTR_VCS_GIT_OPERATION_TYPE = "vcs.git.operation.type";
15
27
  * */
16
28
  const ATTR_VCS_GIT_SUBCOMMAND = "vcs.git.subcommand";
17
29
  //#endregion
18
- export { ATTR_RENOVATE_SPLIT, ATTR_VCS_GIT_OPERATION_TYPE, ATTR_VCS_GIT_SUBCOMMAND };
30
+ export { ATTR_RENOVATE_DATASOURCE, ATTR_RENOVATE_PACKAGE_NAME, ATTR_RENOVATE_REGISTRY_URL, ATTR_RENOVATE_SPLIT, ATTR_VCS_GIT_OPERATION_TYPE, ATTR_VCS_GIT_SUBCOMMAND };
19
31
 
20
32
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../lib/instrumentation/types.ts"],"sourcesContent":["import type { Attributes, SpanKind, SpanOptions } from '@opentelemetry/api';\nimport type { RenovateSplit } from '../config/types.ts';\nimport type { BunyanRecord } from '../logger/types.ts';\nimport type { PackageFile } from '../modules/manager/types.ts';\nimport type { BranchCache } from '../util/cache/repository/types.ts';\nimport type { GitOperationType } from '../util/git/types.ts';\n\nexport type RenovateSpanOptions = {\n attributes?: RenovateSpanAttributes;\n} & SpanOptions;\n\nexport type RenovateSpanAttributes = {\n [ATTR_RENOVATE_SPLIT]?: RenovateSplit;\n [ATTR_VCS_GIT_OPERATION_TYPE]?: GitOperationType;\n} & Attributes;\n\n/**\n * The instrumentation parameters.\n */\nexport interface SpanParameters {\n /**\n * The name of the span\n */\n name: string;\n\n /**\n * Attributes which should be added to the span\n */\n attributes?: RenovateSpanAttributes | undefined;\n\n /**\n * Should this span be added to the root span or to the current active span\n */\n ignoreParentSpan?: boolean;\n\n /**\n * Type of span this represents. Default: SpanKind.Internal\n */\n kind?: SpanKind;\n}\n\nexport interface Report {\n problems: BunyanRecord[];\n repositories: Record<string, RepoReport>;\n}\n\ninterface RepoReport {\n problems: BunyanRecord[];\n branches: Partial<BranchCache>[];\n packageFiles: Record<string, PackageFile[]>;\n libYearsWithStatus?: LibYearsWithStatus;\n}\n\nexport interface LibYearsWithStatus {\n libYears: LibYears;\n dependencyStatus: DependencyStatus;\n}\n\nexport interface LibYears {\n total: number;\n managers: Record<string, number>;\n}\n\nexport interface DependencyStatus {\n outdated: number;\n total: number;\n}\n\nexport const ATTR_RENOVATE_SPLIT = 'renovate.split';\n\n/**\n * the Git Version Control System (VCS)'s Operation Type\n *\n * @see GitOperationType\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/vcs/\n *\n */\nexport const ATTR_VCS_GIT_OPERATION_TYPE = 'vcs.git.operation.type';\n\n/**\n * the Git Version Control System (VCS)'s subcommand\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/vcs/\n * */\nexport const ATTR_VCS_GIT_SUBCOMMAND = 'vcs.git.subcommand';\n"],"mappings":";AAoEA,MAAa,sBAAsB;;;;;;;;AASnC,MAAa,8BAA8B;;;;;;AAO3C,MAAa,0BAA0B"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../lib/instrumentation/types.ts"],"sourcesContent":["import type { Attributes, SpanKind, SpanOptions } from '@opentelemetry/api';\nimport type { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport type { RenovateSplit } from '../config/types.ts';\nimport type { BunyanRecord } from '../logger/types.ts';\nimport type { PackageFile } from '../modules/manager/types.ts';\nimport type { BranchCache } from '../util/cache/repository/types.ts';\nimport type { GitOperationType } from '../util/git/types.ts';\n\nexport type RenovateSpanOptions = {\n attributes?: RenovateSpanAttributes;\n} & SpanOptions;\n\nexport type RenovateSpanAttributes = {\n [ATTR_RENOVATE_SPLIT]?: RenovateSplit;\n [ATTR_VCS_GIT_OPERATION_TYPE]?: GitOperationType;\n [ATTR_CODE_FUNCTION_NAME]?: string;\n [ATTR_RENOVATE_DATASOURCE]?: string;\n [ATTR_RENOVATE_REGISTRY_URL]?: string;\n [ATTR_RENOVATE_PACKAGE_NAME]?: string;\n} & Attributes;\n\n/**\n * The instrumentation parameters.\n */\nexport interface SpanParameters {\n /**\n * The name of the span\n */\n name: string;\n\n /**\n * Attributes which should be added to the span\n */\n attributes?: RenovateSpanAttributes | undefined;\n\n /**\n * Should this span be added to the root span or to the current active span\n */\n ignoreParentSpan?: boolean;\n\n /**\n * Type of span this represents. Default: SpanKind.Internal\n */\n kind?: SpanKind;\n}\n\nexport interface Report {\n problems: BunyanRecord[];\n repositories: Record<string, RepoReport>;\n}\n\ninterface RepoReport {\n problems: BunyanRecord[];\n branches: Partial<BranchCache>[];\n packageFiles: Record<string, PackageFile[]>;\n libYearsWithStatus?: LibYearsWithStatus;\n}\n\nexport interface LibYearsWithStatus {\n libYears: LibYears;\n dependencyStatus: DependencyStatus;\n}\n\nexport interface LibYears {\n total: number;\n managers: Record<string, number>;\n}\n\nexport interface DependencyStatus {\n outdated: number;\n total: number;\n}\n\nexport const ATTR_RENOVATE_SPLIT = 'renovate.split';\n\n/**\n * The name of a Renovate datasource (ex: `github-tags`, `npm`, `docker`, etc).\n */\nexport const ATTR_RENOVATE_DATASOURCE = 'renovate.datasource';\n\n/**\n * The registry URL of a registry URL as might be used with a datasource and package name.\n */\nexport const ATTR_RENOVATE_REGISTRY_URL = 'renovate.registryUrl';\n\n/**\n * The package name of a package.\n */\nexport const ATTR_RENOVATE_PACKAGE_NAME = 'renovate.packageName';\n\n/**\n * the Git Version Control System (VCS)'s Operation Type\n *\n * @see GitOperationType\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/vcs/\n *\n */\nexport const ATTR_VCS_GIT_OPERATION_TYPE = 'vcs.git.operation.type';\n\n/**\n * the Git Version Control System (VCS)'s subcommand\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/vcs/\n * */\nexport const ATTR_VCS_GIT_SUBCOMMAND = 'vcs.git.subcommand';\n"],"mappings":";AAyEA,MAAa,sBAAsB;;;;AAKnC,MAAa,2BAA2B;;;;AAKxC,MAAa,6BAA6B;;;;AAK1C,MAAa,6BAA6B;;;;;;;;AAS1C,MAAa,8BAA8B;;;;;;AAO3C,MAAa,0BAA0B"}
@@ -7,6 +7,8 @@ import { trimTrailingSlash } from "../../util/url.js";
7
7
  import { coerceArray } from "../../util/array.js";
8
8
  import { ExternalHostError } from "../../types/errors/external-host-error.js";
9
9
  import { DatasourceCacheStats } from "../../util/stats.js";
10
+ import { ATTR_RENOVATE_DATASOURCE, ATTR_RENOVATE_PACKAGE_NAME, ATTR_RENOVATE_REGISTRY_URL } from "../../instrumentation/types.js";
11
+ import { instrument } from "../../instrumentation/index.js";
10
12
  import { get as get$1, set as set$1 } from "../../util/cache/package/index.js";
11
13
  import { AsyncResult, Result } from "../../util/result.js";
12
14
  import { resolveRegistryUrl, setNpmrc } from "./npm/npmrc.js";
@@ -18,6 +20,7 @@ import api from "./api.js";
18
20
  import { applyConstraintsFiltering, applyExtractVersion, applyVersionCompatibility, filterValidVersions, getDatasourceFor, isGetPkgReleasesConfig, sortAndRemoveDuplicates } from "./common.js";
19
21
  import { dequal } from "dequal";
20
22
  import { isFunction, isNonEmptyArray, isString } from "@sindresorhus/is";
23
+ import { ATTR_CODE_FUNCTION_NAME } from "@opentelemetry/semantic-conventions";
21
24
  //#region lib/modules/datasource/index.ts
22
25
  const getDatasources = () => api;
23
26
  const getDatasourceList = () => Array.from(api.keys());
@@ -59,10 +62,15 @@ async function getRegistryReleases(datasource, config, registryUrl) {
59
62
  }
60
63
  DatasourceCacheStats.miss(datasource.id, registryUrl, config.packageName);
61
64
  }
62
- const res = await datasource.getReleases({
65
+ const res = await instrument("getReleases", () => datasource.getReleases({
63
66
  ...config,
64
67
  registryUrl
65
- });
68
+ }), { attributes: {
69
+ [ATTR_CODE_FUNCTION_NAME]: "getReleases",
70
+ [ATTR_RENOVATE_DATASOURCE]: datasource.id,
71
+ [ATTR_RENOVATE_REGISTRY_URL]: registryUrl,
72
+ [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName
73
+ } });
66
74
  if (res?.releases.length) res.registryUrl ??= registryUrl;
67
75
  if (!res) return null;
68
76
  let cache = false;
@@ -211,7 +219,12 @@ async function fetchReleases(config) {
211
219
  if (registryStrategy === "first") dep = await firstRegistry(config, datasource, registryUrls);
212
220
  else if (registryStrategy === "hunt") dep = await huntRegistries(config, datasource, registryUrls);
213
221
  else if (registryStrategy === "merge") dep = await mergeRegistries(config, datasource, registryUrls);
214
- } else dep = await datasource.getReleases(config);
222
+ } else dep = await instrument("getReleases", () => datasource.getReleases(config), { attributes: {
223
+ [ATTR_CODE_FUNCTION_NAME]: "getReleases",
224
+ [ATTR_RENOVATE_DATASOURCE]: datasource.id,
225
+ [ATTR_RENOVATE_REGISTRY_URL]: config.registryUrl ?? "",
226
+ [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName
227
+ } });
215
228
  } catch (err) {
216
229
  if (err.message === "host-disabled" || err.err?.message === "host-disabled") return null;
217
230
  if (err instanceof ExternalHostError) throw err;
@@ -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 { isFunction, isNonEmptyArray, isString } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport * as packageCache from '../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport { clone } from '../../util/clone.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { AsyncResult, Result } from '../../util/result.ts';\nimport { DatasourceCacheStats } from '../../util/stats.ts';\nimport { trimTrailingSlash } from '../../util/url.ts';\nimport * as versioning from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport {\n applyConstraintsFiltering,\n applyExtractVersion,\n applyVersionCompatibility,\n filterValidVersions,\n getDatasourceFor,\n sortAndRemoveDuplicates,\n} from './common.ts';\nimport { addMetaData } from './metadata.ts';\nimport { setNpmrc } from './npm/index.ts';\nimport { resolveRegistryUrl } from './npm/npmrc.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetDigestInputConfig,\n GetPkgReleasesConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport { isGetPkgReleasesConfig } from './common.ts';\nexport * from './types.ts';\n\nexport const getDatasources = (): Map<string, DatasourceApi> => datasources;\nexport const getDatasourceList = (): string[] => Array.from(datasources.keys());\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', false); // 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 datasource.getReleases({ ...config, registryUrl });\n if (res?.releases.length) {\n res.registryUrl ??= registryUrl;\n }\n\n if (!res) {\n return null;\n }\n\n let cache = false;\n if (cacheForced) {\n cache = true;\n } else if (cacheEnabled && !res.isPrivate) {\n cache = true;\n }\n\n if (cache) {\n logger.trace({ cacheKey }, 'Caching datasource response');\n await packageCache.set(cacheNamespace, cacheKey, res, 15);\n DatasourceCacheStats.set(datasource.id, registryUrl, config.packageName);\n } else {\n DatasourceCacheStats.skip(datasource.id, registryUrl, config.packageName);\n }\n\n return res;\n}\n\nfunction firstRegistry(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n if (registryUrls.length > 1) {\n logger.warn(\n {\n datasource: datasource.id,\n packageName: config.packageName,\n registryUrls,\n },\n 'Excess registryUrls found for datasource lookup - using first configured only',\n );\n }\n const registryUrl = registryUrls[0];\n return getRegistryReleases(datasource, config, registryUrl);\n}\n\nasync function huntRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let res: ReleaseResult | null = null;\n let caughtError: Error | undefined;\n for (const registryUrl of registryUrls) {\n try {\n res = await getRegistryReleases(datasource, config, registryUrl);\n if (res) {\n break;\n }\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // We'll always save the last-thrown error\n caughtError = err;\n logger.trace({ err }, 'datasource hunt failure');\n }\n }\n if (res) {\n return res;\n }\n if (caughtError) {\n throw caughtError;\n }\n return null;\n}\n\nasync function mergeRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let combinedRes: ReleaseResult | undefined;\n let lastErr: Error | undefined;\n let singleRegistry = true;\n const releaseVersioning = versioning.get(config.versioning);\n for (const registryUrl of registryUrls) {\n try {\n const res = await getRegistryReleases(datasource, config, registryUrl);\n if (!res) {\n continue;\n }\n\n if (!combinedRes) {\n // This is the first registry, so we can just use it and continue\n combinedRes = res;\n continue;\n }\n\n if (singleRegistry) {\n // This is the second registry\n // We need to move the registryUrl from the package level to the release level\n for (const release of coerceArray(combinedRes.releases)) {\n release.registryUrl ??= combinedRes.registryUrl;\n }\n singleRegistry = false;\n }\n\n const releases = coerceArray(res.releases);\n for (const release of releases) {\n // We have more than one registry, so we need to move the registryUrl\n // from the package level to the release level before merging\n release.registryUrl ??= res.registryUrl;\n }\n\n combinedRes.releases.push(...releases);\n\n // Merge the tags from the two results\n let tags = combinedRes.tags;\n if (tags) {\n if (res.tags) {\n // Both results had tags, so we need to compare them\n for (const tag of ['release', 'latest']) {\n const existingTag = combinedRes?.tags?.[tag];\n const newTag = res.tags?.[tag];\n if (isString(newTag) && releaseVersioning.isVersion(newTag)) {\n if (\n isString(existingTag) &&\n releaseVersioning.isVersion(existingTag)\n ) {\n // We need to compare them\n if (releaseVersioning.isGreaterThan(newTag, existingTag)) {\n // New tag is greater than the existing one\n tags[tag] = newTag;\n }\n } else {\n // Existing tag was not present or not a version\n // so we can just use the new one\n tags[tag] = newTag;\n }\n }\n }\n }\n } else {\n // Existing results had no tags, so we can just use the new ones\n tags = res.tags;\n }\n combinedRes = { ...res, ...combinedRes };\n if (tags) {\n combinedRes.tags = tags;\n }\n // Remove the registryUrl from the package level when more than one registry\n delete combinedRes.registryUrl;\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n\n lastErr = err;\n logger.trace({ err }, 'datasource merge failure');\n }\n }\n\n if (!combinedRes) {\n if (lastErr) {\n throw lastErr;\n }\n\n return null;\n }\n\n const seenVersions = new Set<string>();\n combinedRes.releases = filterMap(combinedRes.releases, (release) => {\n if (seenVersions.has(release.version)) {\n return null;\n }\n seenVersions.add(release.version);\n return release;\n });\n\n return combinedRes;\n}\n\nfunction massageRegistryUrls(registryUrls: string[]): string[] {\n return registryUrls.filter(Boolean).map(trimTrailingSlash);\n}\n\nfunction resolveRegistryUrls(\n datasource: DatasourceApi,\n defaultRegistryUrls: string[] | undefined,\n registryUrls: string[] | undefined | null,\n additionalRegistryUrls: string[] | undefined,\n): string[] {\n if (!datasource.customRegistrySupport) {\n if (\n isNonEmptyArray(registryUrls) ||\n isNonEmptyArray(defaultRegistryUrls) ||\n isNonEmptyArray(additionalRegistryUrls)\n ) {\n logger.warn(\n {\n datasource: datasource.id,\n registryUrls,\n defaultRegistryUrls,\n additionalRegistryUrls,\n },\n 'Custom registries are not allowed for this datasource and will be ignored',\n );\n }\n return isFunction(datasource.defaultRegistryUrls)\n ? datasource.defaultRegistryUrls()\n : (datasource.defaultRegistryUrls ?? []);\n }\n const customUrls = registryUrls?.filter(Boolean);\n let resolvedUrls: string[] = [];\n if (isNonEmptyArray(customUrls)) {\n resolvedUrls = [...customUrls];\n } else if (isNonEmptyArray(defaultRegistryUrls)) {\n resolvedUrls = [...defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isFunction(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls()];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isNonEmptyArray(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n }\n return massageRegistryUrls(resolvedUrls);\n}\n\nfunction applyReplacements(\n config: GetReleasesInternalConfig,\n): Pick<ReleaseResult, 'replacementName' | 'replacementVersion'> | undefined {\n if (config.replacementName && config.replacementVersion) {\n return {\n replacementName: config.replacementName,\n replacementVersion: config.replacementVersion,\n };\n }\n return undefined;\n}\n\nasync function fetchReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let { registryUrls } = config;\n // istanbul ignore if: need test\n if (!datasourceName || getDatasourceFor(datasourceName) === undefined) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n if (datasourceName === 'npm') {\n if (isString(config.npmrc)) {\n setNpmrc(config.npmrc);\n }\n if (!isNonEmptyArray(registryUrls)) {\n registryUrls = [resolveRegistryUrl(config.packageName)];\n }\n }\n const datasource = getDatasourceFor(datasourceName);\n // istanbul ignore if: needs test\n if (!datasource) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n registryUrls = resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n registryUrls,\n config.additionalRegistryUrls,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy ?? 'hunt';\n try {\n if (isNonEmptyArray(registryUrls)) {\n if (registryStrategy === 'first') {\n dep = await firstRegistry(config, datasource, registryUrls);\n } else if (registryStrategy === 'hunt') {\n dep = await huntRegistries(config, datasource, registryUrls);\n } else if (registryStrategy === 'merge') {\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await datasource.getReleases(config);\n }\n } catch (err) {\n if (err.message === HOST_DISABLED || err.err?.message === HOST_DISABLED) {\n return null;\n }\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logError(datasource.id, config.packageName, err);\n }\n if (!dep || dequal(dep, { releases: [] })) {\n return null;\n }\n addMetaData(dep, datasourceName, config.packageName);\n dep = { ...dep, ...applyReplacements(config) };\n return dep;\n}\n\nfunction fetchCachedReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource, packageName, registryUrls } = config;\n const cacheKey = `datasource-mem:releases:${datasource}:${packageName}:${config.registryStrategy}:${String(\n registryUrls,\n )}`;\n // By returning a Promise and reusing it, we should only fetch each package at most once\n const cachedResult = memCache.get<Promise<ReleaseResult | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = fetchReleases(config);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function getRawPkgReleases(\n config: GetPkgReleasesConfig,\n): AsyncResult<\n ReleaseResult,\n Error | 'no-datasource' | 'no-package-name' | 'no-result'\n> {\n if (!config.datasource) {\n logger.warn('No datasource found');\n return AsyncResult.err('no-datasource');\n }\n\n const packageName = config.packageName;\n if (!packageName) {\n logger.error({ config }, 'Datasource getReleases without packageName');\n return AsyncResult.err('no-package-name');\n }\n\n return Result.wrapNullable(fetchCachedReleases(config), 'no-result' as const)\n .catch((e) => {\n if (e instanceof ExternalHostError) {\n e.hostType = config.datasource;\n e.packageName = packageName;\n }\n return Result.err(e);\n })\n .transform(clone);\n}\n\nexport function applyDatasourceFilters(\n releaseResult: ReleaseResult,\n config: GetPkgReleasesConfig,\n): ReleaseResult {\n let res = releaseResult;\n res = applyExtractVersion(res, config.extractVersion);\n res = applyVersionCompatibility(\n res,\n config.versionCompatibility,\n config.currentCompatibility,\n );\n res = filterValidVersions(res, config);\n res = sortAndRemoveDuplicates(res, config);\n res = applyConstraintsFiltering(res, config);\n return res;\n}\n\nexport async function getPkgReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { val = null, err } = await getRawPkgReleases(config)\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (err instanceof Error) {\n throw err;\n }\n\n return val;\n}\n\nexport function supportsDigests(datasource: string | undefined): boolean {\n const ds = !!datasource && getDatasourceFor(datasource);\n return !!ds && 'getDigest' in ds;\n}\n\nfunction getDigestConfig(\n datasource: DatasourceApi,\n config: GetDigestInputConfig,\n): DigestConfig {\n const { lookupName, currentValue, currentDigest } = config;\n const packageName = config.replacementName ?? config.packageName;\n // Prefer registryUrl from getReleases() lookup if it has been passed\n const registryUrl =\n config.registryUrl ??\n resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n config.registryUrls,\n config.additionalRegistryUrls,\n )[0];\n return { lookupName, packageName, registryUrl, currentValue, currentDigest };\n}\n\nexport function getDigest(\n config: GetDigestInputConfig,\n value?: string,\n): Promise<string | null> {\n const datasource = getDatasourceFor(config.datasource);\n // istanbul ignore if: need test\n if (!datasource || !('getDigest' in datasource)) {\n return Promise.resolve(null);\n }\n const digestConfig = getDigestConfig(datasource, config);\n return datasource.getDigest!(digestConfig, value);\n}\n\nexport function getDefaultConfig(\n datasource: string,\n): Promise<Record<string, unknown>> {\n const loadedDatasource = getDatasourceFor(datasource);\n return Promise.resolve<Record<string, unknown>>(\n loadedDatasource?.defaultConfig ?? Object.create({}),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["datasources","packageCache.get","packageCache.set","versioning.get","memCache.get"],"sources":["../../../lib/modules/datasource/index.ts"],"sourcesContent":["import { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport { isFunction, isNonEmptyArray, isString } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport {\n ATTR_RENOVATE_DATASOURCE,\n ATTR_RENOVATE_PACKAGE_NAME,\n ATTR_RENOVATE_REGISTRY_URL,\n} from '../../instrumentation/types.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport * as packageCache from '../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport { clone } from '../../util/clone.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { AsyncResult, Result } from '../../util/result.ts';\nimport { DatasourceCacheStats } from '../../util/stats.ts';\nimport { trimTrailingSlash } from '../../util/url.ts';\nimport * as versioning from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport {\n applyConstraintsFiltering,\n applyExtractVersion,\n applyVersionCompatibility,\n filterValidVersions,\n getDatasourceFor,\n sortAndRemoveDuplicates,\n} from './common.ts';\nimport { addMetaData } from './metadata.ts';\nimport { setNpmrc } from './npm/index.ts';\nimport { resolveRegistryUrl } from './npm/npmrc.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetDigestInputConfig,\n GetPkgReleasesConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport { isGetPkgReleasesConfig } from './common.ts';\nexport * from './types.ts';\n\nexport const getDatasources = (): Map<string, DatasourceApi> => datasources;\nexport const getDatasourceList = (): string[] => Array.from(datasources.keys());\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', false); // tells if caching is forced via admin config\n\n if (cacheEnabled || cacheForced) {\n const cachedResult = await packageCache.get<ReleaseResult>(\n cacheNamespace,\n cacheKey,\n );\n\n if (cachedResult) {\n logger.trace({ cacheKey }, 'Returning cached datasource response');\n DatasourceCacheStats.hit(datasource.id, registryUrl, config.packageName);\n return cachedResult;\n }\n\n DatasourceCacheStats.miss(datasource.id, registryUrl, config.packageName);\n }\n\n const res = await instrument(\n 'getReleases',\n () => datasource.getReleases({ ...config, registryUrl }),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: registryUrl,\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n if (res?.releases.length) {\n res.registryUrl ??= registryUrl;\n }\n\n if (!res) {\n return null;\n }\n\n let cache = false;\n if (cacheForced) {\n cache = true;\n } else if (cacheEnabled && !res.isPrivate) {\n cache = true;\n }\n\n if (cache) {\n logger.trace({ cacheKey }, 'Caching datasource response');\n await packageCache.set(cacheNamespace, cacheKey, res, 15);\n DatasourceCacheStats.set(datasource.id, registryUrl, config.packageName);\n } else {\n DatasourceCacheStats.skip(datasource.id, registryUrl, config.packageName);\n }\n\n return res;\n}\n\nfunction firstRegistry(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n if (registryUrls.length > 1) {\n logger.warn(\n {\n datasource: datasource.id,\n packageName: config.packageName,\n registryUrls,\n },\n 'Excess registryUrls found for datasource lookup - using first configured only',\n );\n }\n const registryUrl = registryUrls[0];\n return getRegistryReleases(datasource, config, registryUrl);\n}\n\nasync function huntRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let res: ReleaseResult | null = null;\n let caughtError: Error | undefined;\n for (const registryUrl of registryUrls) {\n try {\n res = await getRegistryReleases(datasource, config, registryUrl);\n if (res) {\n break;\n }\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // We'll always save the last-thrown error\n caughtError = err;\n logger.trace({ err }, 'datasource hunt failure');\n }\n }\n if (res) {\n return res;\n }\n if (caughtError) {\n throw caughtError;\n }\n return null;\n}\n\nasync function mergeRegistries(\n config: GetReleasesInternalConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let combinedRes: ReleaseResult | undefined;\n let lastErr: Error | undefined;\n let singleRegistry = true;\n const releaseVersioning = versioning.get(config.versioning);\n for (const registryUrl of registryUrls) {\n try {\n const res = await getRegistryReleases(datasource, config, registryUrl);\n if (!res) {\n continue;\n }\n\n if (!combinedRes) {\n // This is the first registry, so we can just use it and continue\n combinedRes = res;\n continue;\n }\n\n if (singleRegistry) {\n // This is the second registry\n // We need to move the registryUrl from the package level to the release level\n for (const release of coerceArray(combinedRes.releases)) {\n release.registryUrl ??= combinedRes.registryUrl;\n }\n singleRegistry = false;\n }\n\n const releases = coerceArray(res.releases);\n for (const release of releases) {\n // We have more than one registry, so we need to move the registryUrl\n // from the package level to the release level before merging\n release.registryUrl ??= res.registryUrl;\n }\n\n combinedRes.releases.push(...releases);\n\n // Merge the tags from the two results\n let tags = combinedRes.tags;\n if (tags) {\n if (res.tags) {\n // Both results had tags, so we need to compare them\n for (const tag of ['release', 'latest']) {\n const existingTag = combinedRes?.tags?.[tag];\n const newTag = res.tags?.[tag];\n if (isString(newTag) && releaseVersioning.isVersion(newTag)) {\n if (\n isString(existingTag) &&\n releaseVersioning.isVersion(existingTag)\n ) {\n // We need to compare them\n if (releaseVersioning.isGreaterThan(newTag, existingTag)) {\n // New tag is greater than the existing one\n tags[tag] = newTag;\n }\n } else {\n // Existing tag was not present or not a version\n // so we can just use the new one\n tags[tag] = newTag;\n }\n }\n }\n }\n } else {\n // Existing results had no tags, so we can just use the new ones\n tags = res.tags;\n }\n combinedRes = { ...res, ...combinedRes };\n if (tags) {\n combinedRes.tags = tags;\n }\n // Remove the registryUrl from the package level when more than one registry\n delete combinedRes.registryUrl;\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n\n lastErr = err;\n logger.trace({ err }, 'datasource merge failure');\n }\n }\n\n if (!combinedRes) {\n if (lastErr) {\n throw lastErr;\n }\n\n return null;\n }\n\n const seenVersions = new Set<string>();\n combinedRes.releases = filterMap(combinedRes.releases, (release) => {\n if (seenVersions.has(release.version)) {\n return null;\n }\n seenVersions.add(release.version);\n return release;\n });\n\n return combinedRes;\n}\n\nfunction massageRegistryUrls(registryUrls: string[]): string[] {\n return registryUrls.filter(Boolean).map(trimTrailingSlash);\n}\n\nfunction resolveRegistryUrls(\n datasource: DatasourceApi,\n defaultRegistryUrls: string[] | undefined,\n registryUrls: string[] | undefined | null,\n additionalRegistryUrls: string[] | undefined,\n): string[] {\n if (!datasource.customRegistrySupport) {\n if (\n isNonEmptyArray(registryUrls) ||\n isNonEmptyArray(defaultRegistryUrls) ||\n isNonEmptyArray(additionalRegistryUrls)\n ) {\n logger.warn(\n {\n datasource: datasource.id,\n registryUrls,\n defaultRegistryUrls,\n additionalRegistryUrls,\n },\n 'Custom registries are not allowed for this datasource and will be ignored',\n );\n }\n return isFunction(datasource.defaultRegistryUrls)\n ? datasource.defaultRegistryUrls()\n : (datasource.defaultRegistryUrls ?? []);\n }\n const customUrls = registryUrls?.filter(Boolean);\n let resolvedUrls: string[] = [];\n if (isNonEmptyArray(customUrls)) {\n resolvedUrls = [...customUrls];\n } else if (isNonEmptyArray(defaultRegistryUrls)) {\n resolvedUrls = [...defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isFunction(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls()];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n } else if (isNonEmptyArray(datasource.defaultRegistryUrls)) {\n resolvedUrls = [...datasource.defaultRegistryUrls];\n resolvedUrls = resolvedUrls.concat(additionalRegistryUrls ?? []);\n }\n return massageRegistryUrls(resolvedUrls);\n}\n\nfunction applyReplacements(\n config: GetReleasesInternalConfig,\n): Pick<ReleaseResult, 'replacementName' | 'replacementVersion'> | undefined {\n if (config.replacementName && config.replacementVersion) {\n return {\n replacementName: config.replacementName,\n replacementVersion: config.replacementVersion,\n };\n }\n return undefined;\n}\n\nasync function fetchReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let { registryUrls } = config;\n // istanbul ignore if: need test\n if (!datasourceName || getDatasourceFor(datasourceName) === undefined) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n if (datasourceName === 'npm') {\n if (isString(config.npmrc)) {\n setNpmrc(config.npmrc);\n }\n if (!isNonEmptyArray(registryUrls)) {\n registryUrls = [resolveRegistryUrl(config.packageName)];\n }\n }\n const datasource = getDatasourceFor(datasourceName);\n // istanbul ignore if: needs test\n if (!datasource) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n registryUrls = resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n registryUrls,\n config.additionalRegistryUrls,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy ?? 'hunt';\n try {\n if (isNonEmptyArray(registryUrls)) {\n if (registryStrategy === 'first') {\n dep = await firstRegistry(config, datasource, registryUrls);\n } else if (registryStrategy === 'hunt') {\n dep = await huntRegistries(config, datasource, registryUrls);\n } else if (registryStrategy === 'merge') {\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await instrument(\n 'getReleases',\n () => datasource.getReleases(config),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: config.registryUrl ?? '',\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n }\n } catch (err) {\n if (err.message === HOST_DISABLED || err.err?.message === HOST_DISABLED) {\n return null;\n }\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logError(datasource.id, config.packageName, err);\n }\n if (!dep || dequal(dep, { releases: [] })) {\n return null;\n }\n addMetaData(dep, datasourceName, config.packageName);\n dep = { ...dep, ...applyReplacements(config) };\n return dep;\n}\n\nfunction fetchCachedReleases(\n config: GetReleasesInternalConfig,\n): Promise<ReleaseResult | null> {\n const { datasource, packageName, registryUrls } = config;\n const cacheKey = `datasource-mem:releases:${datasource}:${packageName}:${config.registryStrategy}:${String(\n registryUrls,\n )}`;\n // By returning a Promise and reusing it, we should only fetch each package at most once\n const cachedResult = memCache.get<Promise<ReleaseResult | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = fetchReleases(config);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function getRawPkgReleases(\n config: GetPkgReleasesConfig,\n): AsyncResult<\n ReleaseResult,\n Error | 'no-datasource' | 'no-package-name' | 'no-result'\n> {\n if (!config.datasource) {\n logger.warn('No datasource found');\n return AsyncResult.err('no-datasource');\n }\n\n const packageName = config.packageName;\n if (!packageName) {\n logger.error({ config }, 'Datasource getReleases without packageName');\n return AsyncResult.err('no-package-name');\n }\n\n return Result.wrapNullable(fetchCachedReleases(config), 'no-result' as const)\n .catch((e) => {\n if (e instanceof ExternalHostError) {\n e.hostType = config.datasource;\n e.packageName = packageName;\n }\n return Result.err(e);\n })\n .transform(clone);\n}\n\nexport function applyDatasourceFilters(\n releaseResult: ReleaseResult,\n config: GetPkgReleasesConfig,\n): ReleaseResult {\n let res = releaseResult;\n res = applyExtractVersion(res, config.extractVersion);\n res = applyVersionCompatibility(\n res,\n config.versionCompatibility,\n config.currentCompatibility,\n );\n res = filterValidVersions(res, config);\n res = sortAndRemoveDuplicates(res, config);\n res = applyConstraintsFiltering(res, config);\n return res;\n}\n\nexport async function getPkgReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { val = null, err } = await getRawPkgReleases(config)\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (err instanceof Error) {\n throw err;\n }\n\n return val;\n}\n\nexport function supportsDigests(datasource: string | undefined): boolean {\n const ds = !!datasource && getDatasourceFor(datasource);\n return !!ds && 'getDigest' in ds;\n}\n\nfunction getDigestConfig(\n datasource: DatasourceApi,\n config: GetDigestInputConfig,\n): DigestConfig {\n const { lookupName, currentValue, currentDigest } = config;\n const packageName = config.replacementName ?? config.packageName;\n // Prefer registryUrl from getReleases() lookup if it has been passed\n const registryUrl =\n config.registryUrl ??\n resolveRegistryUrls(\n datasource,\n config.defaultRegistryUrls,\n config.registryUrls,\n config.additionalRegistryUrls,\n )[0];\n return { lookupName, packageName, registryUrl, currentValue, currentDigest };\n}\n\nexport function getDigest(\n config: GetDigestInputConfig,\n value?: string,\n): Promise<string | null> {\n const datasource = getDatasourceFor(config.datasource);\n // istanbul ignore if: need test\n if (!datasource || !('getDigest' in datasource)) {\n return Promise.resolve(null);\n }\n const digestConfig = getDigestConfig(datasource, config);\n return datasource.getDigest!(digestConfig, value);\n}\n\nexport function getDefaultConfig(\n datasource: string,\n): Promise<Record<string, unknown>> {\n const loadedDatasource = getDatasourceFor(datasource);\n return Promise.resolve<Record<string, unknown>>(\n loadedDatasource?.defaultConfig ?? Object.create({}),\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { GetDatasourceReleasesStats } from "../../util/stats.js";
2
+ import { ATTR_RENOVATE_DATASOURCE, ATTR_RENOVATE_PACKAGE_NAME } from "../../instrumentation/types.js";
3
+ import { ATTR_CODE_FUNCTION_NAME } from "@opentelemetry/semantic-conventions";
4
+ //#region lib/modules/datasource/span-processor.ts
5
+ var GetDatasourceReleasesSpanProcessor = class {
6
+ forceFlush() {
7
+ return Promise.resolve();
8
+ }
9
+ onStart(_span, _parentContext) {}
10
+ onEnd(span) {
11
+ if (!span.ended) return;
12
+ if (span.attributes[ATTR_CODE_FUNCTION_NAME] !== "getReleases") return;
13
+ const datasource = span.attributes[ATTR_RENOVATE_DATASOURCE];
14
+ const registryUrl = span.attributes["renovate.registryUrl"] ?? "";
15
+ const packageName = span.attributes[ATTR_RENOVATE_PACKAGE_NAME];
16
+ if (!datasource || !packageName) return;
17
+ const durationMs = span.duration[0] * 1e3 + span.duration[1] / 1e6;
18
+ GetDatasourceReleasesStats.write(datasource, registryUrl, packageName, durationMs);
19
+ }
20
+ shutdown() {
21
+ return Promise.resolve();
22
+ }
23
+ };
24
+ //#endregion
25
+ export { GetDatasourceReleasesSpanProcessor };
26
+
27
+ //# sourceMappingURL=span-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-processor.js","names":[],"sources":["../../../lib/modules/datasource/span-processor.ts"],"sourcesContent":["import type { Context } from '@opentelemetry/api';\nimport type {\n ReadableSpan,\n Span,\n SpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\nimport { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_RENOVATE_DATASOURCE,\n ATTR_RENOVATE_PACKAGE_NAME,\n ATTR_RENOVATE_REGISTRY_URL,\n} from '../../instrumentation/types.ts';\nimport { GetDatasourceReleasesStats } from '../../util/stats.ts';\n\nexport class GetDatasourceReleasesSpanProcessor implements SpanProcessor {\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n\n onStart(_span: Span, _parentContext: Context): void {\n // no implementation\n }\n\n onEnd(span: ReadableSpan): void {\n if (!span.ended) {\n return;\n }\n\n if (span.attributes[ATTR_CODE_FUNCTION_NAME] !== 'getReleases') {\n return;\n }\n\n const datasource = span.attributes[ATTR_RENOVATE_DATASOURCE] as string;\n const registryUrl = (span.attributes[ATTR_RENOVATE_REGISTRY_URL] ??\n '') as string;\n const packageName = span.attributes[ATTR_RENOVATE_PACKAGE_NAME] as string;\n\n if (!datasource || !packageName) {\n return;\n }\n\n // duration[0] is seconds, duration[1] is nanoseconds.\n const durationMs = span.duration[0] * 1000 + span.duration[1] / 1_000_000;\n\n GetDatasourceReleasesStats.write(\n datasource,\n registryUrl,\n packageName,\n durationMs,\n );\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n}\n"],"mappings":";;;;AAcA,IAAa,qCAAb,MAAyE;CACvE,aAA4B;AAC1B,SAAO,QAAQ,SAAS;;CAG1B,QAAQ,OAAa,gBAA+B;CAIpD,MAAM,MAA0B;AAC9B,MAAI,CAAC,KAAK,MACR;AAGF,MAAI,KAAK,WAAW,6BAA6B,cAC/C;EAGF,MAAM,aAAa,KAAK,WAAW;EACnC,MAAM,cAAe,KAAK,WAAA,2BACxB;EACF,MAAM,cAAc,KAAK,WAAW;AAEpC,MAAI,CAAC,cAAc,CAAC,YAClB;EAIF,MAAM,aAAa,KAAK,SAAS,KAAK,MAAO,KAAK,SAAS,KAAK;AAEhE,6BAA2B,MACzB,YACA,aACA,aACA,WACD;;CAGH,WAA0B;AACxB,SAAO,QAAQ,SAAS"}
@@ -82,13 +82,15 @@ async function walkNodeInOrder(node, packageFile, content, visitedFiles, allProp
82
82
  else logger.debug(`ant manager: could not read properties file ${propFilePath}`);
83
83
  }
84
84
  }
85
- } else if (child.name === "dependency") {
85
+ } else if (child.name === "import" && child.attr.file) await walkXmlFile(upath.normalize(upath.join(baseDir, child.attr.file)), visitedFiles, allProps, allRawDeps);
86
+ else if (child.name === "dependency") {
86
87
  const rawDep = collectDependency(child, packageFile, content);
87
88
  if (rawDep) allRawDeps.push(rawDep);
88
89
  } else await walkNodeInOrder(child, packageFile, content, visitedFiles, allProps, allRawDeps);
89
90
  }
90
91
  }
91
92
  async function walkXmlFile(packageFile, visitedFiles, allProps, allRawDeps) {
93
+ if (visitedFiles.has(packageFile)) return;
92
94
  visitedFiles.add(packageFile);
93
95
  const content = await readLocalFile(packageFile, "utf8");
94
96
  if (!content) {
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/ant/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport type { XmlElement } from 'xmldoc';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { MavenDatasource } from '../../datasource/maven/index.ts';\nimport { isXmlElement } from '../nuget/util.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n PackageFileContent,\n} from '../types.ts';\nimport {\n applyProps,\n findAttrValuePosition,\n parsePropertiesFile,\n resolveChainedProps,\n} from './properties.ts';\nimport type { AntProp } from './types.ts';\n\nexport { parsePropertiesFile } from './properties.ts';\n\nconst scopeNames = new Set([\n 'compile',\n 'runtime',\n 'test',\n 'provided',\n 'system',\n]);\n\nfunction getDependencyType(scope: string | undefined): string {\n if (scope && scopeNames.has(scope)) {\n return scope;\n }\n return 'compile';\n}\n\ninterface RawDep {\n dep: PackageDependency;\n depPackageFile: string;\n}\n\nfunction collectDependency(\n node: XmlElement,\n packageFile: string,\n content: string,\n): RawDep | null {\n const { groupId, artifactId, version, scope } = node.attr;\n\n if (!version || !groupId || !artifactId) {\n return null;\n }\n\n const dep: PackageDependency = {\n datasource: MavenDatasource.id,\n depName: `${groupId}:${artifactId}`,\n currentValue: version,\n depType: getDependencyType(scope),\n registryUrls: [],\n };\n\n dep.fileReplacePosition = findAttrValuePosition(content, node, 'version');\n\n return { dep, depPackageFile: packageFile };\n}\n\nfunction walkNode(\n node: XmlElement | XmlDocument,\n rawDeps: RawDep[],\n packageFile: string,\n content: string,\n): void {\n for (const child of node.children) {\n if (!isXmlElement(child)) {\n continue;\n }\n\n if (child.name === 'dependency') {\n const rawDep = collectDependency(child, packageFile, content);\n if (rawDep) {\n rawDeps.push(rawDep);\n }\n } else {\n walkNode(child, rawDeps, packageFile, content);\n }\n }\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n let doc: XmlDocument;\n try {\n doc = new XmlDocument(content);\n } catch {\n logger.debug(`ant manager: could not parse XML ${packageFile}`);\n return null;\n }\n\n const rawDeps: RawDep[] = [];\n walkNode(doc, rawDeps, packageFile, content);\n\n const deps = rawDeps.map((rd) => rd.dep);\n\n if (deps.length === 0) {\n return null;\n }\n\n return { deps };\n}\n\n/**\n * Walk an XML node tree in document order, processing properties,\n * property file references, and dependencies as they appear.\n */\nasync function walkNodeInOrder(\n node: XmlElement | XmlDocument,\n packageFile: string,\n content: string,\n visitedFiles: Set<string>,\n allProps: Record<string, AntProp>,\n allRawDeps: RawDep[],\n): Promise<void> {\n const baseDir = upath.dirname(packageFile);\n\n for (const child of node.children) {\n if (!isXmlElement(child)) {\n continue;\n }\n\n if (child.name === 'property') {\n // Handle inline property definition\n const name = child.attr.name;\n const value = child.attr.value;\n if (name && value && !(name in allProps)) {\n const pos = findAttrValuePosition(content, child, 'value');\n allProps[name] = { val: value, fileReplacePosition: pos, packageFile };\n }\n\n // Handle property file reference\n const file = child.attr.file;\n if (file) {\n const propFilePath = file.startsWith('/')\n ? file\n : upath.join(baseDir, file);\n\n if (!visitedFiles.has(propFilePath)) {\n visitedFiles.add(propFilePath);\n const propContent = await readLocalFile(propFilePath, 'utf8');\n if (propContent) {\n parsePropertiesFile(propContent, propFilePath, allProps);\n } else {\n logger.debug(\n `ant manager: could not read properties file ${propFilePath}`,\n );\n }\n }\n }\n } else if (child.name === 'dependency') {\n const rawDep = collectDependency(child, packageFile, content);\n if (rawDep) {\n allRawDeps.push(rawDep);\n }\n } else {\n await walkNodeInOrder(\n child,\n packageFile,\n content,\n visitedFiles,\n allProps,\n allRawDeps,\n );\n }\n }\n}\n\nasync function walkXmlFile(\n packageFile: string,\n visitedFiles: Set<string>,\n allProps: Record<string, AntProp>,\n allRawDeps: RawDep[],\n): Promise<void> {\n visitedFiles.add(packageFile);\n\n const content = await readLocalFile(packageFile, 'utf8');\n if (!content) {\n logger.debug(`ant manager: could not read ${packageFile}`);\n return;\n }\n\n let doc: XmlDocument;\n try {\n doc = new XmlDocument(content);\n } catch {\n logger.debug(`ant manager: could not parse XML ${packageFile}`);\n return;\n }\n\n await walkNodeInOrder(\n doc,\n packageFile,\n content,\n visitedFiles,\n allProps,\n allRawDeps,\n );\n}\n\nexport async function extractAllPackageFiles(\n _config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile[] | null> {\n const results: PackageFile[] = [];\n const seen = new Set<string>();\n\n for (const packageFile of packageFiles) {\n if (seen.has(packageFile)) {\n continue;\n }\n seen.add(packageFile);\n\n const visitedFiles = new Set<string>();\n const allProps: Record<string, AntProp> = {};\n const allRawDeps: RawDep[] = [];\n\n await walkXmlFile(packageFile, visitedFiles, allProps, allRawDeps);\n\n // Resolve chained property values before applying to deps\n resolveChainedProps(allProps);\n\n // Apply property resolution to all dependencies\n const resolvedDeps = allRawDeps.map((rawDep) =>\n applyProps(rawDep.dep, rawDep.depPackageFile, allProps),\n );\n\n if (resolvedDeps.length === 0) {\n continue;\n }\n\n // Group deps by their target file (propSource or original packageFile)\n const fileMap = new Map<string, PackageDependency[]>();\n for (let i = 0; i < resolvedDeps.length; i++) {\n const dep = resolvedDeps[i];\n const targetFile = dep.propSource ?? allRawDeps[i].depPackageFile;\n if (!fileMap.has(targetFile)) {\n fileMap.set(targetFile, []);\n }\n fileMap.get(targetFile)!.push(dep);\n }\n\n for (const [pkgFile, deps] of fileMap) {\n // Clean up internal propSource field\n for (const dep of deps) {\n delete dep.propSource;\n }\n results.push({ packageFile: pkgFile, deps });\n }\n }\n\n return results.length > 0 ? results : null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/ant/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport type { XmlElement } from 'xmldoc';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { MavenDatasource } from '../../datasource/maven/index.ts';\nimport { isXmlElement } from '../nuget/util.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n PackageFileContent,\n} from '../types.ts';\nimport {\n applyProps,\n findAttrValuePosition,\n parsePropertiesFile,\n resolveChainedProps,\n} from './properties.ts';\nimport type { AntProp } from './types.ts';\n\nexport { parsePropertiesFile } from './properties.ts';\n\nconst scopeNames = new Set([\n 'compile',\n 'runtime',\n 'test',\n 'provided',\n 'system',\n]);\n\nfunction getDependencyType(scope: string | undefined): string {\n if (scope && scopeNames.has(scope)) {\n return scope;\n }\n return 'compile';\n}\n\ninterface RawDep {\n dep: PackageDependency;\n depPackageFile: string;\n}\n\nfunction collectDependency(\n node: XmlElement,\n packageFile: string,\n content: string,\n): RawDep | null {\n const { groupId, artifactId, version, scope } = node.attr;\n\n if (!version || !groupId || !artifactId) {\n return null;\n }\n\n const dep: PackageDependency = {\n datasource: MavenDatasource.id,\n depName: `${groupId}:${artifactId}`,\n currentValue: version,\n depType: getDependencyType(scope),\n registryUrls: [],\n };\n\n dep.fileReplacePosition = findAttrValuePosition(content, node, 'version');\n\n return { dep, depPackageFile: packageFile };\n}\n\nfunction walkNode(\n node: XmlElement | XmlDocument,\n rawDeps: RawDep[],\n packageFile: string,\n content: string,\n): void {\n for (const child of node.children) {\n if (!isXmlElement(child)) {\n continue;\n }\n\n if (child.name === 'dependency') {\n const rawDep = collectDependency(child, packageFile, content);\n if (rawDep) {\n rawDeps.push(rawDep);\n }\n } else {\n walkNode(child, rawDeps, packageFile, content);\n }\n }\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n let doc: XmlDocument;\n try {\n doc = new XmlDocument(content);\n } catch {\n logger.debug(`ant manager: could not parse XML ${packageFile}`);\n return null;\n }\n\n const rawDeps: RawDep[] = [];\n walkNode(doc, rawDeps, packageFile, content);\n\n const deps = rawDeps.map((rd) => rd.dep);\n\n if (deps.length === 0) {\n return null;\n }\n\n return { deps };\n}\n\n/**\n * Walk an XML node tree in document order, processing properties,\n * property file references, and dependencies as they appear.\n */\nasync function walkNodeInOrder(\n node: XmlElement | XmlDocument,\n packageFile: string,\n content: string,\n visitedFiles: Set<string>,\n allProps: Record<string, AntProp>,\n allRawDeps: RawDep[],\n): Promise<void> {\n const baseDir = upath.dirname(packageFile);\n\n for (const child of node.children) {\n if (!isXmlElement(child)) {\n continue;\n }\n\n if (child.name === 'property') {\n // Handle inline property definition\n const name = child.attr.name;\n const value = child.attr.value;\n if (name && value && !(name in allProps)) {\n const pos = findAttrValuePosition(content, child, 'value');\n allProps[name] = { val: value, fileReplacePosition: pos, packageFile };\n }\n\n // Handle property file reference\n const file = child.attr.file;\n if (file) {\n const propFilePath = file.startsWith('/')\n ? file\n : upath.join(baseDir, file);\n\n if (!visitedFiles.has(propFilePath)) {\n visitedFiles.add(propFilePath);\n const propContent = await readLocalFile(propFilePath, 'utf8');\n if (propContent) {\n parsePropertiesFile(propContent, propFilePath, allProps);\n } else {\n logger.debug(\n `ant manager: could not read properties file ${propFilePath}`,\n );\n }\n }\n }\n } else if (child.name === 'import' && child.attr.file) {\n const importedFile = upath.normalize(\n upath.join(baseDir, child.attr.file),\n );\n await walkXmlFile(importedFile, visitedFiles, allProps, allRawDeps);\n } else if (child.name === 'dependency') {\n const rawDep = collectDependency(child, packageFile, content);\n if (rawDep) {\n allRawDeps.push(rawDep);\n }\n } else {\n await walkNodeInOrder(\n child,\n packageFile,\n content,\n visitedFiles,\n allProps,\n allRawDeps,\n );\n }\n }\n}\n\nasync function walkXmlFile(\n packageFile: string,\n visitedFiles: Set<string>,\n allProps: Record<string, AntProp>,\n allRawDeps: RawDep[],\n): Promise<void> {\n if (visitedFiles.has(packageFile)) {\n return;\n }\n visitedFiles.add(packageFile);\n\n const content = await readLocalFile(packageFile, 'utf8');\n if (!content) {\n logger.debug(`ant manager: could not read ${packageFile}`);\n return;\n }\n\n let doc: XmlDocument;\n try {\n doc = new XmlDocument(content);\n } catch {\n logger.debug(`ant manager: could not parse XML ${packageFile}`);\n return;\n }\n\n await walkNodeInOrder(\n doc,\n packageFile,\n content,\n visitedFiles,\n allProps,\n allRawDeps,\n );\n}\n\nexport async function extractAllPackageFiles(\n _config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile[] | null> {\n const results: PackageFile[] = [];\n const seen = new Set<string>();\n\n for (const packageFile of packageFiles) {\n if (seen.has(packageFile)) {\n continue;\n }\n seen.add(packageFile);\n\n const visitedFiles = new Set<string>();\n const allProps: Record<string, AntProp> = {};\n const allRawDeps: RawDep[] = [];\n\n await walkXmlFile(packageFile, visitedFiles, allProps, allRawDeps);\n\n // Resolve chained property values before applying to deps\n resolveChainedProps(allProps);\n\n // Apply property resolution to all dependencies\n const resolvedDeps = allRawDeps.map((rawDep) =>\n applyProps(rawDep.dep, rawDep.depPackageFile, allProps),\n );\n\n if (resolvedDeps.length === 0) {\n continue;\n }\n\n // Group deps by their target file (propSource or original packageFile)\n const fileMap = new Map<string, PackageDependency[]>();\n for (let i = 0; i < resolvedDeps.length; i++) {\n const dep = resolvedDeps[i];\n const targetFile = dep.propSource ?? allRawDeps[i].depPackageFile;\n if (!fileMap.has(targetFile)) {\n fileMap.set(targetFile, []);\n }\n fileMap.get(targetFile)!.push(dep);\n }\n\n for (const [pkgFile, deps] of fileMap) {\n // Clean up internal propSource field\n for (const dep of deps) {\n delete dep.propSource;\n }\n results.push({ packageFile: pkgFile, deps });\n }\n }\n\n return results.length > 0 ? results : null;\n}\n"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  const hashMap = /* @__PURE__ */ new Map();
3
3
  hashMap.set("ansible", "1fbc76f78daa14a8c9ab1142e9d1e05c746c0419a9f1455e4279f476590d0c04");
4
4
  hashMap.set("ansible-galaxy", "8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f");
5
- hashMap.set("ant", "0a356fc5ff43659fc81edb74f868ddd7213235512181da875c09caa94c6e3070");
5
+ hashMap.set("ant", "27e1e1b4b077554dbc62e54893f2a3a0372228e7afdd2bdc68c6335dc7654c4e");
6
6
  hashMap.set("argocd", "5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce");
7
7
  hashMap.set("asdf", "1f6fcf620e9c6cd35991380cb6eafb94ec60cd77cbd13335ebe3a1d9727416c9");
8
8
  hashMap.set("azure-pipelines", "4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796");
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1fbc76f78daa14a8c9ab1142e9d1e05c746c0419a9f1455e4279f476590d0c04');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','0a356fc5ff43659fc81edb74f868ddd7213235512181da875c09caa94c6e3070');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','1f6fcf620e9c6cd35991380cb6eafb94ec60cd77cbd13335ebe3a1d9727416c9');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','fad98996bea8626525ab925f83a6ae0ce9262c53770e7aa7cb448a1e0f1ddf21');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c6e0ad88ea468664c3a33263baf7452d83d2d37ff09ba920e18f64ee81fd0acb');\nhashMap.set('bazel-module','ff071fcf8b53036956627d2a430ccdf256e30bee4d7e80c329379879d836a931');\nhashMap.set('bazelisk','b6ec532dfa7c8f82ad4084df864ac6276e87c27285369323902afc146d3537ac');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','1322232bf1d0c4fa796e31a00488453bdcd00d4958431d9e424c1635e60a99bd');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6d7e9d2018ac03e15f19e8b40ef70dd87d509d5affca24bc464d085899880a25');\nhashMap.set('cake','288c3c36a50371b26957fa71992cc335228d53563c75597b36919ac7286e96eb');\nhashMap.set('cargo','308d7ab4c6d24027b050bf659dfab0e510d9a22f8134695a7c68214908ee4634');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','135937d4720718304adb0ba998516f8ce38c3220ccd18b00b8c70c62b45df4da');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','b6ac3b4a6b8a5b32daed37bf695fe177cdb1b4a94ae7f7fb2f4c4c096c0a004c');\nhashMap.set('composer','cdb6895574020cec402e0b878e4078b62f1acfd0392a861cbb523036634f6383');\nhashMap.set('conan','aecc3917d77146db4e57dd12944be1beff860e90b7ebdd2d8fbc449fc1a06574');\nhashMap.set('copier','faa3b79991256a6fc0957fdcd530a1bc8aee65913d5aff2b1b4d226dcd44d008');\nhashMap.set('cpanfile','6a1d67d9c8751123deaf0c7f3ac38a07024e960c140f8228fcbcb93954fdca01');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','bcf5334e8a21190baaa25436acf2f17fbf095504262a4e9ee7c62ffb644eb716');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','322b95f7e55dd78d7fe71306a6f649479eca61c60d75bb10b23604a230dbdd08');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','427e0c1a5b1d8337503a9a568a76532fbde0bab8b355fa8f47312de50eadf2f6');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','fbbf1c7b7b6f4166fa3beee96a3283d007b388e9ecb6a14f76123c8ab8c78071');\nhashMap.set('github-actions','d8f83c65da1e80b639ad44a0d8641e7e97b1d93a1b6c873603333d337ad02011');\nhashMap.set('gitlabci','0dec44dd398bfc5b3c19d0929bea2fef7f386c94acfd1b1d7bc2a31d81d96fd6');\nhashMap.set('gitlabci-include','354cfc4ea327c6d5cd5bee1f17763832efc7f5402e9fd22c579239fccb9c6dab');\nhashMap.set('glasskube','253d6db30bdec75ed5ab5d26f31d69bc07813ba10089a28da12c6a29eff4ec70');\nhashMap.set('gleam','b717a48c525ad6b1d434c6a9db828ddebbb85e94519e89ddc4040878e3600e84');\nhashMap.set('gomod','82e877b22c0dd0217368760bb5d38430657fff63d07c289793a866f0845d2976');\nhashMap.set('gradle','f430d8d768b56889ad1e5a69965841e85cc700e364d15db7bce680e8a5d6f821');\nhashMap.set('gradle-wrapper','90d2ecb9d0b113f8e946d4ea221c040f17f91af846e1ff4f9fc1514ad4324b74');\nhashMap.set('haskell-cabal','d796ec6859e63ab4f1b7030c4016071202c3a44c7c11d4a9131d7e2ba19b396d');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','e5783484b81247279563da3c835afe4002edfc412e13fb91877818ca44ae65f2');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','7724bf6cc3ff4afec1809899f619a332f4350049b9578b5c4634514b4448cf2b');\nhashMap.set('hermit','672c328e4baea3a1ccd2cde2364db01c8033a8c077bf63a5b914fc20ee1de838');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','56ef90301143874355fd2ed25dff7c646875f701f97422d02e01d45608a88f31');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','4b73c32ddc3fe45d9777106d45b116777a2960e6e631256a6553060e602f893c');\nhashMap.set('kotlin-script','99ef296792a0ca575ed31d3defb514b05a58083dc01c52ea0890c69d867ba1dd');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','1e44d6ef8622252dac6d9649fb04badd12d4827eb2a55f74792aa9de2b915775');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','fd6bfc21be851ed076eabea1a91a89b25eb82129734c7cb0c2e684385cf1ea69');\nhashMap.set('maven-wrapper','9a868d1328f911eb72f9e65a64d46c86ae347aab0153d1cf4e9a62ad9e0d6cb0');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','b816a49c8525716454d0a2bc9127916d5b27e5cca7b2aa2030312f218942af3e');\nhashMap.set('mise','38177382f3785cfe7cce92994bfb429b68f5165e6eef1bdcd2c7a3d8d5414da2');\nhashMap.set('mix','1116e1adf1c18c866f0a9e6fa065c4fb9da055d8d150e625344899bb94095481');\nhashMap.set('nix','f3ffec2f14e7261de8068895b91392e992dcef208fbaf52110d6862e4712c031');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','eaf9fe4981de8f7504227f3be88445f60f87ba74f9b9c7e54284bc2bb41320b3');\nhashMap.set('nuget','42175b1906e8e91ae0731a13d92d0df065108063665f8a36150aeae73aafdc78');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','f503497a4adef31b29572176e9a69d52fa9b0bfe3477b6e228c906aeb4861de5');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','89152ad6c89f278395f32d289dc3890823c233366547d228e97dd1319aa144b5');\nhashMap.set('pip_requirements','d5c474c524bc7adc1aae065da0531bd22d9f7f52523b018f2461f6c29e12fdf3');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','50f5a54ed714fd3d738c1aa9a353cf3aab767899acdcb763088d4bd04f3a737b');\nhashMap.set('pixi','b17af6eaa33e7babcc52cfc9a617c7801c0efb1125bbd6d0d4e9f6fe33afd353');\nhashMap.set('poetry','7f227b8b912b405df7735e9dc7c178f03021844f0c027d4b321c023c330c390a');\nhashMap.set('pre-commit','a6a6e847fdb0f56650e66ef7d69e68de752b390913f79ac31d1a7ec5955d03da');\nhashMap.set('pub','0fbad9f77579fcec3a623c6feab56e71934c67a79bb8f4f0f847452051d2a0ba');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e355e13e104351a8b3516a8e272fc5f7e625c9f39b0c492ba27283a36227c2d4');\nhashMap.set('renovate-config-presets','a394fe55f8b6ba356f29f76efd9f0d34b56baceb111e6d92f95b29b5ca50ac67');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('sbt','74125bd9c76a5724092258cd1dee1ea99fc0d735b463a2b64fedc5d950efde2a');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('sveltos','167a5cc79098803be3b815a28cc40ef3361c455751e1d6a7a99ba91bfce26709');\nhashMap.set('swift','79ec9a6a2a8bb4853bb78bbb3a2a6e64e3b32b0ddeb312385abb3a14366ad505');\nhashMap.set('tekton','4e35c75bba4abc9c3cf49c55da6c19db4f4e9181d1fd9583288ab55ef7c944fd');\nhashMap.set('terraform','5bd62ce12c23896b8ecb2385a60a3cb9eb72badf10f9984bfed38f50f9262266');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','b8474c65383a702602eee432cc1434f9a49a1ef886d1213de92d7a84fb98b9cd');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','4a975f0cc1aa22cd258aa835de3dc98d7a5c0d1cee0a1092324338968e08a827');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','4627230d3b7698c41aac192d57b65b091c860c8f858c89d6af4b06ed6a32fae6');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('jsonata','3b5f465b586993f92c8490e70885e7eecce9b6556bcc376dd9c11db8ee9e6960');\nhashMap.set('regex','7b643b49e498465cf91b25b8b840bb1fec8c8a3a59bfa8f97a39c976675325a0');"],"mappings":"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"}
1
+ {"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1fbc76f78daa14a8c9ab1142e9d1e05c746c0419a9f1455e4279f476590d0c04');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','27e1e1b4b077554dbc62e54893f2a3a0372228e7afdd2bdc68c6335dc7654c4e');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','1f6fcf620e9c6cd35991380cb6eafb94ec60cd77cbd13335ebe3a1d9727416c9');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','fad98996bea8626525ab925f83a6ae0ce9262c53770e7aa7cb448a1e0f1ddf21');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c6e0ad88ea468664c3a33263baf7452d83d2d37ff09ba920e18f64ee81fd0acb');\nhashMap.set('bazel-module','ff071fcf8b53036956627d2a430ccdf256e30bee4d7e80c329379879d836a931');\nhashMap.set('bazelisk','b6ec532dfa7c8f82ad4084df864ac6276e87c27285369323902afc146d3537ac');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','1322232bf1d0c4fa796e31a00488453bdcd00d4958431d9e424c1635e60a99bd');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6d7e9d2018ac03e15f19e8b40ef70dd87d509d5affca24bc464d085899880a25');\nhashMap.set('cake','288c3c36a50371b26957fa71992cc335228d53563c75597b36919ac7286e96eb');\nhashMap.set('cargo','308d7ab4c6d24027b050bf659dfab0e510d9a22f8134695a7c68214908ee4634');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','135937d4720718304adb0ba998516f8ce38c3220ccd18b00b8c70c62b45df4da');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','b6ac3b4a6b8a5b32daed37bf695fe177cdb1b4a94ae7f7fb2f4c4c096c0a004c');\nhashMap.set('composer','cdb6895574020cec402e0b878e4078b62f1acfd0392a861cbb523036634f6383');\nhashMap.set('conan','aecc3917d77146db4e57dd12944be1beff860e90b7ebdd2d8fbc449fc1a06574');\nhashMap.set('copier','faa3b79991256a6fc0957fdcd530a1bc8aee65913d5aff2b1b4d226dcd44d008');\nhashMap.set('cpanfile','6a1d67d9c8751123deaf0c7f3ac38a07024e960c140f8228fcbcb93954fdca01');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','bcf5334e8a21190baaa25436acf2f17fbf095504262a4e9ee7c62ffb644eb716');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','322b95f7e55dd78d7fe71306a6f649479eca61c60d75bb10b23604a230dbdd08');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','427e0c1a5b1d8337503a9a568a76532fbde0bab8b355fa8f47312de50eadf2f6');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','fbbf1c7b7b6f4166fa3beee96a3283d007b388e9ecb6a14f76123c8ab8c78071');\nhashMap.set('github-actions','d8f83c65da1e80b639ad44a0d8641e7e97b1d93a1b6c873603333d337ad02011');\nhashMap.set('gitlabci','0dec44dd398bfc5b3c19d0929bea2fef7f386c94acfd1b1d7bc2a31d81d96fd6');\nhashMap.set('gitlabci-include','354cfc4ea327c6d5cd5bee1f17763832efc7f5402e9fd22c579239fccb9c6dab');\nhashMap.set('glasskube','253d6db30bdec75ed5ab5d26f31d69bc07813ba10089a28da12c6a29eff4ec70');\nhashMap.set('gleam','b717a48c525ad6b1d434c6a9db828ddebbb85e94519e89ddc4040878e3600e84');\nhashMap.set('gomod','82e877b22c0dd0217368760bb5d38430657fff63d07c289793a866f0845d2976');\nhashMap.set('gradle','f430d8d768b56889ad1e5a69965841e85cc700e364d15db7bce680e8a5d6f821');\nhashMap.set('gradle-wrapper','90d2ecb9d0b113f8e946d4ea221c040f17f91af846e1ff4f9fc1514ad4324b74');\nhashMap.set('haskell-cabal','d796ec6859e63ab4f1b7030c4016071202c3a44c7c11d4a9131d7e2ba19b396d');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','e5783484b81247279563da3c835afe4002edfc412e13fb91877818ca44ae65f2');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','7724bf6cc3ff4afec1809899f619a332f4350049b9578b5c4634514b4448cf2b');\nhashMap.set('hermit','672c328e4baea3a1ccd2cde2364db01c8033a8c077bf63a5b914fc20ee1de838');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','56ef90301143874355fd2ed25dff7c646875f701f97422d02e01d45608a88f31');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','4b73c32ddc3fe45d9777106d45b116777a2960e6e631256a6553060e602f893c');\nhashMap.set('kotlin-script','99ef296792a0ca575ed31d3defb514b05a58083dc01c52ea0890c69d867ba1dd');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','1e44d6ef8622252dac6d9649fb04badd12d4827eb2a55f74792aa9de2b915775');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','fd6bfc21be851ed076eabea1a91a89b25eb82129734c7cb0c2e684385cf1ea69');\nhashMap.set('maven-wrapper','9a868d1328f911eb72f9e65a64d46c86ae347aab0153d1cf4e9a62ad9e0d6cb0');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','b816a49c8525716454d0a2bc9127916d5b27e5cca7b2aa2030312f218942af3e');\nhashMap.set('mise','38177382f3785cfe7cce92994bfb429b68f5165e6eef1bdcd2c7a3d8d5414da2');\nhashMap.set('mix','1116e1adf1c18c866f0a9e6fa065c4fb9da055d8d150e625344899bb94095481');\nhashMap.set('nix','f3ffec2f14e7261de8068895b91392e992dcef208fbaf52110d6862e4712c031');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','eaf9fe4981de8f7504227f3be88445f60f87ba74f9b9c7e54284bc2bb41320b3');\nhashMap.set('nuget','42175b1906e8e91ae0731a13d92d0df065108063665f8a36150aeae73aafdc78');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','f503497a4adef31b29572176e9a69d52fa9b0bfe3477b6e228c906aeb4861de5');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','89152ad6c89f278395f32d289dc3890823c233366547d228e97dd1319aa144b5');\nhashMap.set('pip_requirements','d5c474c524bc7adc1aae065da0531bd22d9f7f52523b018f2461f6c29e12fdf3');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','50f5a54ed714fd3d738c1aa9a353cf3aab767899acdcb763088d4bd04f3a737b');\nhashMap.set('pixi','b17af6eaa33e7babcc52cfc9a617c7801c0efb1125bbd6d0d4e9f6fe33afd353');\nhashMap.set('poetry','7f227b8b912b405df7735e9dc7c178f03021844f0c027d4b321c023c330c390a');\nhashMap.set('pre-commit','a6a6e847fdb0f56650e66ef7d69e68de752b390913f79ac31d1a7ec5955d03da');\nhashMap.set('pub','0fbad9f77579fcec3a623c6feab56e71934c67a79bb8f4f0f847452051d2a0ba');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e355e13e104351a8b3516a8e272fc5f7e625c9f39b0c492ba27283a36227c2d4');\nhashMap.set('renovate-config-presets','a394fe55f8b6ba356f29f76efd9f0d34b56baceb111e6d92f95b29b5ca50ac67');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('sbt','74125bd9c76a5724092258cd1dee1ea99fc0d735b463a2b64fedc5d950efde2a');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('sveltos','167a5cc79098803be3b815a28cc40ef3361c455751e1d6a7a99ba91bfce26709');\nhashMap.set('swift','79ec9a6a2a8bb4853bb78bbb3a2a6e64e3b32b0ddeb312385abb3a14366ad505');\nhashMap.set('tekton','4e35c75bba4abc9c3cf49c55da6c19db4f4e9181d1fd9583288ab55ef7c944fd');\nhashMap.set('terraform','5bd62ce12c23896b8ecb2385a60a3cb9eb72badf10f9984bfed38f50f9262266');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','b8474c65383a702602eee432cc1434f9a49a1ef886d1213de92d7a84fb98b9cd');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','4a975f0cc1aa22cd258aa835de3dc98d7a5c0d1cee0a1092324338968e08a827');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','4627230d3b7698c41aac192d57b65b091c860c8f858c89d6af4b06ed6a32fae6');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('jsonata','3b5f465b586993f92c8490e70885e7eecce9b6556bcc376dd9c11db8ee9e6960');\nhashMap.set('regex','7b643b49e498465cf91b25b8b840bb1fec8c8a3a59bfa8f97a39c976675325a0');"],"mappings":"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"}
@@ -8,11 +8,23 @@ declare const GithubVulnerabilityAlerts: z.ZodEffects<z.ZodEffects<z.ZodArray<z.
8
8
  value: string;
9
9
  type: string;
10
10
  }[];
11
+ severity: "low" | "medium" | "high" | "critical";
11
12
  references?: {
12
13
  url: string;
13
14
  }[] | undefined;
15
+ cvss_severities?: {
16
+ cvss_v3?: {
17
+ vector_string: string | null;
18
+ score: number | null;
19
+ } | null | undefined;
20
+ cvss_v4?: {
21
+ vector_string: string | null;
22
+ score: number | null;
23
+ } | null | undefined;
24
+ } | null | undefined;
14
25
  };
15
26
  security_vulnerability: {
27
+ severity: "low" | "medium" | "high" | "critical";
16
28
  package: {
17
29
  ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "actions" | "nuget" | "pip" | "rubygems";
18
30
  name: string;
@@ -33,11 +45,23 @@ declare const GithubVulnerabilityAlerts: z.ZodEffects<z.ZodEffects<z.ZodArray<z.
33
45
  value: string;
34
46
  type: string;
35
47
  }[];
48
+ severity: "low" | "medium" | "high" | "critical";
36
49
  references?: {
37
50
  url: string;
38
51
  }[] | undefined;
52
+ cvss_severities?: {
53
+ cvss_v3?: {
54
+ vector_string: string | null;
55
+ score: number | null;
56
+ } | null | undefined;
57
+ cvss_v4?: {
58
+ vector_string: string | null;
59
+ score: number | null;
60
+ } | null | undefined;
61
+ } | null | undefined;
39
62
  };
40
63
  security_vulnerability: {
64
+ severity: "low" | "medium" | "high" | "critical";
41
65
  package: {
42
66
  ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "actions" | "nuget" | "pip" | "rubygems";
43
67
  name: string;
@@ -19,18 +19,34 @@ const Package = z.object({
19
19
  }),
20
20
  name: z.string()
21
21
  });
22
+ const Severity = z.enum([
23
+ "low",
24
+ "medium",
25
+ "high",
26
+ "critical"
27
+ ]);
22
28
  const SecurityVulnerability = z.object({
23
29
  first_patched_version: z.object({ identifier: z.string() }).nullish(),
24
30
  package: Package,
31
+ severity: Severity,
25
32
  vulnerable_version_range: z.string()
26
33
  }).nullable();
34
+ const CvssSeverity = z.object({
35
+ vector_string: z.string().nullable(),
36
+ score: z.number().nullable()
37
+ });
27
38
  const SecurityAdvisory = z.object({
28
39
  description: z.string(),
29
40
  identifiers: z.array(z.object({
30
41
  type: z.string(),
31
42
  value: z.string()
32
43
  })),
33
- references: z.array(z.object({ url: z.string() })).optional()
44
+ references: z.array(z.object({ url: z.string() })).optional(),
45
+ severity: Severity,
46
+ cvss_severities: z.object({
47
+ cvss_v3: CvssSeverity.nullish(),
48
+ cvss_v4: CvssSeverity.nullish()
49
+ }).nullish()
34
50
  });
35
51
  const GithubVulnerabilityAlerts = LooseArray(z.object({
36
52
  dismissed_reason: z.string().nullish(),
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/platform/github/schema.ts"],"sourcesContent":["import { z } from 'zod/v3';\nimport { logger } from '../../../logger/index.ts';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\n\nconst Ecosystem = z.enum([\n 'actions',\n 'composer',\n 'go',\n 'maven',\n 'npm',\n 'nuget',\n 'pip',\n 'rubygems',\n 'rust',\n]);\nexport type Ecosystem = z.infer<typeof Ecosystem>;\n\nconst Package = z.object({\n ecosystem: Ecosystem.catch((ctx) => {\n logger.debug(\n { ecosystem: ctx.input },\n 'Skipping vulnerability alert with unsupported ecosystem',\n );\n return undefined as any;\n }),\n name: z.string(),\n});\n\nconst SecurityVulnerability = z\n .object({\n first_patched_version: z.object({ identifier: z.string() }).nullish(),\n package: Package,\n vulnerable_version_range: z.string(),\n })\n .nullable();\n\nconst SecurityAdvisory = z.object({\n description: z.string(),\n identifiers: z.array(\n z.object({\n type: z.string(),\n value: z.string(),\n }),\n ),\n references: z.array(z.object({ url: z.string() })).optional(),\n});\nexport type SecurityAdvisory = z.infer<typeof SecurityAdvisory>;\n\nexport const GithubVulnerabilityAlerts = LooseArray(\n z.object({\n dismissed_reason: z.string().nullish(),\n security_advisory: SecurityAdvisory,\n security_vulnerability: SecurityVulnerability,\n dependency: z.object({\n manifest_path: z.string(),\n }),\n }),\n {\n onError: ({ error }) => {\n logger.debug(\n { error },\n 'Vulnerability Alert: Failed to parse some alerts',\n );\n },\n },\n).transform((alerts) =>\n alerts.filter((alert) => alert.security_vulnerability?.package?.ecosystem),\n);\nexport type GithubVulnerabilityAlerts = z.infer<\n typeof GithubVulnerabilityAlerts\n>;\nexport type GithubVulnerabilityAlert = GithubVulnerabilityAlerts[number];\n\n// https://docs.github.com/en/rest/repos/contents?apiVersion=2022-11-28#get-repository-content\nconst GithubResponseMetadata = z.object({\n name: z.string(),\n path: z.string(),\n});\n\nexport const GithubFileMeta = GithubResponseMetadata.extend({\n type: z.literal('file'),\n});\nexport type GithubFileMeta = z.infer<typeof GithubFileMeta>;\n\nexport const GithubFile = GithubFileMeta.extend({\n content: z.string(),\n encoding: z.string(),\n});\nexport type GithubFile = z.infer<typeof GithubFile>;\n\nexport const GithubDirectory = GithubResponseMetadata.extend({\n type: z.literal('dir'),\n});\n\nexport type GithubDirectory = z.infer<typeof GithubDirectory>;\n\nexport const GithubOtherContent = GithubResponseMetadata.extend({\n type: z.literal('symlink').or(z.literal('submodule')),\n});\n\nexport type GithubOtherContent = z.infer<typeof GithubOtherContent>;\n\nexport const GithubElement = GithubFile.or(GithubFileMeta)\n .or(GithubDirectory)\n .or(GithubOtherContent);\nexport type GithubElement = z.infer<typeof GithubElement>;\n\nexport const GithubContentResponse = z.array(GithubElement).or(GithubElement);\n\nexport const GithubBranchProtection = z.object({\n required_status_checks: z\n .object({\n strict: z.boolean(),\n })\n .nullish()\n .optional(),\n});\nexport type GithubBranchProtection = z.infer<typeof GithubBranchProtection>;\n\nconst GithubRulesetRule = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('non_fast_forward'),\n }),\n z.object({\n type: z.literal('required_status_checks'),\n parameters: z.object({\n strict_required_status_checks_policy: z.boolean().optional(),\n }),\n }),\n // prevents deletion\n z.object({\n type: z.literal('deletion'),\n }),\n]);\n\nexport const GithubBranchRulesets = LooseArray(GithubRulesetRule);\nexport type GithubBranchRulesets = z.infer<typeof GithubBranchRulesets>;\n"],"mappings":";;;;AAIA,MAAM,YAAY,EAAE,KAAK;CACvB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAGF,MAAM,UAAU,EAAE,OAAO;CACvB,WAAW,UAAU,OAAO,QAAQ;AAClC,SAAO,MACL,EAAE,WAAW,IAAI,OAAO,EACxB,0DACD;GAED;CACF,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,wBAAwB,EAC3B,OAAO;CACN,uBAAuB,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,SAAS;CACrE,SAAS;CACT,0BAA0B,EAAE,QAAQ;CACrC,CAAC,CACD,UAAU;AAEb,MAAM,mBAAmB,EAAE,OAAO;CAChC,aAAa,EAAE,QAAQ;CACvB,aAAa,EAAE,MACb,EAAE,OAAO;EACP,MAAM,EAAE,QAAQ;EAChB,OAAO,EAAE,QAAQ;EAClB,CAAC,CACH;CACD,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU;CAC9D,CAAC;AAGF,MAAa,4BAA4B,WACvC,EAAE,OAAO;CACP,kBAAkB,EAAE,QAAQ,CAAC,SAAS;CACtC,mBAAmB;CACnB,wBAAwB;CACxB,YAAY,EAAE,OAAO,EACnB,eAAe,EAAE,QAAQ,EAC1B,CAAC;CACH,CAAC,EACF,EACE,UAAU,EAAE,YAAY;AACtB,QAAO,MACL,EAAE,OAAO,EACT,mDACD;GAEJ,CACF,CAAC,WAAW,WACX,OAAO,QAAQ,UAAU,MAAM,wBAAwB,SAAS,UAAU,CAC3E;AAOD,MAAM,yBAAyB,EAAE,OAAO;CACtC,MAAM,EAAE,QAAQ;CAChB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAa,iBAAiB,uBAAuB,OAAO,EAC1D,MAAM,EAAE,QAAQ,OAAO,EACxB,CAAC;AAGF,MAAa,aAAa,eAAe,OAAO;CAC9C,SAAS,EAAE,QAAQ;CACnB,UAAU,EAAE,QAAQ;CACrB,CAAC;AAGF,MAAa,kBAAkB,uBAAuB,OAAO,EAC3D,MAAM,EAAE,QAAQ,MAAM,EACvB,CAAC;AAIF,MAAa,qBAAqB,uBAAuB,OAAO,EAC9D,MAAM,EAAE,QAAQ,UAAU,CAAC,GAAG,EAAE,QAAQ,YAAY,CAAC,EACtD,CAAC;AAIF,MAAa,gBAAgB,WAAW,GAAG,eAAe,CACvD,GAAG,gBAAgB,CACnB,GAAG,mBAAmB;AAGzB,MAAa,wBAAwB,EAAE,MAAM,cAAc,CAAC,GAAG,cAAc;AAE7E,MAAa,yBAAyB,EAAE,OAAO,EAC7C,wBAAwB,EACrB,OAAO,EACN,QAAQ,EAAE,SAAS,EACpB,CAAC,CACD,SAAS,CACT,UAAU,EACd,CAAC;AAmBF,MAAa,uBAAuB,WAhBV,EAAE,mBAAmB,QAAQ;CACrD,EAAE,OAAO,EACP,MAAM,EAAE,QAAQ,mBAAmB,EACpC,CAAC;CACF,EAAE,OAAO;EACP,MAAM,EAAE,QAAQ,yBAAyB;EACzC,YAAY,EAAE,OAAO,EACnB,sCAAsC,EAAE,SAAS,CAAC,UAAU,EAC7D,CAAC;EACH,CAAC;CAEF,EAAE,OAAO,EACP,MAAM,EAAE,QAAQ,WAAW,EAC5B,CAAC;CACH,CAAC,CAE+D"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/platform/github/schema.ts"],"sourcesContent":["import { z } from 'zod/v3';\nimport { logger } from '../../../logger/index.ts';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\n\nconst Ecosystem = z.enum([\n 'actions',\n 'composer',\n 'go',\n 'maven',\n 'npm',\n 'nuget',\n 'pip',\n 'rubygems',\n 'rust',\n]);\nexport type Ecosystem = z.infer<typeof Ecosystem>;\n\nconst Package = z.object({\n ecosystem: Ecosystem.catch((ctx) => {\n logger.debug(\n { ecosystem: ctx.input },\n 'Skipping vulnerability alert with unsupported ecosystem',\n );\n return undefined as any;\n }),\n name: z.string(),\n});\n\nconst Severity = z.enum(['low', 'medium', 'high', 'critical']);\n\nconst SecurityVulnerability = z\n .object({\n first_patched_version: z.object({ identifier: z.string() }).nullish(),\n package: Package,\n severity: Severity,\n vulnerable_version_range: z.string(),\n })\n .nullable();\n\nconst CvssSeverity = z.object({\n vector_string: z.string().nullable(),\n score: z.number().nullable(),\n});\n\nconst SecurityAdvisory = z.object({\n description: z.string(),\n identifiers: z.array(\n z.object({\n type: z.string(),\n value: z.string(),\n }),\n ),\n references: z.array(z.object({ url: z.string() })).optional(),\n severity: Severity,\n cvss_severities: z\n .object({\n cvss_v3: CvssSeverity.nullish(),\n cvss_v4: CvssSeverity.nullish(),\n })\n .nullish(),\n});\nexport type SecurityAdvisory = z.infer<typeof SecurityAdvisory>;\n\nexport const GithubVulnerabilityAlerts = LooseArray(\n z.object({\n dismissed_reason: z.string().nullish(),\n security_advisory: SecurityAdvisory,\n security_vulnerability: SecurityVulnerability,\n dependency: z.object({\n manifest_path: z.string(),\n }),\n }),\n {\n onError: ({ error }) => {\n logger.debug(\n { error },\n 'Vulnerability Alert: Failed to parse some alerts',\n );\n },\n },\n).transform((alerts) =>\n alerts.filter((alert) => alert.security_vulnerability?.package?.ecosystem),\n);\nexport type GithubVulnerabilityAlerts = z.infer<\n typeof GithubVulnerabilityAlerts\n>;\nexport type GithubVulnerabilityAlert = GithubVulnerabilityAlerts[number];\n\n// https://docs.github.com/en/rest/repos/contents?apiVersion=2022-11-28#get-repository-content\nconst GithubResponseMetadata = z.object({\n name: z.string(),\n path: z.string(),\n});\n\nexport const GithubFileMeta = GithubResponseMetadata.extend({\n type: z.literal('file'),\n});\nexport type GithubFileMeta = z.infer<typeof GithubFileMeta>;\n\nexport const GithubFile = GithubFileMeta.extend({\n content: z.string(),\n encoding: z.string(),\n});\nexport type GithubFile = z.infer<typeof GithubFile>;\n\nexport const GithubDirectory = GithubResponseMetadata.extend({\n type: z.literal('dir'),\n});\n\nexport type GithubDirectory = z.infer<typeof GithubDirectory>;\n\nexport const GithubOtherContent = GithubResponseMetadata.extend({\n type: z.literal('symlink').or(z.literal('submodule')),\n});\n\nexport type GithubOtherContent = z.infer<typeof GithubOtherContent>;\n\nexport const GithubElement = GithubFile.or(GithubFileMeta)\n .or(GithubDirectory)\n .or(GithubOtherContent);\nexport type GithubElement = z.infer<typeof GithubElement>;\n\nexport const GithubContentResponse = z.array(GithubElement).or(GithubElement);\n\nexport const GithubBranchProtection = z.object({\n required_status_checks: z\n .object({\n strict: z.boolean(),\n })\n .nullish()\n .optional(),\n});\nexport type GithubBranchProtection = z.infer<typeof GithubBranchProtection>;\n\nconst GithubRulesetRule = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('non_fast_forward'),\n }),\n z.object({\n type: z.literal('required_status_checks'),\n parameters: z.object({\n strict_required_status_checks_policy: z.boolean().optional(),\n }),\n }),\n // prevents deletion\n z.object({\n type: z.literal('deletion'),\n }),\n]);\n\nexport const GithubBranchRulesets = LooseArray(GithubRulesetRule);\nexport type GithubBranchRulesets = z.infer<typeof GithubBranchRulesets>;\n"],"mappings":"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"}
@@ -41,6 +41,81 @@ var LookupStats = class LookupStats {
41
41
  logger.debug(report, "Lookup statistics");
42
42
  }
43
43
  };
44
+ var GetDatasourceReleasesStats = class {
45
+ static write(datasource, registryUrl, packageName, duration) {
46
+ const data = get("get-releases-stats") ?? [];
47
+ data.push({
48
+ datasource,
49
+ registryUrl,
50
+ packageName,
51
+ duration
52
+ });
53
+ set("get-releases-stats", data);
54
+ }
55
+ static async wrap(datasource, registryUrl, packageName, callback) {
56
+ const start = Date.now();
57
+ const result = await callback();
58
+ const duration = Date.now() - start;
59
+ this.write(datasource, registryUrl, packageName, duration);
60
+ return result;
61
+ }
62
+ static getReport() {
63
+ const data = get("get-releases-stats") ?? [];
64
+ const durationData = {
65
+ stats: [],
66
+ datasources: {}
67
+ };
68
+ for (const { datasource, registryUrl, packageName, duration } of data) {
69
+ durationData.stats.push(duration);
70
+ durationData.datasources[datasource] ??= {
71
+ stats: [],
72
+ registryUrls: {}
73
+ };
74
+ durationData.datasources[datasource].stats.push(duration);
75
+ durationData.datasources[datasource].registryUrls[registryUrl] ??= {
76
+ stats: [],
77
+ packages: {}
78
+ };
79
+ durationData.datasources[datasource].registryUrls[registryUrl].stats.push(duration);
80
+ durationData.datasources[datasource].registryUrls[registryUrl].packages[packageName] ??= [];
81
+ durationData.datasources[datasource].registryUrls[registryUrl].packages[packageName].push(duration);
82
+ }
83
+ const report = {
84
+ stats: makeTimingReport(durationData.stats),
85
+ datasources: {}
86
+ };
87
+ for (const [datasource, datasourceData] of Object.entries(durationData.datasources)) {
88
+ report.datasources[datasource] = {
89
+ stats: makeTimingReport(datasourceData.stats),
90
+ registryUrls: {}
91
+ };
92
+ for (const [registryUrl, registryUrlData] of Object.entries(datasourceData.registryUrls)) {
93
+ report.datasources[datasource].registryUrls[registryUrl] = {
94
+ stats: makeTimingReport(registryUrlData.stats),
95
+ packages: {}
96
+ };
97
+ for (const [packageName, packageNameData] of Object.entries(registryUrlData.packages)) report.datasources[datasource].registryUrls[registryUrl].packages[packageName] = makeTimingReport(packageNameData);
98
+ }
99
+ }
100
+ return report;
101
+ }
102
+ static report() {
103
+ const report = this.getReport();
104
+ const shortReport = {
105
+ stats: report.stats,
106
+ datasources: {}
107
+ };
108
+ for (const [datasource, datasourceData] of Object.entries(report.datasources)) {
109
+ shortReport.datasources[datasource] = {
110
+ stats: datasourceData.stats,
111
+ registryUrls: {}
112
+ };
113
+ for (const [registryUrl, registryUrlData] of Object.entries(datasourceData.registryUrls)) shortReport.datasources[datasource].registryUrls[registryUrl] = { stats: registryUrlData.stats };
114
+ }
115
+ logger.trace(report, "getReleases statistics with packages");
116
+ logger.debug(shortReport, "getReleases statistics summary");
117
+ }
118
+ };
44
119
  var PackageCacheStats = class PackageCacheStats {
45
120
  static writeSet(duration) {
46
121
  const data = get("package-cache-sets") ?? [];
@@ -414,6 +489,6 @@ var GitOperationStats = class GitOperationStats {
414
489
  }
415
490
  };
416
491
  //#endregion
417
- export { AbandonedPackageStats, DatasourceCacheStats, GitOperationStats, HttpCacheStats, HttpStats, LookupStats, ObsoleteCacheHitLogger, PackageCacheStats };
492
+ export { AbandonedPackageStats, DatasourceCacheStats, GetDatasourceReleasesStats, GitOperationStats, HttpCacheStats, HttpStats, LookupStats, ObsoleteCacheHitLogger, PackageCacheStats };
418
493
 
419
494
  //# sourceMappingURL=stats.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","names":["memCache.get"],"sources":["../../lib/util/stats.ts"],"sourcesContent":["import { logger } from '../logger/index.ts';\nimport * as memCache from './cache/memory/index.ts';\nimport type { GitOperationType } from './git/types.ts';\nimport { parseUrl } from './url.ts';\n\ntype LookupStatsData = Record<string, number[]>;\n\ninterface TimingStatsReport {\n count: number;\n avgMs: number;\n medianMs: number;\n maxMs: number;\n totalMs: number;\n}\n\nexport function makeTimingReport(data: number[]): TimingStatsReport {\n const count = data.length;\n const totalMs = data.reduce((a, c) => a + c, 0);\n const avgMs = count ? Math.round(totalMs / count) : 0;\n const maxMs = Math.max(0, ...data);\n const sorted = data.sort((a, b) => a - b);\n const medianMs = count ? sorted[Math.floor(count / 2)] : 0;\n return { count, avgMs, medianMs, maxMs, totalMs };\n}\n\nexport class LookupStats {\n static write(datasource: string, duration: number): void {\n const data = memCache.get<LookupStatsData>('lookup-stats') ?? {};\n data[datasource] ??= [];\n data[datasource].push(duration);\n memCache.set('lookup-stats', data);\n }\n\n static async wrap<T>(\n datasource: string,\n callback: () => Promise<T>,\n ): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n LookupStats.write(datasource, duration);\n return result;\n }\n\n static getReport(): Record<string, TimingStatsReport> {\n const report: Record<string, TimingStatsReport> = {};\n const data = memCache.get<LookupStatsData>('lookup-stats') ?? {};\n for (const [datasource, durations] of Object.entries(data)) {\n report[datasource] = makeTimingReport(durations);\n }\n return report;\n }\n\n static report(): void {\n const report = LookupStats.getReport();\n logger.debug(report, 'Lookup statistics');\n }\n}\n\ntype PackageCacheData = number[];\n\nexport class PackageCacheStats {\n static writeSet(duration: number): void {\n const data = memCache.get<PackageCacheData>('package-cache-sets') ?? [];\n data.push(duration);\n memCache.set('package-cache-sets', data);\n }\n\n static async wrapSet<T>(callback: () => Promise<T>): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n PackageCacheStats.writeSet(duration);\n return result;\n }\n\n static writeGet(duration: number): void {\n const data = memCache.get<PackageCacheData>('package-cache-gets') ?? [];\n data.push(duration);\n memCache.set('package-cache-gets', data);\n }\n\n static async wrapGet<T>(callback: () => Promise<T>): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n PackageCacheStats.writeGet(duration);\n return result;\n }\n\n static getReport(): { get: TimingStatsReport; set: TimingStatsReport } {\n const packageCacheGets =\n memCache.get<PackageCacheData>('package-cache-gets') ?? [];\n const get = makeTimingReport(packageCacheGets);\n\n const packageCacheSets =\n memCache.get<PackageCacheData>('package-cache-sets') ?? [];\n const set = makeTimingReport(packageCacheSets);\n\n return { get, set };\n }\n\n static report(): void {\n const report = PackageCacheStats.getReport();\n logger.debug(report, 'Package cache statistics');\n }\n}\n\ninterface DatasourceCacheDataPoint {\n datasource: string;\n registryUrl: string;\n packageName: string;\n action: 'hit' | 'miss' | 'set' | 'skip';\n}\n\ninterface DatasourceCacheLongEntry {\n read?: 'hit' | 'miss';\n write?: 'set' | 'skip';\n}\n\ninterface DatasourceCacheShortEntry {\n hit: number;\n miss: number;\n set: number;\n skip: number;\n}\n\ntype DatasourceCacheLong = Record<\n string,\n Record<string, Record<string, DatasourceCacheLongEntry>>\n>;\n\ntype DatasourceCacheShort = Record<\n string,\n Record<string, DatasourceCacheShortEntry>\n>;\n\nexport interface DatasourceCacheReport {\n long: DatasourceCacheLong;\n short: DatasourceCacheShort;\n}\n\nexport class DatasourceCacheStats {\n private static getData(): DatasourceCacheDataPoint[] {\n return (\n memCache.get<DatasourceCacheDataPoint[]>('datasource-cache-stats') ?? []\n );\n }\n\n private static setData(data: DatasourceCacheDataPoint[]): void {\n memCache.set('datasource-cache-stats', data);\n }\n\n static hit(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'hit' });\n this.setData(data);\n }\n\n static miss(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'miss' });\n this.setData(data);\n }\n\n static set(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'set' });\n this.setData(data);\n }\n\n static skip(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'skip' });\n this.setData(data);\n }\n\n static getReport(): DatasourceCacheReport {\n const data = this.getData();\n const result: DatasourceCacheReport = { long: {}, short: {} };\n for (const { datasource, registryUrl, packageName, action } of data) {\n result.long[datasource] ??= {};\n result.long[datasource][registryUrl] ??= {};\n result.long[datasource][registryUrl] ??= {};\n result.long[datasource][registryUrl][packageName] ??= {};\n\n result.short[datasource] ??= {};\n result.short[datasource][registryUrl] ??= {\n hit: 0,\n miss: 0,\n set: 0,\n skip: 0,\n };\n\n if (action === 'hit') {\n result.long[datasource][registryUrl][packageName].read = 'hit';\n result.short[datasource][registryUrl].hit += 1;\n continue;\n }\n\n if (action === 'miss') {\n result.long[datasource][registryUrl][packageName].read = 'miss';\n result.short[datasource][registryUrl].miss += 1;\n continue;\n }\n\n if (action === 'set') {\n result.long[datasource][registryUrl][packageName].write = 'set';\n result.short[datasource][registryUrl].set += 1;\n continue;\n }\n\n /* v8 ignore else -- TODO: add tests #40625 */\n if (action === 'skip') {\n result.long[datasource][registryUrl][packageName].write = 'skip';\n result.short[datasource][registryUrl].skip += 1;\n continue;\n }\n }\n\n return result;\n }\n\n static report(): void {\n const { long, short } = this.getReport();\n\n if (Object.keys(short).length > 0) {\n logger.debug(short, 'Datasource cache statistics');\n }\n\n if (Object.keys(long).length > 0) {\n logger.trace(long, 'Datasource cache detailed statistics');\n }\n }\n}\n\nexport interface HttpRequestStatsDataPoint {\n method: string;\n url: string;\n reqMs: number;\n queueMs: number;\n status: number;\n}\n\ninterface HostStatsData {\n count: number;\n reqAvgMs: number;\n reqMedianMs: number;\n reqMaxMs: number;\n queueAvgMs: number;\n queueMedianMs: number;\n queueMaxMs: number;\n}\n\n// url -> method -> status -> count\ntype UrlHttpStat = Record<string, Record<string, Record<string, number>>>;\n\ninterface HttpStatsCollection {\n // debug data\n urls: UrlHttpStat;\n hosts: Record<string, HostStatsData>;\n requests: number;\n\n // trace data\n rawRequests: string[];\n hostRequests: Record<string, HttpRequestStatsDataPoint[]>;\n}\n\nexport class HttpStats {\n static write(data: HttpRequestStatsDataPoint): void {\n const httpRequests =\n memCache.get<HttpRequestStatsDataPoint[]>('http-requests') ?? [];\n httpRequests.push(data);\n memCache.set('http-requests', httpRequests);\n }\n\n static getDataPoints(): HttpRequestStatsDataPoint[] {\n const httpRequests =\n memCache.get<HttpRequestStatsDataPoint[]>('http-requests') ?? [];\n\n // istanbul ignore next: sorting is hard and not worth testing\n httpRequests.sort((a, b) => {\n if (a.url < b.url) {\n return -1;\n }\n\n if (a.url > b.url) {\n return 1;\n }\n\n return 0;\n });\n\n return httpRequests;\n }\n\n static getReport(): HttpStatsCollection {\n const dataPoints = HttpStats.getDataPoints();\n\n const requests = dataPoints.length;\n\n const urls: UrlHttpStat = {};\n const rawRequests: string[] = [];\n const hostRequests: Record<string, HttpRequestStatsDataPoint[]> = {};\n\n for (const dataPoint of dataPoints) {\n const { url, reqMs, queueMs, status } = dataPoint;\n const method = dataPoint.method.toUpperCase();\n\n const parsedUrl = parseUrl(url);\n if (!parsedUrl) {\n logger.debug({ url }, 'Failed to parse URL during stats reporting');\n continue;\n }\n const { hostname, origin, pathname } = parsedUrl;\n const baseUrl = `${origin}${pathname}`;\n\n urls[baseUrl] ??= {};\n urls[baseUrl][method] ??= {};\n urls[baseUrl][method][status] ??= 0;\n urls[baseUrl][method][status] += 1;\n\n rawRequests.push(`${method} ${url} ${status} ${reqMs} ${queueMs}`);\n\n hostRequests[hostname] ??= [];\n hostRequests[hostname].push(dataPoint);\n }\n\n const hosts: Record<string, HostStatsData> = {};\n\n for (const [hostname, dataPoints] of Object.entries(hostRequests)) {\n const count = dataPoints.length;\n\n const reqTimes = dataPoints.map((r) => r.reqMs);\n const queueTimes = dataPoints.map((r) => r.queueMs);\n\n const reqReport = makeTimingReport(reqTimes);\n const queueReport = makeTimingReport(queueTimes);\n\n hosts[hostname] = {\n count,\n reqAvgMs: reqReport.avgMs,\n reqMedianMs: reqReport.medianMs,\n reqMaxMs: reqReport.maxMs,\n queueAvgMs: queueReport.avgMs,\n queueMedianMs: queueReport.medianMs,\n queueMaxMs: queueReport.maxMs,\n };\n }\n\n return {\n urls,\n rawRequests,\n hostRequests,\n hosts,\n requests,\n };\n }\n\n static report(): void {\n const { urls, rawRequests, hostRequests, hosts, requests } =\n HttpStats.getReport();\n logger.trace({ rawRequests, hostRequests }, 'HTTP full statistics');\n logger.debug({ hosts, requests }, 'HTTP statistics');\n logger.trace({ urls }, 'HTTP URL statistics');\n }\n}\n\ninterface HttpCacheHostStatsData {\n hit: number;\n miss: number;\n localHit?: number;\n localMiss?: number;\n}\n\ntype HttpCacheStatsData = Record<string, HttpCacheHostStatsData>;\n\nfunction sortObject<T>(obj: Record<string, T>): Record<string, T> {\n const result: Record<string, T> = {};\n for (const key of Object.keys(obj).sort()) {\n result[key] = obj[key];\n }\n return result;\n}\n\nexport class HttpCacheStats {\n static getData(): HttpCacheStatsData {\n return memCache.get<HttpCacheStatsData>('http-cache-stats') ?? {};\n }\n\n static read(key: string): HttpCacheHostStatsData {\n return (\n this.getData()?.[key] ?? {\n hit: 0,\n miss: 0,\n }\n );\n }\n\n static write(key: string, data: HttpCacheHostStatsData): void {\n const stats = memCache.get<HttpCacheStatsData>('http-cache-stats') ?? {};\n stats[key] = data;\n memCache.set('http-cache-stats', stats);\n }\n\n static getBaseUrl(url: string): string | null {\n const parsedUrl = parseUrl(url);\n if (!parsedUrl) {\n logger.debug({ url }, 'Failed to parse URL during cache stats');\n return null;\n }\n const { origin, pathname } = parsedUrl;\n const baseUrl = `${origin}${pathname}`;\n return baseUrl;\n }\n\n static incLocalHits(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.localHit ??= 0;\n stats.localHit += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incLocalMisses(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.localMiss ??= 0;\n stats.localMiss += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incRemoteHits(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.hit += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incRemoteMisses(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.miss += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static report(): void {\n const data = HttpCacheStats.getData();\n let report: Record<string, Record<string, HttpCacheHostStatsData>> = {};\n for (const [url, stats] of Object.entries(data)) {\n const parsedUrl = parseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (parsedUrl) {\n const { origin, pathname } = parsedUrl;\n report[origin] ??= {};\n report[origin][pathname] = stats;\n }\n }\n\n for (const [host, hostStats] of Object.entries(report)) {\n report[host] = sortObject(hostStats);\n }\n report = sortObject(report);\n\n logger.debug(report, 'HTTP cache statistics');\n }\n}\n\ntype ObsoleteCacheStats = Record<\n string,\n {\n count: number;\n }\n>;\n\n/* v8 ignore next: temporary code */\nexport class ObsoleteCacheHitLogger {\n static getData(): ObsoleteCacheStats {\n return memCache.get<ObsoleteCacheStats>('obsolete-cache-stats') ?? {};\n }\n\n static write(url: string): void {\n const data = this.getData();\n if (!data[url]) {\n data[url] = { count: 0 };\n }\n data[url].count++;\n memCache.set('obsolete-cache-stats', data);\n }\n\n static report(): void {\n const hits = this.getData();\n logger.debug(\n { count: Object.keys(hits).length, hits },\n 'Cache fallback URLs',\n );\n }\n}\n/* v8 ignore stop: temporary code */\n\ninterface AbandonedPackage {\n datasource: string;\n packageName: string;\n mostRecentTimestamp: string;\n}\n\ntype AbandonedPackageReport = Record<string, Record<string, string>>;\n\nexport class AbandonedPackageStats {\n static getData(): AbandonedPackage[] {\n return memCache.get<AbandonedPackage[]>('abandonment-stats') ?? [];\n }\n\n private static setData(data: AbandonedPackage[]): void {\n memCache.set('abandonment-stats', data);\n }\n\n static write(\n datasource: string,\n packageName: string,\n mostRecentTimestamp: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, packageName, mostRecentTimestamp });\n this.setData(data);\n }\n\n static getReport(): AbandonedPackageReport {\n const data = this.getData();\n const result: AbandonedPackageReport = {};\n\n for (const { datasource, packageName, mostRecentTimestamp } of data) {\n result[datasource] ??= {};\n result[datasource][packageName] = mostRecentTimestamp;\n }\n\n const sortedResult: AbandonedPackageReport = {};\n for (const datasource of Object.keys(result).sort()) {\n sortedResult[datasource] = {};\n for (const packageName of Object.keys(result[datasource]).sort()) {\n sortedResult[datasource][packageName] = result[datasource][packageName];\n }\n }\n\n return sortedResult;\n }\n\n static report(): void {\n const report = this.getReport();\n if (Object.keys(report).length > 0) {\n logger.debug(report, 'Abandoned package statistics');\n }\n }\n}\n\ntype GitOperationStatsData = Record<GitOperationType, number[]>;\n\nexport class GitOperationStats {\n static write(operationType: GitOperationType, duration: number): void {\n const data =\n memCache.get<GitOperationStatsData>('git-operations-stats') ?? {};\n data[operationType] ??= [];\n data[operationType].push(duration);\n memCache.set('git-operations-stats', data);\n }\n\n static getReport(): Record<string, TimingStatsReport> {\n const report: Record<string, TimingStatsReport> = {};\n const data = memCache.get<LookupStatsData>('git-operations-stats') ?? {};\n for (const [operationType, durations] of Object.entries(data)) {\n report[operationType] = makeTimingReport(durations);\n report[operationType].totalMs = Math.ceil(report[operationType].totalMs);\n }\n\n return report;\n }\n\n static report(): void {\n const report = GitOperationStats.getReport();\n logger.debug(report, 'Git operations statistics');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stats.js","names":["memCache.get"],"sources":["../../lib/util/stats.ts"],"sourcesContent":["import { logger } from '../logger/index.ts';\nimport * as memCache from './cache/memory/index.ts';\nimport type { GitOperationType } from './git/types.ts';\nimport { parseUrl } from './url.ts';\n\ntype LookupStatsData = Record<string, number[]>;\n\ninterface TimingStatsReport {\n count: number;\n avgMs: number;\n medianMs: number;\n maxMs: number;\n totalMs: number;\n}\n\nexport function makeTimingReport(data: number[]): TimingStatsReport {\n const count = data.length;\n const totalMs = data.reduce((a, c) => a + c, 0);\n const avgMs = count ? Math.round(totalMs / count) : 0;\n const maxMs = Math.max(0, ...data);\n const sorted = data.sort((a, b) => a - b);\n const medianMs = count ? sorted[Math.floor(count / 2)] : 0;\n return { count, avgMs, medianMs, maxMs, totalMs };\n}\n\nexport class LookupStats {\n static write(datasource: string, duration: number): void {\n const data = memCache.get<LookupStatsData>('lookup-stats') ?? {};\n data[datasource] ??= [];\n data[datasource].push(duration);\n memCache.set('lookup-stats', data);\n }\n\n static async wrap<T>(\n datasource: string,\n callback: () => Promise<T>,\n ): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n LookupStats.write(datasource, duration);\n return result;\n }\n\n static getReport(): Record<string, TimingStatsReport> {\n const report: Record<string, TimingStatsReport> = {};\n const data = memCache.get<LookupStatsData>('lookup-stats') ?? {};\n for (const [datasource, durations] of Object.entries(data)) {\n report[datasource] = makeTimingReport(durations);\n }\n return report;\n }\n\n static report(): void {\n const report = LookupStats.getReport();\n logger.debug(report, 'Lookup statistics');\n }\n}\n\ninterface GetReleasesDataPoint {\n datasource: string;\n registryUrl: string;\n packageName: string;\n duration: number;\n}\n\ninterface getReleaseStatsInternalPackages<T> {\n stats: T;\n packages: Record<string, T>;\n}\n\n/**\n * Internal structure that represents the hierarchical structure of the data. We use this\n * to handle the duration datapoints, and then convert to the final report structure.\n */\ninterface getReleaseStatsInternal<T, P = T> {\n // Overall stats\n stats: T;\n datasources: Record<\n string,\n {\n // Datasource stats.\n stats: T;\n registryUrls: Record<\n string,\n [P] extends [never]\n ? Omit<getReleaseStatsInternalPackages<T>, 'packages'>\n : getReleaseStatsInternalPackages<T>\n >;\n }\n >;\n}\n\nexport type GetReleaseStatsReport = getReleaseStatsInternal<TimingStatsReport>;\n\n// Short report does not include package stats.\nexport type GetReleaseStatsReportShort = getReleaseStatsInternal<\n TimingStatsReport,\n never\n>;\n\nexport class GetDatasourceReleasesStats {\n static write(\n datasource: string,\n registryUrl: string,\n packageName: string,\n duration: number,\n ): void {\n const data =\n memCache.get<GetReleasesDataPoint[]>('get-releases-stats') ?? [];\n data.push({ datasource, registryUrl, packageName, duration });\n memCache.set('get-releases-stats', data);\n }\n\n static async wrap<T>(\n datasource: string,\n registryUrl: string,\n packageName: string,\n callback: () => Promise<T>,\n ): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n this.write(datasource, registryUrl, packageName, duration);\n return result;\n }\n\n static getReport(): GetReleaseStatsReport {\n const data =\n memCache.get<GetReleasesDataPoint[]>('get-releases-stats') ?? [];\n\n // Process all datapoints into a hierarchical structure of datasource, registry url, and package name.\n const durationData: getReleaseStatsInternal<number[]> = {\n stats: [],\n datasources: {},\n };\n for (const { datasource, registryUrl, packageName, duration } of data) {\n durationData.stats.push(duration);\n\n durationData.datasources[datasource] ??= { stats: [], registryUrls: {} };\n durationData.datasources[datasource].stats.push(duration);\n\n durationData.datasources[datasource].registryUrls[registryUrl] ??= {\n stats: [],\n packages: {},\n };\n durationData.datasources[datasource].registryUrls[registryUrl].stats.push(\n duration,\n );\n\n durationData.datasources[datasource].registryUrls[registryUrl].packages[\n packageName\n ] ??= [];\n durationData.datasources[datasource].registryUrls[registryUrl].packages[\n packageName\n ].push(duration);\n }\n\n const report: GetReleaseStatsReport = {\n stats: makeTimingReport(durationData.stats),\n datasources: {},\n };\n\n for (const [datasource, datasourceData] of Object.entries(\n durationData.datasources,\n )) {\n report.datasources[datasource] = {\n stats: makeTimingReport(datasourceData.stats),\n registryUrls: {},\n };\n\n for (const [registryUrl, registryUrlData] of Object.entries(\n datasourceData.registryUrls,\n )) {\n report.datasources[datasource].registryUrls[registryUrl] = {\n stats: makeTimingReport(registryUrlData.stats),\n packages: {},\n };\n\n for (const [packageName, packageNameData] of Object.entries(\n registryUrlData.packages,\n )) {\n report.datasources[datasource].registryUrls[registryUrl].packages[\n packageName\n ] = makeTimingReport(packageNameData);\n }\n }\n }\n\n return report;\n }\n\n static report(): void {\n const report = this.getReport();\n\n const shortReport: GetReleaseStatsReportShort = {\n stats: report.stats,\n datasources: {},\n };\n\n for (const [datasource, datasourceData] of Object.entries(\n report.datasources,\n )) {\n shortReport.datasources[datasource] = {\n stats: datasourceData.stats,\n registryUrls: {},\n };\n for (const [registryUrl, registryUrlData] of Object.entries(\n datasourceData.registryUrls,\n )) {\n shortReport.datasources[datasource].registryUrls[registryUrl] = {\n stats: registryUrlData.stats,\n };\n }\n }\n\n logger.trace(report, 'getReleases statistics with packages');\n logger.debug(shortReport, 'getReleases statistics summary');\n }\n}\n\ntype PackageCacheData = number[];\n\nexport class PackageCacheStats {\n static writeSet(duration: number): void {\n const data = memCache.get<PackageCacheData>('package-cache-sets') ?? [];\n data.push(duration);\n memCache.set('package-cache-sets', data);\n }\n\n static async wrapSet<T>(callback: () => Promise<T>): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n PackageCacheStats.writeSet(duration);\n return result;\n }\n\n static writeGet(duration: number): void {\n const data = memCache.get<PackageCacheData>('package-cache-gets') ?? [];\n data.push(duration);\n memCache.set('package-cache-gets', data);\n }\n\n static async wrapGet<T>(callback: () => Promise<T>): Promise<T> {\n const start = Date.now();\n const result = await callback();\n const duration = Date.now() - start;\n PackageCacheStats.writeGet(duration);\n return result;\n }\n\n static getReport(): { get: TimingStatsReport; set: TimingStatsReport } {\n const packageCacheGets =\n memCache.get<PackageCacheData>('package-cache-gets') ?? [];\n const get = makeTimingReport(packageCacheGets);\n\n const packageCacheSets =\n memCache.get<PackageCacheData>('package-cache-sets') ?? [];\n const set = makeTimingReport(packageCacheSets);\n\n return { get, set };\n }\n\n static report(): void {\n const report = PackageCacheStats.getReport();\n logger.debug(report, 'Package cache statistics');\n }\n}\n\ninterface DatasourceCacheDataPoint {\n datasource: string;\n registryUrl: string;\n packageName: string;\n action: 'hit' | 'miss' | 'set' | 'skip';\n}\n\ninterface DatasourceCacheLongEntry {\n read?: 'hit' | 'miss';\n write?: 'set' | 'skip';\n}\n\ninterface DatasourceCacheShortEntry {\n hit: number;\n miss: number;\n set: number;\n skip: number;\n}\n\ntype DatasourceCacheLong = Record<\n string,\n Record<string, Record<string, DatasourceCacheLongEntry>>\n>;\n\ntype DatasourceCacheShort = Record<\n string,\n Record<string, DatasourceCacheShortEntry>\n>;\n\nexport interface DatasourceCacheReport {\n long: DatasourceCacheLong;\n short: DatasourceCacheShort;\n}\n\nexport class DatasourceCacheStats {\n private static getData(): DatasourceCacheDataPoint[] {\n return (\n memCache.get<DatasourceCacheDataPoint[]>('datasource-cache-stats') ?? []\n );\n }\n\n private static setData(data: DatasourceCacheDataPoint[]): void {\n memCache.set('datasource-cache-stats', data);\n }\n\n static hit(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'hit' });\n this.setData(data);\n }\n\n static miss(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'miss' });\n this.setData(data);\n }\n\n static set(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'set' });\n this.setData(data);\n }\n\n static skip(\n datasource: string,\n registryUrl: string,\n packageName: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, registryUrl, packageName, action: 'skip' });\n this.setData(data);\n }\n\n static getReport(): DatasourceCacheReport {\n const data = this.getData();\n const result: DatasourceCacheReport = { long: {}, short: {} };\n for (const { datasource, registryUrl, packageName, action } of data) {\n result.long[datasource] ??= {};\n result.long[datasource][registryUrl] ??= {};\n result.long[datasource][registryUrl] ??= {};\n result.long[datasource][registryUrl][packageName] ??= {};\n\n result.short[datasource] ??= {};\n result.short[datasource][registryUrl] ??= {\n hit: 0,\n miss: 0,\n set: 0,\n skip: 0,\n };\n\n if (action === 'hit') {\n result.long[datasource][registryUrl][packageName].read = 'hit';\n result.short[datasource][registryUrl].hit += 1;\n continue;\n }\n\n if (action === 'miss') {\n result.long[datasource][registryUrl][packageName].read = 'miss';\n result.short[datasource][registryUrl].miss += 1;\n continue;\n }\n\n if (action === 'set') {\n result.long[datasource][registryUrl][packageName].write = 'set';\n result.short[datasource][registryUrl].set += 1;\n continue;\n }\n\n /* v8 ignore else -- TODO: add tests #40625 */\n if (action === 'skip') {\n result.long[datasource][registryUrl][packageName].write = 'skip';\n result.short[datasource][registryUrl].skip += 1;\n continue;\n }\n }\n\n return result;\n }\n\n static report(): void {\n const { long, short } = this.getReport();\n\n if (Object.keys(short).length > 0) {\n logger.debug(short, 'Datasource cache statistics');\n }\n\n if (Object.keys(long).length > 0) {\n logger.trace(long, 'Datasource cache detailed statistics');\n }\n }\n}\n\nexport interface HttpRequestStatsDataPoint {\n method: string;\n url: string;\n reqMs: number;\n queueMs: number;\n status: number;\n}\n\ninterface HostStatsData {\n count: number;\n reqAvgMs: number;\n reqMedianMs: number;\n reqMaxMs: number;\n queueAvgMs: number;\n queueMedianMs: number;\n queueMaxMs: number;\n}\n\n// url -> method -> status -> count\ntype UrlHttpStat = Record<string, Record<string, Record<string, number>>>;\n\ninterface HttpStatsCollection {\n // debug data\n urls: UrlHttpStat;\n hosts: Record<string, HostStatsData>;\n requests: number;\n\n // trace data\n rawRequests: string[];\n hostRequests: Record<string, HttpRequestStatsDataPoint[]>;\n}\n\nexport class HttpStats {\n static write(data: HttpRequestStatsDataPoint): void {\n const httpRequests =\n memCache.get<HttpRequestStatsDataPoint[]>('http-requests') ?? [];\n httpRequests.push(data);\n memCache.set('http-requests', httpRequests);\n }\n\n static getDataPoints(): HttpRequestStatsDataPoint[] {\n const httpRequests =\n memCache.get<HttpRequestStatsDataPoint[]>('http-requests') ?? [];\n\n // istanbul ignore next: sorting is hard and not worth testing\n httpRequests.sort((a, b) => {\n if (a.url < b.url) {\n return -1;\n }\n\n if (a.url > b.url) {\n return 1;\n }\n\n return 0;\n });\n\n return httpRequests;\n }\n\n static getReport(): HttpStatsCollection {\n const dataPoints = HttpStats.getDataPoints();\n\n const requests = dataPoints.length;\n\n const urls: UrlHttpStat = {};\n const rawRequests: string[] = [];\n const hostRequests: Record<string, HttpRequestStatsDataPoint[]> = {};\n\n for (const dataPoint of dataPoints) {\n const { url, reqMs, queueMs, status } = dataPoint;\n const method = dataPoint.method.toUpperCase();\n\n const parsedUrl = parseUrl(url);\n if (!parsedUrl) {\n logger.debug({ url }, 'Failed to parse URL during stats reporting');\n continue;\n }\n const { hostname, origin, pathname } = parsedUrl;\n const baseUrl = `${origin}${pathname}`;\n\n urls[baseUrl] ??= {};\n urls[baseUrl][method] ??= {};\n urls[baseUrl][method][status] ??= 0;\n urls[baseUrl][method][status] += 1;\n\n rawRequests.push(`${method} ${url} ${status} ${reqMs} ${queueMs}`);\n\n hostRequests[hostname] ??= [];\n hostRequests[hostname].push(dataPoint);\n }\n\n const hosts: Record<string, HostStatsData> = {};\n\n for (const [hostname, dataPoints] of Object.entries(hostRequests)) {\n const count = dataPoints.length;\n\n const reqTimes = dataPoints.map((r) => r.reqMs);\n const queueTimes = dataPoints.map((r) => r.queueMs);\n\n const reqReport = makeTimingReport(reqTimes);\n const queueReport = makeTimingReport(queueTimes);\n\n hosts[hostname] = {\n count,\n reqAvgMs: reqReport.avgMs,\n reqMedianMs: reqReport.medianMs,\n reqMaxMs: reqReport.maxMs,\n queueAvgMs: queueReport.avgMs,\n queueMedianMs: queueReport.medianMs,\n queueMaxMs: queueReport.maxMs,\n };\n }\n\n return {\n urls,\n rawRequests,\n hostRequests,\n hosts,\n requests,\n };\n }\n\n static report(): void {\n const { urls, rawRequests, hostRequests, hosts, requests } =\n HttpStats.getReport();\n logger.trace({ rawRequests, hostRequests }, 'HTTP full statistics');\n logger.debug({ hosts, requests }, 'HTTP statistics');\n logger.trace({ urls }, 'HTTP URL statistics');\n }\n}\n\ninterface HttpCacheHostStatsData {\n hit: number;\n miss: number;\n localHit?: number;\n localMiss?: number;\n}\n\ntype HttpCacheStatsData = Record<string, HttpCacheHostStatsData>;\n\nfunction sortObject<T>(obj: Record<string, T>): Record<string, T> {\n const result: Record<string, T> = {};\n for (const key of Object.keys(obj).sort()) {\n result[key] = obj[key];\n }\n return result;\n}\n\nexport class HttpCacheStats {\n static getData(): HttpCacheStatsData {\n return memCache.get<HttpCacheStatsData>('http-cache-stats') ?? {};\n }\n\n static read(key: string): HttpCacheHostStatsData {\n return (\n this.getData()?.[key] ?? {\n hit: 0,\n miss: 0,\n }\n );\n }\n\n static write(key: string, data: HttpCacheHostStatsData): void {\n const stats = memCache.get<HttpCacheStatsData>('http-cache-stats') ?? {};\n stats[key] = data;\n memCache.set('http-cache-stats', stats);\n }\n\n static getBaseUrl(url: string): string | null {\n const parsedUrl = parseUrl(url);\n if (!parsedUrl) {\n logger.debug({ url }, 'Failed to parse URL during cache stats');\n return null;\n }\n const { origin, pathname } = parsedUrl;\n const baseUrl = `${origin}${pathname}`;\n return baseUrl;\n }\n\n static incLocalHits(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.localHit ??= 0;\n stats.localHit += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incLocalMisses(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.localMiss ??= 0;\n stats.localMiss += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incRemoteHits(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.hit += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static incRemoteMisses(url: string): void {\n const baseUrl = HttpCacheStats.getBaseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (baseUrl) {\n const host = baseUrl;\n const stats = HttpCacheStats.read(host);\n stats.miss += 1;\n HttpCacheStats.write(host, stats);\n }\n }\n\n static report(): void {\n const data = HttpCacheStats.getData();\n let report: Record<string, Record<string, HttpCacheHostStatsData>> = {};\n for (const [url, stats] of Object.entries(data)) {\n const parsedUrl = parseUrl(url);\n /* v8 ignore else -- TODO: add tests #40625 */\n if (parsedUrl) {\n const { origin, pathname } = parsedUrl;\n report[origin] ??= {};\n report[origin][pathname] = stats;\n }\n }\n\n for (const [host, hostStats] of Object.entries(report)) {\n report[host] = sortObject(hostStats);\n }\n report = sortObject(report);\n\n logger.debug(report, 'HTTP cache statistics');\n }\n}\n\ntype ObsoleteCacheStats = Record<\n string,\n {\n count: number;\n }\n>;\n\n/* v8 ignore next: temporary code */\nexport class ObsoleteCacheHitLogger {\n static getData(): ObsoleteCacheStats {\n return memCache.get<ObsoleteCacheStats>('obsolete-cache-stats') ?? {};\n }\n\n static write(url: string): void {\n const data = this.getData();\n if (!data[url]) {\n data[url] = { count: 0 };\n }\n data[url].count++;\n memCache.set('obsolete-cache-stats', data);\n }\n\n static report(): void {\n const hits = this.getData();\n logger.debug(\n { count: Object.keys(hits).length, hits },\n 'Cache fallback URLs',\n );\n }\n}\n/* v8 ignore stop: temporary code */\n\ninterface AbandonedPackage {\n datasource: string;\n packageName: string;\n mostRecentTimestamp: string;\n}\n\ntype AbandonedPackageReport = Record<string, Record<string, string>>;\n\nexport class AbandonedPackageStats {\n static getData(): AbandonedPackage[] {\n return memCache.get<AbandonedPackage[]>('abandonment-stats') ?? [];\n }\n\n private static setData(data: AbandonedPackage[]): void {\n memCache.set('abandonment-stats', data);\n }\n\n static write(\n datasource: string,\n packageName: string,\n mostRecentTimestamp: string,\n ): void {\n const data = this.getData();\n data.push({ datasource, packageName, mostRecentTimestamp });\n this.setData(data);\n }\n\n static getReport(): AbandonedPackageReport {\n const data = this.getData();\n const result: AbandonedPackageReport = {};\n\n for (const { datasource, packageName, mostRecentTimestamp } of data) {\n result[datasource] ??= {};\n result[datasource][packageName] = mostRecentTimestamp;\n }\n\n const sortedResult: AbandonedPackageReport = {};\n for (const datasource of Object.keys(result).sort()) {\n sortedResult[datasource] = {};\n for (const packageName of Object.keys(result[datasource]).sort()) {\n sortedResult[datasource][packageName] = result[datasource][packageName];\n }\n }\n\n return sortedResult;\n }\n\n static report(): void {\n const report = this.getReport();\n if (Object.keys(report).length > 0) {\n logger.debug(report, 'Abandoned package statistics');\n }\n }\n}\n\ntype GitOperationStatsData = Record<GitOperationType, number[]>;\n\nexport class GitOperationStats {\n static write(operationType: GitOperationType, duration: number): void {\n const data =\n memCache.get<GitOperationStatsData>('git-operations-stats') ?? {};\n data[operationType] ??= [];\n data[operationType].push(duration);\n memCache.set('git-operations-stats', data);\n }\n\n static getReport(): Record<string, TimingStatsReport> {\n const report: Record<string, TimingStatsReport> = {};\n const data = memCache.get<LookupStatsData>('git-operations-stats') ?? {};\n for (const [operationType, durations] of Object.entries(data)) {\n report[operationType] = makeTimingReport(durations);\n report[operationType].totalMs = Math.ceil(report[operationType].totalMs);\n }\n\n return report;\n }\n\n static report(): void {\n const report = GitOperationStats.getReport();\n logger.debug(report, 'Git operations statistics');\n }\n}\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { GlobalConfig } from "../../config/global.js";
4
4
  import { resetRepositoryLogLevelRemaps } from "../../logger/remap.js";
5
5
  import { logger, setMeta } from "../../logger/index.js";
6
6
  import { getInheritedOrGlobal } from "../../util/common.js";
7
- import { AbandonedPackageStats, DatasourceCacheStats, GitOperationStats, HttpCacheStats, HttpStats, LookupStats, ObsoleteCacheHitLogger, PackageCacheStats } from "../../util/stats.js";
7
+ import { AbandonedPackageStats, DatasourceCacheStats, GetDatasourceReleasesStats, GitOperationStats, HttpCacheStats, HttpStats, LookupStats, ObsoleteCacheHitLogger, PackageCacheStats } from "../../util/stats.js";
8
8
  import { ATTR_RENOVATE_SPLIT } from "../../instrumentation/types.js";
9
9
  import { instrument } from "../../instrumentation/index.js";
10
10
  import { deleteLocalFile, privateCacheDir } from "../../util/fs/index.js";
@@ -121,6 +121,7 @@ async function renovateRepository(repoConfig, canRetry = true) {
121
121
  HttpStats.report();
122
122
  HttpCacheStats.report();
123
123
  LookupStats.report();
124
+ GetDatasourceReleasesStats.report();
124
125
  ObsoleteCacheHitLogger.report();
125
126
  AbandonedPackageStats.report();
126
127
  GitOperationStats.report();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../lib/workers/repository/index.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { applySecretsAndVariablesToConfig } from '../../config/secrets.ts';\nimport type { RenovateConfig } from '../../config/types.ts';\nimport {\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_FORKED,\n REPOSITORY_NO_CONFIG,\n} from '../../constants/error-messages.ts';\nimport { pkg } from '../../expose.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { addExtractionStats } from '../../instrumentation/reporting.ts';\nimport { ATTR_RENOVATE_SPLIT } from '../../instrumentation/types.ts';\nimport { logger, setMeta } from '../../logger/index.ts';\nimport { resetRepositoryLogLevelRemaps } from '../../logger/remap.ts';\nimport { getInheritedOrGlobal } from '../../util/common.ts';\nimport { removeDanglingContainers } from '../../util/exec/docker/index.ts';\nimport { deleteLocalFile, privateCacheDir } from '../../util/fs/index.ts';\nimport { isCloned } from '../../util/git/index.ts';\nimport { detectSemanticCommits } from '../../util/git/semantic.ts';\nimport * as queue from '../../util/http/queue.ts';\nimport * as throttle from '../../util/http/throttle.ts';\nimport { addSplit, getSplits, splitInit } from '../../util/split.ts';\nimport {\n AbandonedPackageStats,\n DatasourceCacheStats,\n GitOperationStats,\n HttpCacheStats,\n HttpStats,\n LookupStats,\n ObsoleteCacheHitLogger,\n PackageCacheStats,\n} from '../../util/stats.ts';\nimport { setBranchCache } from './cache.ts';\nimport { extractRepoProblems } from './common.ts';\nimport { configMigration } from './config-migration/index.ts';\nimport { ensureDependencyDashboard } from './dependency-dashboard.ts';\nimport handleError from './error.ts';\nimport { finalizeRepo } from './finalize/index.ts';\nimport { pruneStaleBranches } from './finalize/prune.ts';\nimport { initRepo } from './init/index.ts';\nimport { OnboardingState } from './onboarding/common.ts';\nimport { ensureOnboardingPr } from './onboarding/pr/index.ts';\nimport type { ExtractResult } from './process/extract-update.ts';\nimport { extractDependencies, updateRepo } from './process/index.ts';\nimport type { ProcessResult, RepositoryResult } from './result.ts';\nimport { processResult } from './result.ts';\n\n// istanbul ignore next\nexport async function renovateRepository(\n repoConfig: RenovateConfig,\n canRetry = true,\n): Promise<ProcessResult | undefined> {\n splitInit();\n\n let repoResult: ProcessResult | undefined;\n const { config, localDir, errorRes } = await instrument(\n 'init',\n async (): Promise<{\n config: RenovateConfig;\n localDir: string;\n errorRes?: string;\n }> => {\n let errorRes: RepositoryResult | undefined;\n let config = GlobalConfig.set(\n applySecretsAndVariablesToConfig({\n config: repoConfig,\n deleteVariables: false,\n deleteSecrets: false,\n }),\n );\n await removeDanglingContainers();\n setMeta({ repository: config.repository });\n logger.info({ renovateVersion: pkg.version }, 'Repository started');\n logger.trace({ config });\n queue.clear();\n throttle.clear();\n const localDir = GlobalConfig.get('localDir')!;\n\n try {\n await fs.ensureDir(localDir);\n logger.debug('Using localDir: ' + localDir);\n config = await initRepo(config);\n addSplit('init');\n } catch (err) /* istanbul ignore next */ {\n setMeta({ repository: config.repository });\n errorRes = await handleError(config, err);\n const pruneWhenErrors = [\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_FORKED,\n REPOSITORY_NO_CONFIG,\n ];\n if (pruneWhenErrors.includes(errorRes)) {\n await pruneStaleBranches(config, []);\n }\n repoResult = processResult(config, errorRes);\n }\n\n return { config, localDir, errorRes };\n },\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'init',\n },\n },\n );\n\n try {\n // only continue if init stage was successful\n if (errorRes) {\n throw new Error(errorRes);\n }\n\n const performExtract =\n config.repoIsOnboarded! ||\n !OnboardingState.onboardingCacheValid ||\n OnboardingState.prUpdateRequested;\n const extractResult = performExtract\n ? await extractDependencies(config)\n : emptyExtract();\n addExtractionStats(config, extractResult);\n\n const { branches, branchList, packageFiles } = extractResult;\n\n if (config.semanticCommits === 'auto') {\n config.semanticCommits = await detectSemanticCommits();\n }\n\n if (\n GlobalConfig.get('dryRun') !== 'lookup' &&\n GlobalConfig.get('dryRun') !== 'extract'\n ) {\n await instrument(\n 'onboarding',\n () => ensureOnboardingPr(config, packageFiles, branches),\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'onboarding',\n },\n },\n );\n addSplit('onboarding');\n const res = await instrument(\n 'update',\n () => updateRepo(config, branches),\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'update',\n },\n },\n );\n setMeta({ repository: config.repository });\n addSplit('update');\n if (performExtract) {\n await setBranchCache(branches); // update branch cache if performed extraction\n }\n if (res === 'automerged') {\n if (canRetry) {\n logger.info('Restarting repository job after automerge result');\n const recursiveRes = await renovateRepository(repoConfig, false);\n return recursiveRes;\n }\n logger.debug(`Automerged but already retried once`);\n } else {\n const configMigrationRes = await configMigration(config, branchList);\n await ensureDependencyDashboard(\n config,\n branches,\n packageFiles,\n configMigrationRes,\n );\n }\n await finalizeRepo(config, branchList, repoConfig);\n // TODO #22198\n repoResult = processResult(config, res!);\n }\n printRepositoryProblems(config.repository);\n } catch (err) /* istanbul ignore next */ {\n setMeta({ repository: config.repository });\n const errorRes = await handleError(config, err);\n const pruneWhenErrors = [\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_FORKED,\n REPOSITORY_NO_CONFIG,\n ];\n if (pruneWhenErrors.includes(errorRes)) {\n await pruneStaleBranches(config, []);\n }\n repoResult = processResult(config, errorRes);\n }\n if (localDir && !repoConfig.persistRepoData) {\n try {\n await deleteLocalFile('.');\n } catch (err) /* istanbul ignore if */ {\n logger.warn({ err }, 'localDir deletion error');\n }\n }\n try {\n await fs.remove(privateCacheDir());\n } catch (err) /* istanbul ignore if */ {\n logger.warn({ err }, 'privateCacheDir deletion error');\n }\n const splits = getSplits();\n logger.debug(splits, 'Repository timing splits (milliseconds)');\n PackageCacheStats.report();\n DatasourceCacheStats.report();\n HttpStats.report();\n HttpCacheStats.report();\n LookupStats.report();\n ObsoleteCacheHitLogger.report();\n AbandonedPackageStats.report();\n GitOperationStats.report();\n const cloned = isCloned();\n /* v8 ignore next 11 -- coverage not required of these `undefined` checks, as we're happy receiving an `undefined` in the logs */\n logger.info(\n {\n cloned,\n durationMs: splits.total,\n result: repoResult?.res,\n status: repoResult?.status,\n enabled: repoResult?.enabled,\n onboarded: repoResult?.onboarded,\n },\n 'Repository finished',\n );\n resetRepositoryLogLevelRemaps();\n return repoResult;\n}\n\n// istanbul ignore next: renovateRepository is ignored\nfunction emptyExtract(): ExtractResult {\n return instrument(\n 'extract',\n () => {\n addSplit('extract');\n addSplit('lookup');\n return {\n branches: [],\n branchList: [getInheritedOrGlobal('onboardingBranch')!], // to prevent auto closing\n packageFiles: {},\n };\n },\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'extract',\n },\n },\n );\n}\n\nexport function printRepositoryProblems(repository: string | undefined): void {\n const repoProblems = extractRepoProblems(repository);\n if (repoProblems.size) {\n logger.debug(\n { repoProblems: Array.from(repoProblems) },\n 'repository problems',\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../lib/workers/repository/index.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { applySecretsAndVariablesToConfig } from '../../config/secrets.ts';\nimport type { RenovateConfig } from '../../config/types.ts';\nimport {\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_FORKED,\n REPOSITORY_NO_CONFIG,\n} from '../../constants/error-messages.ts';\nimport { pkg } from '../../expose.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { addExtractionStats } from '../../instrumentation/reporting.ts';\nimport { ATTR_RENOVATE_SPLIT } from '../../instrumentation/types.ts';\nimport { logger, setMeta } from '../../logger/index.ts';\nimport { resetRepositoryLogLevelRemaps } from '../../logger/remap.ts';\nimport { getInheritedOrGlobal } from '../../util/common.ts';\nimport { removeDanglingContainers } from '../../util/exec/docker/index.ts';\nimport { deleteLocalFile, privateCacheDir } from '../../util/fs/index.ts';\nimport { isCloned } from '../../util/git/index.ts';\nimport { detectSemanticCommits } from '../../util/git/semantic.ts';\nimport * as queue from '../../util/http/queue.ts';\nimport * as throttle from '../../util/http/throttle.ts';\nimport { addSplit, getSplits, splitInit } from '../../util/split.ts';\nimport {\n AbandonedPackageStats,\n DatasourceCacheStats,\n GetDatasourceReleasesStats,\n GitOperationStats,\n HttpCacheStats,\n HttpStats,\n LookupStats,\n ObsoleteCacheHitLogger,\n PackageCacheStats,\n} from '../../util/stats.ts';\nimport { setBranchCache } from './cache.ts';\nimport { extractRepoProblems } from './common.ts';\nimport { configMigration } from './config-migration/index.ts';\nimport { ensureDependencyDashboard } from './dependency-dashboard.ts';\nimport handleError from './error.ts';\nimport { finalizeRepo } from './finalize/index.ts';\nimport { pruneStaleBranches } from './finalize/prune.ts';\nimport { initRepo } from './init/index.ts';\nimport { OnboardingState } from './onboarding/common.ts';\nimport { ensureOnboardingPr } from './onboarding/pr/index.ts';\nimport type { ExtractResult } from './process/extract-update.ts';\nimport { extractDependencies, updateRepo } from './process/index.ts';\nimport type { ProcessResult, RepositoryResult } from './result.ts';\nimport { processResult } from './result.ts';\n\n// istanbul ignore next\nexport async function renovateRepository(\n repoConfig: RenovateConfig,\n canRetry = true,\n): Promise<ProcessResult | undefined> {\n splitInit();\n\n let repoResult: ProcessResult | undefined;\n const { config, localDir, errorRes } = await instrument(\n 'init',\n async (): Promise<{\n config: RenovateConfig;\n localDir: string;\n errorRes?: string;\n }> => {\n let errorRes: RepositoryResult | undefined;\n let config = GlobalConfig.set(\n applySecretsAndVariablesToConfig({\n config: repoConfig,\n deleteVariables: false,\n deleteSecrets: false,\n }),\n );\n await removeDanglingContainers();\n setMeta({ repository: config.repository });\n logger.info({ renovateVersion: pkg.version }, 'Repository started');\n logger.trace({ config });\n queue.clear();\n throttle.clear();\n const localDir = GlobalConfig.get('localDir')!;\n\n try {\n await fs.ensureDir(localDir);\n logger.debug('Using localDir: ' + localDir);\n config = await initRepo(config);\n addSplit('init');\n } catch (err) /* istanbul ignore next */ {\n setMeta({ repository: config.repository });\n errorRes = await handleError(config, err);\n const pruneWhenErrors = [\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_FORKED,\n REPOSITORY_NO_CONFIG,\n ];\n if (pruneWhenErrors.includes(errorRes)) {\n await pruneStaleBranches(config, []);\n }\n repoResult = processResult(config, errorRes);\n }\n\n return { config, localDir, errorRes };\n },\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'init',\n },\n },\n );\n\n try {\n // only continue if init stage was successful\n if (errorRes) {\n throw new Error(errorRes);\n }\n\n const performExtract =\n config.repoIsOnboarded! ||\n !OnboardingState.onboardingCacheValid ||\n OnboardingState.prUpdateRequested;\n const extractResult = performExtract\n ? await extractDependencies(config)\n : emptyExtract();\n addExtractionStats(config, extractResult);\n\n const { branches, branchList, packageFiles } = extractResult;\n\n if (config.semanticCommits === 'auto') {\n config.semanticCommits = await detectSemanticCommits();\n }\n\n if (\n GlobalConfig.get('dryRun') !== 'lookup' &&\n GlobalConfig.get('dryRun') !== 'extract'\n ) {\n await instrument(\n 'onboarding',\n () => ensureOnboardingPr(config, packageFiles, branches),\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'onboarding',\n },\n },\n );\n addSplit('onboarding');\n const res = await instrument(\n 'update',\n () => updateRepo(config, branches),\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'update',\n },\n },\n );\n setMeta({ repository: config.repository });\n addSplit('update');\n if (performExtract) {\n await setBranchCache(branches); // update branch cache if performed extraction\n }\n if (res === 'automerged') {\n if (canRetry) {\n logger.info('Restarting repository job after automerge result');\n const recursiveRes = await renovateRepository(repoConfig, false);\n return recursiveRes;\n }\n logger.debug(`Automerged but already retried once`);\n } else {\n const configMigrationRes = await configMigration(config, branchList);\n await ensureDependencyDashboard(\n config,\n branches,\n packageFiles,\n configMigrationRes,\n );\n }\n await finalizeRepo(config, branchList, repoConfig);\n // TODO #22198\n repoResult = processResult(config, res!);\n }\n printRepositoryProblems(config.repository);\n } catch (err) /* istanbul ignore next */ {\n setMeta({ repository: config.repository });\n const errorRes = await handleError(config, err);\n const pruneWhenErrors = [\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_FORKED,\n REPOSITORY_NO_CONFIG,\n ];\n if (pruneWhenErrors.includes(errorRes)) {\n await pruneStaleBranches(config, []);\n }\n repoResult = processResult(config, errorRes);\n }\n if (localDir && !repoConfig.persistRepoData) {\n try {\n await deleteLocalFile('.');\n } catch (err) /* istanbul ignore if */ {\n logger.warn({ err }, 'localDir deletion error');\n }\n }\n try {\n await fs.remove(privateCacheDir());\n } catch (err) /* istanbul ignore if */ {\n logger.warn({ err }, 'privateCacheDir deletion error');\n }\n const splits = getSplits();\n logger.debug(splits, 'Repository timing splits (milliseconds)');\n PackageCacheStats.report();\n DatasourceCacheStats.report();\n HttpStats.report();\n HttpCacheStats.report();\n LookupStats.report();\n GetDatasourceReleasesStats.report();\n ObsoleteCacheHitLogger.report();\n AbandonedPackageStats.report();\n GitOperationStats.report();\n const cloned = isCloned();\n /* v8 ignore next 11 -- coverage not required of these `undefined` checks, as we're happy receiving an `undefined` in the logs */\n logger.info(\n {\n cloned,\n durationMs: splits.total,\n result: repoResult?.res,\n status: repoResult?.status,\n enabled: repoResult?.enabled,\n onboarded: repoResult?.onboarded,\n },\n 'Repository finished',\n );\n resetRepositoryLogLevelRemaps();\n return repoResult;\n}\n\n// istanbul ignore next: renovateRepository is ignored\nfunction emptyExtract(): ExtractResult {\n return instrument(\n 'extract',\n () => {\n addSplit('extract');\n addSplit('lookup');\n return {\n branches: [],\n branchList: [getInheritedOrGlobal('onboardingBranch')!], // to prevent auto closing\n packageFiles: {},\n };\n },\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'extract',\n },\n },\n );\n}\n\nexport function printRepositoryProblems(repository: string | undefined): void {\n const repoProblems = extractRepoProblems(repository);\n if (repoProblems.size) {\n logger.debug(\n { repoProblems: Array.from(repoProblems) },\n 'repository problems',\n );\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { NO_VULNERABILITY_ALERTS } from "../../../constants/error-messages.js";
2
2
  import { escapeRegExp } from "../../../util/regex.js";
3
+ import { titleCase } from "../../../util/string.js";
3
4
  import { logger } from "../../../logger/index.js";
4
5
  import { id } from "../../../modules/versioning/pep440/index.js";
5
6
  import { GithubTagsDatasource } from "../../../modules/datasource/github-tags/index.js";
@@ -12,10 +13,11 @@ import { id as id$3 } from "../../../modules/versioning/ruby/index.js";
12
13
  import { GoDatasource } from "../../../modules/datasource/go/index.js";
13
14
  import { id as id$4 } from "../../../modules/versioning/composer/index.js";
14
15
  import { get } from "../../../modules/versioning/index.js";
15
- import "../../../util/vulnerability/utils.js";
16
+ import { getHighestVulnerabilitySeverity } from "../../../util/vulnerability/utils.js";
16
17
  import { platform } from "../../../modules/platform/index.js";
17
18
  import { sanitizeMarkdown } from "../../../util/markdown.js";
18
19
  import { githubEcosystemToDatasource } from "../../../util/vulnerability/ecosystem.js";
20
+ import is from "@sindresorhus/is";
19
21
  //#region lib/workers/repository/init/vulnerability.ts
20
22
  async function detectVulnerabilityAlerts(input) {
21
23
  if (!input?.vulnerabilityAlerts) return input;
@@ -58,6 +60,7 @@ async function detectVulnerabilityAlerts(input) {
58
60
  combinedAlerts[fileName][datasource][depName] ??= { advisories: [] };
59
61
  const alertDetails = combinedAlerts[fileName][datasource][depName];
60
62
  alertDetails.advisories.push(advisory);
63
+ alertDetails.severity = getHighestVulnerabilitySeverity({ vulnerabilitySeverity: alertDetails.severity }, { vulnerabilitySeverity: alert.security_vulnerability.severity });
61
64
  const versioningApi = get(versionings[datasource]);
62
65
  if (versioningApi.isVersion(firstPatchedVersion)) {
63
66
  if (!alertDetails.firstPatchedVersion || versioningApi.isGreaterThan(firstPatchedVersion, alertDetails.firstPatchedVersion)) alertDetails.firstPatchedVersion = firstPatchedVersion;
@@ -83,6 +86,13 @@ async function detectVulnerabilityAlerts(input) {
83
86
  content += heading;
84
87
  content += "\n\n";
85
88
  content += sanitizeMarkdown(description);
89
+ content += "\n\n##### Severity\n";
90
+ const { cvss_v4, cvss_v3 } = advisory.cvss_severities ?? {};
91
+ const cvss = cvss_v4?.vector_string ? cvss_v4 : cvss_v3;
92
+ if (is.number(cvss?.score) && cvss?.vector_string) {
93
+ content += `- CVSS Score: ${cvss.score.toFixed(1)} / 10 (${titleCase(advisory.severity)})\n`;
94
+ content += `- Vector String: \`${cvss.vector_string}\``;
95
+ } else content += titleCase(advisory.severity);
86
96
  return content;
87
97
  }));
88
98
  } catch (err) /* istanbul ignore next */ {
@@ -101,6 +111,7 @@ async function detectVulnerabilityAlerts(input) {
101
111
  ...matchRule,
102
112
  matchCurrentVersion,
103
113
  vulnerabilityFixVersion: val.firstPatchedVersion,
114
+ vulnerabilitySeverity: val.severity,
104
115
  prBodyNotes,
105
116
  isVulnerabilityAlert: true,
106
117
  force: { ...config.vulnerabilityAlerts }
@@ -1 +1 @@
1
- {"version":3,"file":"vulnerability.js","names":["semverVersioning.id","composerVersioning.id","mavenVersioning.id","pep440Versioning.id","rubyVersioning.id","allVersioning.get"],"sources":["../../../../lib/workers/repository/init/vulnerability.ts"],"sourcesContent":["import type { PackageRule, RenovateConfig } from '../../../config/types.ts';\nimport { NO_VULNERABILITY_ALERTS } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { GithubTagsDatasource } from '../../../modules/datasource/github-tags/index.ts';\nimport { GoDatasource } from '../../../modules/datasource/go/index.ts';\nimport { MavenDatasource } from '../../../modules/datasource/maven/index.ts';\nimport { NugetDatasource } from '../../../modules/datasource/nuget/index.ts';\nimport type { SecurityAdvisory } from '../../../modules/platform/github/schema.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport * as composerVersioning from '../../../modules/versioning/composer/index.ts';\nimport * as allVersioning from '../../../modules/versioning/index.ts';\nimport * as mavenVersioning from '../../../modules/versioning/maven/index.ts';\nimport * as npmVersioning from '../../../modules/versioning/npm/index.ts';\nimport * as pep440Versioning from '../../../modules/versioning/pep440/index.ts';\nimport * as rubyVersioning from '../../../modules/versioning/ruby/index.ts';\nimport * as semverVersioning from '../../../modules/versioning/semver/index.ts';\nimport { sanitizeMarkdown } from '../../../util/markdown.ts';\nimport { escapeRegExp } from '../../../util/regex.ts';\nimport { githubEcosystemToDatasource } from '../../../util/vulnerability/ecosystem.ts';\nimport { getFixedVersionConstraint } from '../../../util/vulnerability/utils.ts';\n\ntype Datasource = string;\ntype DependencyName = string;\ntype FileName = string;\n\ntype CombinedAlert = Record<\n FileName,\n Record<\n Datasource,\n Record<\n DependencyName,\n {\n advisories: SecurityAdvisory[];\n fileType?: string;\n firstPatchedVersion?: string;\n }\n >\n >\n>;\n\nexport function getFixedVersionByDatasource(\n fixedVersion: string,\n datasource: string,\n): string {\n return getFixedVersionConstraint(fixedVersion, datasource);\n}\n\n// TODO can return `null` and `undefined` (#22198)\nexport async function detectVulnerabilityAlerts(\n input: RenovateConfig,\n): Promise<RenovateConfig> {\n if (!input?.vulnerabilityAlerts) {\n return input;\n }\n if (input.vulnerabilityAlerts.enabled === false) {\n logger.debug('Vulnerability alerts are disabled');\n return input;\n }\n const alerts = await platform.getVulnerabilityAlerts?.();\n if (!alerts?.length) {\n logger.debug('No vulnerability alerts found');\n if (input.vulnerabilityAlertsOnly) {\n throw new Error(NO_VULNERABILITY_ALERTS);\n }\n return input;\n }\n const config = { ...input };\n const versionings: Record<string, string> = {\n 'github-tags': semverVersioning.id,\n go: semverVersioning.id,\n packagist: composerVersioning.id,\n maven: mavenVersioning.id,\n npm: npmVersioning.id,\n nuget: semverVersioning.id,\n pypi: pep440Versioning.id,\n rubygems: rubyVersioning.id,\n };\n const combinedAlerts: CombinedAlert = {};\n for (const alert of alerts) {\n try {\n if (alert.dismissed_reason) {\n continue;\n }\n if (!alert.security_vulnerability?.first_patched_version) {\n logger.debug(\n { alert },\n 'Vulnerability alert has no firstPatchedVersion - skipping',\n );\n continue;\n }\n const datasource =\n githubEcosystemToDatasource[\n alert.security_vulnerability.package.ecosystem\n ];\n const depName = alert.security_vulnerability.package.name;\n const fileName = alert.dependency.manifest_path;\n const fileType = fileName.split('/').pop();\n const firstPatchedVersion =\n alert.security_vulnerability.first_patched_version.identifier;\n const advisory = alert.security_advisory;\n\n combinedAlerts[fileName] ??= {};\n combinedAlerts[fileName][datasource] ??= {};\n combinedAlerts[fileName][datasource][depName] ??= {\n advisories: [],\n };\n const alertDetails = combinedAlerts[fileName][datasource][depName];\n alertDetails.advisories.push(advisory);\n const versioningApi = allVersioning.get(versionings[datasource]);\n if (versioningApi.isVersion(firstPatchedVersion)) {\n if (\n !alertDetails.firstPatchedVersion ||\n versioningApi.isGreaterThan(\n firstPatchedVersion,\n alertDetails.firstPatchedVersion,\n )\n ) {\n alertDetails.firstPatchedVersion = firstPatchedVersion;\n }\n } else {\n logger.debug('Invalid firstPatchedVersion: ' + firstPatchedVersion);\n }\n alertDetails.fileType = fileType;\n } catch (err) {\n logger.warn({ err }, 'Error parsing vulnerability alert');\n }\n }\n const alertPackageRules: PackageRule[] = [];\n config.remediations = {} as never;\n for (const [fileName, files] of Object.entries(combinedAlerts)) {\n for (const [datasource, dependencies] of Object.entries(files)) {\n for (const [depName, val] of Object.entries(dependencies)) {\n if (!val.firstPatchedVersion) {\n continue;\n }\n\n let prBodyNotes: string[] = [];\n try {\n prBodyNotes = ['### GitHub Vulnerability Alerts'].concat(\n val.advisories.map((advisory) => {\n const identifiers = advisory.identifiers;\n const description = advisory.description;\n let content = '#### ';\n let heading: string;\n if (identifiers.some((id) => id.type === 'CVE')) {\n heading = identifiers\n .filter((id) => id.type === 'CVE')\n .map((id) => id.value)\n .join(' / ');\n } else {\n heading = identifiers.map((id) => id.value).join(' / ');\n }\n if (advisory.references?.length) {\n heading = `[${heading}](${advisory.references[0].url})`;\n }\n content += heading;\n content += '\\n\\n';\n\n content += sanitizeMarkdown(description);\n return content;\n }),\n );\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ err }, 'Error generating vulnerability PR notes');\n }\n // TODO: types (#22198)\n const matchFileNames =\n datasource === GoDatasource.id\n ? [fileName.replace('go.sum', 'go.mod')]\n : [fileName];\n let matchRule: PackageRule = {\n matchDatasources: [datasource],\n matchPackageNames: [depName],\n matchFileNames,\n };\n\n let matchCurrentVersion = `< ${val.firstPatchedVersion}`;\n if (\n datasource === MavenDatasource.id ||\n datasource === NugetDatasource.id\n ) {\n matchCurrentVersion = `(,${val.firstPatchedVersion})`;\n } else if (datasource === GithubTagsDatasource.id) {\n matchCurrentVersion = `!/^${escapeRegExp(val.firstPatchedVersion)}$/`;\n }\n\n // Remediate only direct dependencies\n matchRule = {\n ...matchRule,\n matchCurrentVersion,\n vulnerabilityFixVersion: val.firstPatchedVersion,\n prBodyNotes,\n isVulnerabilityAlert: true,\n force: {\n ...config.vulnerabilityAlerts,\n },\n };\n alertPackageRules.push(matchRule);\n }\n }\n }\n logger.debug({ alertPackageRules }, 'alert package rules');\n config.packageRules = (config.packageRules ?? []).concat(alertPackageRules);\n return config;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"vulnerability.js","names":["semverVersioning.id","composerVersioning.id","mavenVersioning.id","pep440Versioning.id","rubyVersioning.id","allVersioning.get"],"sources":["../../../../lib/workers/repository/init/vulnerability.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport type { PackageRule, RenovateConfig } from '../../../config/types.ts';\nimport { NO_VULNERABILITY_ALERTS } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { GithubTagsDatasource } from '../../../modules/datasource/github-tags/index.ts';\nimport { GoDatasource } from '../../../modules/datasource/go/index.ts';\nimport { MavenDatasource } from '../../../modules/datasource/maven/index.ts';\nimport { NugetDatasource } from '../../../modules/datasource/nuget/index.ts';\nimport type { SecurityAdvisory } from '../../../modules/platform/github/schema.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport * as composerVersioning from '../../../modules/versioning/composer/index.ts';\nimport * as allVersioning from '../../../modules/versioning/index.ts';\nimport * as mavenVersioning from '../../../modules/versioning/maven/index.ts';\nimport * as npmVersioning from '../../../modules/versioning/npm/index.ts';\nimport * as pep440Versioning from '../../../modules/versioning/pep440/index.ts';\nimport * as rubyVersioning from '../../../modules/versioning/ruby/index.ts';\nimport * as semverVersioning from '../../../modules/versioning/semver/index.ts';\nimport { sanitizeMarkdown } from '../../../util/markdown.ts';\nimport { escapeRegExp } from '../../../util/regex.ts';\nimport { titleCase } from '../../../util/string.ts';\nimport { githubEcosystemToDatasource } from '../../../util/vulnerability/ecosystem.ts';\nimport {\n getFixedVersionConstraint,\n getHighestVulnerabilitySeverity,\n} from '../../../util/vulnerability/utils.ts';\n\ntype Datasource = string;\ntype DependencyName = string;\ntype FileName = string;\n\ntype CombinedAlert = Record<\n FileName,\n Record<\n Datasource,\n Record<\n DependencyName,\n {\n advisories: SecurityAdvisory[];\n fileType?: string;\n firstPatchedVersion?: string;\n severity?: string;\n }\n >\n >\n>;\n\nexport function getFixedVersionByDatasource(\n fixedVersion: string,\n datasource: string,\n): string {\n return getFixedVersionConstraint(fixedVersion, datasource);\n}\n\n// TODO can return `null` and `undefined` (#22198)\nexport async function detectVulnerabilityAlerts(\n input: RenovateConfig,\n): Promise<RenovateConfig> {\n if (!input?.vulnerabilityAlerts) {\n return input;\n }\n if (input.vulnerabilityAlerts.enabled === false) {\n logger.debug('Vulnerability alerts are disabled');\n return input;\n }\n const alerts = await platform.getVulnerabilityAlerts?.();\n if (!alerts?.length) {\n logger.debug('No vulnerability alerts found');\n if (input.vulnerabilityAlertsOnly) {\n throw new Error(NO_VULNERABILITY_ALERTS);\n }\n return input;\n }\n const config = { ...input };\n const versionings: Record<string, string> = {\n 'github-tags': semverVersioning.id,\n go: semverVersioning.id,\n packagist: composerVersioning.id,\n maven: mavenVersioning.id,\n npm: npmVersioning.id,\n nuget: semverVersioning.id,\n pypi: pep440Versioning.id,\n rubygems: rubyVersioning.id,\n };\n const combinedAlerts: CombinedAlert = {};\n for (const alert of alerts) {\n try {\n if (alert.dismissed_reason) {\n continue;\n }\n if (!alert.security_vulnerability?.first_patched_version) {\n logger.debug(\n { alert },\n 'Vulnerability alert has no firstPatchedVersion - skipping',\n );\n continue;\n }\n const datasource =\n githubEcosystemToDatasource[\n alert.security_vulnerability.package.ecosystem\n ];\n const depName = alert.security_vulnerability.package.name;\n const fileName = alert.dependency.manifest_path;\n const fileType = fileName.split('/').pop();\n const firstPatchedVersion =\n alert.security_vulnerability.first_patched_version.identifier;\n const advisory = alert.security_advisory;\n\n combinedAlerts[fileName] ??= {};\n combinedAlerts[fileName][datasource] ??= {};\n combinedAlerts[fileName][datasource][depName] ??= {\n advisories: [],\n };\n const alertDetails = combinedAlerts[fileName][datasource][depName];\n alertDetails.advisories.push(advisory);\n alertDetails.severity = getHighestVulnerabilitySeverity(\n { vulnerabilitySeverity: alertDetails.severity },\n { vulnerabilitySeverity: alert.security_vulnerability.severity },\n );\n const versioningApi = allVersioning.get(versionings[datasource]);\n if (versioningApi.isVersion(firstPatchedVersion)) {\n if (\n !alertDetails.firstPatchedVersion ||\n versioningApi.isGreaterThan(\n firstPatchedVersion,\n alertDetails.firstPatchedVersion,\n )\n ) {\n alertDetails.firstPatchedVersion = firstPatchedVersion;\n }\n } else {\n logger.debug('Invalid firstPatchedVersion: ' + firstPatchedVersion);\n }\n alertDetails.fileType = fileType;\n } catch (err) {\n logger.warn({ err }, 'Error parsing vulnerability alert');\n }\n }\n const alertPackageRules: PackageRule[] = [];\n config.remediations = {} as never;\n for (const [fileName, files] of Object.entries(combinedAlerts)) {\n for (const [datasource, dependencies] of Object.entries(files)) {\n for (const [depName, val] of Object.entries(dependencies)) {\n if (!val.firstPatchedVersion) {\n continue;\n }\n\n let prBodyNotes: string[] = [];\n try {\n prBodyNotes = ['### GitHub Vulnerability Alerts'].concat(\n val.advisories.map((advisory) => {\n const identifiers = advisory.identifiers;\n const description = advisory.description;\n let content = '#### ';\n let heading: string;\n if (identifiers.some((id) => id.type === 'CVE')) {\n heading = identifiers\n .filter((id) => id.type === 'CVE')\n .map((id) => id.value)\n .join(' / ');\n } else {\n heading = identifiers.map((id) => id.value).join(' / ');\n }\n if (advisory.references?.length) {\n heading = `[${heading}](${advisory.references[0].url})`;\n }\n content += heading;\n content += '\\n\\n';\n\n content += sanitizeMarkdown(description);\n\n content += '\\n\\n##### Severity\\n';\n const { cvss_v4, cvss_v3 } = advisory.cvss_severities ?? {};\n const cvss = cvss_v4?.vector_string ? cvss_v4 : cvss_v3;\n if (is.number(cvss?.score) && cvss?.vector_string) {\n content += `- CVSS Score: ${cvss.score.toFixed(1)} / 10 (${titleCase(advisory.severity)})\\n`;\n content += `- Vector String: \\`${cvss.vector_string}\\``;\n } else {\n content += titleCase(advisory.severity);\n }\n\n return content;\n }),\n );\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ err }, 'Error generating vulnerability PR notes');\n }\n // TODO: types (#22198)\n const matchFileNames =\n datasource === GoDatasource.id\n ? [fileName.replace('go.sum', 'go.mod')]\n : [fileName];\n let matchRule: PackageRule = {\n matchDatasources: [datasource],\n matchPackageNames: [depName],\n matchFileNames,\n };\n\n let matchCurrentVersion = `< ${val.firstPatchedVersion}`;\n if (\n datasource === MavenDatasource.id ||\n datasource === NugetDatasource.id\n ) {\n matchCurrentVersion = `(,${val.firstPatchedVersion})`;\n } else if (datasource === GithubTagsDatasource.id) {\n matchCurrentVersion = `!/^${escapeRegExp(val.firstPatchedVersion)}$/`;\n }\n\n // Remediate only direct dependencies\n matchRule = {\n ...matchRule,\n matchCurrentVersion,\n vulnerabilityFixVersion: val.firstPatchedVersion,\n vulnerabilitySeverity: val.severity,\n prBodyNotes,\n isVulnerabilityAlert: true,\n force: {\n ...config.vulnerabilityAlerts,\n },\n };\n alertPackageRules.push(matchRule);\n }\n }\n }\n logger.debug({ alertPackageRules }, 'alert package rules');\n config.packageRules = (config.packageRules ?? []).concat(alertPackageRules);\n return config;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "43.118.2",
4
+ "version": "43.120.0",
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 43.118.2 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 43.120.0 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "43.118.2",
5
+ "x-renovate-version": "43.120.0",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "properties": {