renovate 43.277.0 → 43.278.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data/monorepo.js +1 -1
- package/dist/instrumentation/file-exporter.js +50 -0
- package/dist/instrumentation/file-exporter.js.map +1 -0
- package/dist/instrumentation/index.js +3 -1
- package/dist/instrumentation/index.js.map +1 -1
- package/dist/instrumentation/utils.js +8 -2
- package/dist/instrumentation/utils.js.map +1 -1
- package/dist/modules/manager/renovate-config/index.js +2 -2
- package/dist/modules/manager/renovate-config/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/package.json +2 -1
- package/renovate-schema.json +2 -2
package/dist/data/monorepo.js
CHANGED
|
@@ -581,7 +581,7 @@ var repoGroups = {
|
|
|
581
581
|
"quartznet": "https://github.com/quartznet/quartznet",
|
|
582
582
|
"radix-ui-primitives": "https://github.com/radix-ui/primitives",
|
|
583
583
|
"reach-ui": "https://github.com/reach/reach-ui",
|
|
584
|
-
"react": "https://github.com/
|
|
584
|
+
"react": "https://github.com/react/react",
|
|
585
585
|
"react-admin": "https://github.com/marmelab/react-admin",
|
|
586
586
|
"react-apollo": "https://github.com/apollographql/react-apollo",
|
|
587
587
|
"react-dnd": "https://github.com/react-dnd/react-dnd",
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { diag } from "@opentelemetry/api";
|
|
2
|
+
import { appendFile } from "node:fs/promises";
|
|
3
|
+
import { JsonTraceSerializer } from "@opentelemetry/otlp-transformer";
|
|
4
|
+
//#region lib/instrumentation/file-exporter.ts
|
|
5
|
+
const ExportResultCode = {
|
|
6
|
+
SUCCESS: 0,
|
|
7
|
+
FAILED: 1
|
|
8
|
+
};
|
|
9
|
+
var FileSpanExporter = class {
|
|
10
|
+
filePath;
|
|
11
|
+
stopped = false;
|
|
12
|
+
pendingWrites = /* @__PURE__ */ new Set();
|
|
13
|
+
constructor(filePath) {
|
|
14
|
+
this.filePath = filePath;
|
|
15
|
+
}
|
|
16
|
+
export(spans, resultCallback) {
|
|
17
|
+
if (this.stopped) {
|
|
18
|
+
resultCallback({ code: ExportResultCode.FAILED });
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const pending = this.writeSpans(spans).then(() => resultCallback({ code: ExportResultCode.SUCCESS }), (error) => {
|
|
22
|
+
diag.error("FileSpanExporter failed to write spans", error);
|
|
23
|
+
resultCallback({
|
|
24
|
+
code: ExportResultCode.FAILED,
|
|
25
|
+
error
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
this.pendingWrites.add(pending);
|
|
29
|
+
pending.finally(() => this.pendingWrites.delete(pending));
|
|
30
|
+
}
|
|
31
|
+
async writeSpans(spans) {
|
|
32
|
+
const serialized = JsonTraceSerializer.serializeRequest(spans);
|
|
33
|
+
/* v8 ignore start -- upstream type allows `undefined`, but the JSON serializer never returns it */
|
|
34
|
+
if (serialized === void 0) return;
|
|
35
|
+
/* v8 ignore stop */
|
|
36
|
+
const line = `${Buffer.from(serialized).toString("utf-8")}\n`;
|
|
37
|
+
await appendFile(this.filePath, line, "utf-8");
|
|
38
|
+
}
|
|
39
|
+
async shutdown() {
|
|
40
|
+
this.stopped = true;
|
|
41
|
+
await this.forceFlush();
|
|
42
|
+
}
|
|
43
|
+
async forceFlush() {
|
|
44
|
+
await Promise.all(this.pendingWrites);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
//#endregion
|
|
48
|
+
export { ExportResultCode, FileSpanExporter };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=file-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-exporter.js","names":[],"sources":["../../lib/instrumentation/file-exporter.ts"],"sourcesContent":["import { appendFile } from 'node:fs/promises';\nimport { diag } from '@opentelemetry/api';\nimport { JsonTraceSerializer } from '@opentelemetry/otlp-transformer';\nimport type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';\n\n// Taken from https://github.com/open-telemetry/opentelemetry-js/blob/2.10.0/packages/opentelemetry-core/src/ExportResult.ts and inlined, as we don't need to add an unnecessary dependency for this type that doesn't change.\n// A plain object is used instead of a real `enum`, since this repo runs `.ts` files directly via Node's type-stripping, which cannot emit runtime code for `enum`.\nexport const ExportResultCode = {\n SUCCESS: 0,\n FAILED: 1,\n} as const;\n\nexport type ExportResultCode =\n (typeof ExportResultCode)[keyof typeof ExportResultCode];\n\nexport class FileSpanExporter implements SpanExporter {\n private readonly filePath: string;\n private stopped = false;\n private readonly pendingWrites = new Set<Promise<void>>();\n\n constructor(filePath: string) {\n this.filePath = filePath;\n }\n\n export(\n spans: ReadableSpan[],\n resultCallback: (result: { code: number; error?: Error }) => void,\n ): void {\n if (this.stopped) {\n resultCallback({ code: ExportResultCode.FAILED });\n return;\n }\n\n const pending = this.writeSpans(spans).then(\n () => resultCallback({ code: ExportResultCode.SUCCESS }),\n (error) => {\n diag.error('FileSpanExporter failed to write spans', error);\n resultCallback({ code: ExportResultCode.FAILED, error });\n },\n );\n this.pendingWrites.add(pending);\n void pending.finally(() => this.pendingWrites.delete(pending));\n }\n\n private async writeSpans(spans: ReadableSpan[]): Promise<void> {\n const serialized = JsonTraceSerializer.serializeRequest(spans);\n /* v8 ignore start -- upstream type allows `undefined`, but the JSON serializer never returns it */\n if (serialized === undefined) {\n return;\n }\n /* v8 ignore stop */\n const line = `${Buffer.from(serialized).toString('utf-8')}\\n`;\n await appendFile(this.filePath, line, 'utf-8');\n }\n\n async shutdown(): Promise<void> {\n this.stopped = true;\n await this.forceFlush();\n }\n\n async forceFlush(): Promise<void> {\n await Promise.all(this.pendingWrites);\n }\n}\n"],"mappings":";;;;AAOA,MAAa,mBAAmB;CAC9B,SAAS;CACT,QAAQ;AACV;AAKA,IAAa,mBAAb,MAAsD;CACpD;CACA,UAAkB;CAClB,gCAAiC,IAAI,IAAmB;CAExD,YAAY,UAAkB;EAC5B,KAAK,WAAW;CAClB;CAEA,OACE,OACA,gBACM;EACN,IAAI,KAAK,SAAS;GAChB,eAAe,EAAE,MAAM,iBAAiB,OAAO,CAAC;GAChD;EACF;EAEA,MAAM,UAAU,KAAK,WAAW,KAAK,CAAC,CAAC,WAC/B,eAAe,EAAE,MAAM,iBAAiB,QAAQ,CAAC,IACtD,UAAU;GACT,KAAK,MAAM,0CAA0C,KAAK;GAC1D,eAAe;IAAE,MAAM,iBAAiB;IAAQ;GAAM,CAAC;EACzD,CACF;EACA,KAAK,cAAc,IAAI,OAAO;EAC9B,QAAa,cAAc,KAAK,cAAc,OAAO,OAAO,CAAC;CAC/D;CAEA,MAAc,WAAW,OAAsC;EAC7D,MAAM,aAAa,oBAAoB,iBAAiB,KAAK;;EAE7D,IAAI,eAAe,KAAA,GACjB;;EAGF,MAAM,OAAO,GAAG,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE;EAC1D,MAAM,WAAW,KAAK,UAAU,MAAM,OAAO;CAC/C;CAEA,MAAM,WAA0B;EAC9B,KAAK,UAAU;EACf,MAAM,KAAK,WAAW;CACxB;CAEA,MAAM,aAA4B;EAChC,MAAM,QAAQ,IAAI,KAAK,aAAa;CACtC;AACF"}
|
|
@@ -2,7 +2,8 @@ import { pkg } from "../expose.js";
|
|
|
2
2
|
import { GetDatasourceReleasesSpanProcessor } from "../modules/datasource/span-processor.js";
|
|
3
3
|
import { GitOperationSpanProcessor } from "../util/git/span-processor.js";
|
|
4
4
|
import { getResourceDetectors } from "./detectors.js";
|
|
5
|
-
import {
|
|
5
|
+
import { FileSpanExporter } from "./file-exporter.js";
|
|
6
|
+
import { getFileExporterPath, isFileExporterEnabled, isTraceDebuggingEnabled, isTraceSendingEnabled, isTracingEnabled, massageThrowable } from "./utils.js";
|
|
6
7
|
import { isPromise } from "@sindresorhus/is";
|
|
7
8
|
import { ClientRequest, ServerResponse } from "node:http";
|
|
8
9
|
import * as api from "@opentelemetry/api";
|
|
@@ -32,6 +33,7 @@ function init() {
|
|
|
32
33
|
const exporter = new OTLPTraceExporter();
|
|
33
34
|
spanProcessors.push(new BatchSpanProcessor(exporter));
|
|
34
35
|
}
|
|
36
|
+
if (isFileExporterEnabled()) spanProcessors.push(new BatchSpanProcessor(new FileSpanExporter(getFileExporterPath())));
|
|
35
37
|
const env = process.env;
|
|
36
38
|
const baseResource = resourceFromAttributes({
|
|
37
39
|
[ATTR_SERVICE_NAME]: env.OTEL_SERVICE_NAME ?? "renovate",
|
|
@@ -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 { 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":"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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 { FileSpanExporter } from './file-exporter.ts';\nimport type { RenovateSpanOptions } from './types.ts';\nimport {\n getFileExporterPath,\n isFileExporterEnabled,\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 if (isFileExporterEnabled()) {\n spanProcessors.push(\n new BatchSpanProcessor(new FileSpanExporter(getFileExporterPath())),\n );\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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"}
|
|
@@ -2,7 +2,7 @@ import { getEnv } from "../util/env.js";
|
|
|
2
2
|
import { isNullOrUndefined } from "@sindresorhus/is";
|
|
3
3
|
//#region lib/instrumentation/utils.ts
|
|
4
4
|
function isTracingEnabled() {
|
|
5
|
-
return isTraceDebuggingEnabled() || isTraceSendingEnabled();
|
|
5
|
+
return isTraceDebuggingEnabled() || isTraceSendingEnabled() || isFileExporterEnabled();
|
|
6
6
|
}
|
|
7
7
|
function isTraceDebuggingEnabled() {
|
|
8
8
|
return !!getEnv().RENOVATE_TRACING_CONSOLE_EXPORTER;
|
|
@@ -10,12 +10,18 @@ function isTraceDebuggingEnabled() {
|
|
|
10
10
|
function isTraceSendingEnabled() {
|
|
11
11
|
return !!getEnv().OTEL_EXPORTER_OTLP_ENDPOINT;
|
|
12
12
|
}
|
|
13
|
+
function isFileExporterEnabled() {
|
|
14
|
+
return !!getEnv().RENOVATE_TRACING_FILE_EXPORTER_PATH;
|
|
15
|
+
}
|
|
16
|
+
function getFileExporterPath() {
|
|
17
|
+
return getEnv().RENOVATE_TRACING_FILE_EXPORTER_PATH;
|
|
18
|
+
}
|
|
13
19
|
function massageThrowable(e) {
|
|
14
20
|
if (isNullOrUndefined(e)) return;
|
|
15
21
|
if (e instanceof Error) return e.message;
|
|
16
22
|
return String(e);
|
|
17
23
|
}
|
|
18
24
|
//#endregion
|
|
19
|
-
export { isTraceDebuggingEnabled, isTraceSendingEnabled, isTracingEnabled, massageThrowable };
|
|
25
|
+
export { getFileExporterPath, isFileExporterEnabled, isTraceDebuggingEnabled, isTraceSendingEnabled, isTracingEnabled, massageThrowable };
|
|
20
26
|
|
|
21
27
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../../lib/instrumentation/utils.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { getEnv } from '../util/env.ts';\n\nexport function isTracingEnabled(): boolean {\n return isTraceDebuggingEnabled()
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../lib/instrumentation/utils.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { getEnv } from '../util/env.ts';\n\nexport function isTracingEnabled(): boolean {\n return (\n isTraceDebuggingEnabled() ||\n isTraceSendingEnabled() ||\n isFileExporterEnabled()\n );\n}\n\nexport function isTraceDebuggingEnabled(): boolean {\n return !!getEnv().RENOVATE_TRACING_CONSOLE_EXPORTER;\n}\n\nexport function isTraceSendingEnabled(): boolean {\n return !!getEnv().OTEL_EXPORTER_OTLP_ENDPOINT;\n}\n\nexport function isFileExporterEnabled(): boolean {\n return !!getEnv().RENOVATE_TRACING_FILE_EXPORTER_PATH;\n}\n\nexport function getFileExporterPath(): string {\n return getEnv().RENOVATE_TRACING_FILE_EXPORTER_PATH!;\n}\n\nexport function massageThrowable(e: unknown): string | undefined {\n if (isNullOrUndefined(e)) {\n return undefined;\n }\n if (e instanceof Error) {\n return e.message;\n }\n return String(e); // oxlint-disable-line typescript/no-base-to-string\n}\n"],"mappings":";;;AAGA,SAAgB,mBAA4B;CAC1C,OACE,wBAAwB,KACxB,sBAAsB,KACtB,sBAAsB;AAE1B;AAEA,SAAgB,0BAAmC;CACjD,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;AACpB;AAEA,SAAgB,wBAAiC;CAC/C,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;AACpB;AAEA,SAAgB,wBAAiC;CAC/C,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;AACpB;AAEA,SAAgB,sBAA8B;CAC5C,OAAO,OAAO,CAAC,CAAC;AAClB;AAEA,SAAgB,iBAAiB,GAAgC;CAC/D,IAAI,kBAAkB,CAAC,GACrB;CAEF,IAAI,aAAa,OACf,OAAO,EAAE;CAEX,OAAO,OAAO,CAAC;AACjB"}
|
|
@@ -12,12 +12,12 @@ var renovate_config_exports = /* @__PURE__ */ __exportAll({
|
|
|
12
12
|
supportedDatasources: () => supportedDatasources
|
|
13
13
|
});
|
|
14
14
|
const defaultConfig = { managerFilePatterns: getConfigFileNames().filter((name) => name !== "package.json") };
|
|
15
|
-
const supportedDatasources = [
|
|
15
|
+
const supportedDatasources = Array.from(/* @__PURE__ */ new Set([
|
|
16
16
|
GithubTagsDatasource.id,
|
|
17
17
|
GitlabTagsDatasource.id,
|
|
18
18
|
GiteaTagsDatasource.id,
|
|
19
19
|
...Object.values(allToolConfig).map((conf) => conf.datasource)
|
|
20
|
-
];
|
|
20
|
+
]));
|
|
21
21
|
//#endregion
|
|
22
22
|
export { defaultConfig, extractPackageFile, renovate_config_exports, supportedDatasources };
|
|
23
23
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/renovate-config/index.ts"],"sourcesContent":["import { getConfigFileNames } from '../../../config/app-strings.ts';\nimport { allToolConfig } from '../../../util/exec/containerbase.ts';\nimport { GiteaTagsDatasource } from '../../datasource/gitea-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\n\nexport { extractPackageFile } from './extract.ts';\n\nexport const defaultConfig = {\n managerFilePatterns: getConfigFileNames().filter(\n (name) => name !== 'package.json',\n ),\n};\n\nexport const supportedDatasources = [\n
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/renovate-config/index.ts"],"sourcesContent":["import { getConfigFileNames } from '../../../config/app-strings.ts';\nimport { allToolConfig } from '../../../util/exec/containerbase.ts';\nimport { GiteaTagsDatasource } from '../../datasource/gitea-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\n\nexport { extractPackageFile } from './extract.ts';\n\nexport const defaultConfig = {\n managerFilePatterns: getConfigFileNames().filter(\n (name) => name !== 'package.json',\n ),\n};\n\nexport const supportedDatasources = Array.from(\n new Set([\n GithubTagsDatasource.id,\n GitlabTagsDatasource.id,\n GiteaTagsDatasource.id,\n\n ...Object.values(allToolConfig).map((conf) => conf.datasource),\n ]),\n);\n"],"mappings":";;;;;;;;;;;;;AAQA,MAAa,gBAAgB,EAC3B,qBAAqB,mBAAmB,CAAC,CAAC,QACvC,SAAS,SAAS,cACrB,EACF;AAEA,MAAa,uBAAuB,MAAM,qBACxC,IAAI,IAAI;CACN,qBAAqB;CACrB,qBAAqB;CACrB,oBAAoB;CAEpB,GAAG,OAAO,OAAO,aAAa,CAAC,CAAC,KAAK,SAAS,KAAK,UAAU;AAC/D,CAAC,CACH"}
|
|
@@ -22,7 +22,7 @@ markdown.enable([
|
|
|
22
22
|
"lheading",
|
|
23
23
|
"fence"
|
|
24
24
|
]);
|
|
25
|
-
const repositoriesToSkipMdFetching = ["
|
|
25
|
+
const repositoriesToSkipMdFetching = ["react/react-native"];
|
|
26
26
|
async function getReleaseList(project, release) {
|
|
27
27
|
logger.trace("getReleaseList()");
|
|
28
28
|
const { apiBaseUrl, repository, type } = project;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-notes.js","names":["bitbucket.getReleaseList","forgejo.getReleaseList","gitea.getReleaseList","github.getReleaseList","gitlab.getReleaseList","memCache.get","bitbucket.getReleaseNotesMd","bitbucketServer.getReleaseNotesMd","forgejo.getReleaseNotesMd","gitea.getReleaseNotesMd","github.getReleaseNotesMd","gitlab.getReleaseNotesMd","packageCache.get","packageCache.set"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/release-notes.ts"],"sourcesContent":["import { isDate, isUndefined } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport MarkdownIt from 'markdown-it';\nimport { logger } from '../../../../../logger/index.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 { detectPlatform } from '../../../../../util/common.ts';\nimport { linkify } from '../../../../../util/markdown.ts';\nimport { newlineRegex, regEx } from '../../../../../util/regex.ts';\nimport { coerceString } from '../../../../../util/string.ts';\nimport { isHttpUrl, joinUrlParts } from '../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport * as bitbucket from './bitbucket/index.ts';\nimport * as bitbucketServer from './bitbucket-server/index.ts';\nimport * as forgejo from './forgejo/index.ts';\nimport * as gitea from './gitea/index.ts';\nimport * as github from './github/index.ts';\nimport * as gitlab from './gitlab/index.ts';\nimport type {\n ChangeLogFile,\n ChangeLogNotes,\n ChangeLogProject,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types.ts';\n\nconst markdown = new MarkdownIt('zero');\nmarkdown.enable(['heading', 'lheading', 'fence']);\n\nconst repositoriesToSkipMdFetching = ['facebook/react-native'];\n\nexport async function getReleaseList(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n logger.trace('getReleaseList()');\n const { apiBaseUrl, repository, type } = project;\n try {\n switch (type) {\n case 'bitbucket':\n return bitbucket.getReleaseList(project, release);\n case 'bitbucket-server':\n logger.trace(\n 'Unsupported Bitbucket Server feature. Skipping release fetching.',\n );\n return [];\n case 'forgejo':\n return await forgejo.getReleaseList(project, release);\n case 'gitea':\n return await gitea.getReleaseList(project, release);\n case 'github':\n return await github.getReleaseList(project, release);\n case 'gitlab':\n return await gitlab.getReleaseList(project, release);\n default:\n logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');\n return [];\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode === 404) {\n logger.debug({ repository, type, apiBaseUrl }, 'getReleaseList 404');\n } else {\n logger.debug(\n { repository, type, apiBaseUrl, err },\n 'getReleaseList error',\n );\n }\n }\n return [];\n}\n\nexport function getCachedReleaseList(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n const { repository, apiBaseUrl } = project;\n // TODO: types (#22198)\n const cacheKey = `getReleaseList-${apiBaseUrl}-${repository}`;\n const cachedResult = memCache.get<Promise<ChangeLogNotes[]>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = getReleaseList(project, release);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function massageBody(\n input: string | undefined | null,\n baseUrl: string,\n): string {\n let body = coerceString(input);\n // Convert line returns\n body = body.replace(regEx(/\\r\\n/g), '\\n');\n // semantic-release cleanup\n body = body.replace(regEx(/^<a name=\"[^\"]*\"><\\/a>\\n/), '');\n body = body.replace(\n regEx(\n `^##? \\\\[[^\\\\]]*\\\\]\\\\(${baseUrl}[^/]*/[^/]*/compare/.*?\\\\n`,\n undefined,\n false,\n ),\n '',\n );\n // Clean-up unnecessary commits link\n body = `\\n${body}\\n`.replace(\n regEx(`\\\\n${baseUrl}[^/]+/[^/]+/compare/[^\\\\n]+(\\\\n|$)`),\n '\\n',\n );\n // Reduce headings size\n body = body\n .split(regEx(/(```[\\s\\S]*?```)/g))\n .map((part) =>\n part.startsWith('```') // do not modify # inside of codeblocks\n ? part\n : part\n .replace(regEx(/\\n\\s*####? /g), '\\n##### ')\n .replace(regEx(/\\n\\s*## /g), '\\n#### ')\n .replace(regEx(/\\n\\s*# /g), '\\n### '),\n )\n .join('');\n // Trim whitespace\n return body.trim();\n}\n\nexport function massageName(\n input: string | undefined | null,\n version: string | undefined,\n): string | undefined {\n let name = input ?? '';\n\n if (version) {\n name = name.replace(RegExp(`^(Release )?v?${version}`, 'i'), '').trim();\n }\n\n name = name.trim();\n if (!name.length) {\n return undefined;\n }\n\n return name;\n}\n\nexport async function getReleaseNotes(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n config: BranchUpgradeConfig,\n): Promise<ChangeLogNotes | null> {\n const { packageName, depName, repository } = project;\n const { version, gitRef } = release;\n // TODO: types (#22198)\n logger.trace(\n `getReleaseNotes(${repository}, ${version}, ${packageName!}, ${depName!})`,\n );\n const releases = await getCachedReleaseList(project, release);\n logger.trace({ releases }, 'Release list from getReleaseList');\n let releaseNotes: ChangeLogNotes | null = null;\n\n let matchedRelease = getExactReleaseMatch(\n packageName!,\n depName!,\n version,\n releases,\n );\n if (isUndefined(matchedRelease)) {\n // no exact match of a release then check other cases\n matchedRelease = releases.find(\n (r) =>\n r.tag === version ||\n r.tag === `v${version}` ||\n r.tag === gitRef ||\n r.tag === `v${gitRef}`,\n );\n }\n if (isUndefined(matchedRelease) && config.extractVersion) {\n const extractVersionRegEx = regEx(config.extractVersion);\n matchedRelease = releases.find((r) => {\n const extractedVersion = extractVersionRegEx.exec(r.tag!)?.groups\n ?.version;\n return version === extractedVersion;\n });\n }\n releaseNotes = await releaseNotesResult(matchedRelease, project);\n logger.trace({ releaseNotes });\n return releaseNotes;\n}\n\nfunction getExactReleaseMatch(\n packageName: string,\n depName: string,\n version: string,\n releases: ChangeLogNotes[],\n): ChangeLogNotes | undefined {\n const exactReleaseReg = regEx(\n `(?:^|/)(?:${packageName}|${depName})[@_/-]v?${version}`,\n );\n const candidateReleases = releases.filter((r) => r.tag?.endsWith(version));\n const matchedRelease = candidateReleases.find((r) =>\n exactReleaseReg.test(r.tag!),\n );\n return matchedRelease;\n}\n\nasync function releaseNotesResult(\n releaseMatch: ChangeLogNotes | undefined,\n project: ChangeLogProject,\n): Promise<ChangeLogNotes | null> {\n if (!releaseMatch) {\n return null;\n }\n const { baseUrl, repository } = project;\n const releaseNotes: ChangeLogNotes = releaseMatch;\n if (detectPlatform(baseUrl) === 'gitlab') {\n releaseNotes.url = `${baseUrl}${repository}/tags/${releaseMatch.tag!}`;\n } else {\n releaseNotes.url = releaseMatch.url\n ? releaseMatch.url\n : /* istanbul ignore next */\n `${baseUrl}${repository}/releases/${releaseMatch.tag!}`;\n }\n // set body for release notes\n releaseNotes.body = massageBody(releaseNotes.body, baseUrl);\n releaseNotes.name = massageName(releaseNotes.name, releaseNotes.tag);\n if (releaseNotes.body.length || releaseNotes.name?.length) {\n try {\n if (baseUrl !== 'https://gitlab.com/') {\n releaseNotes.body = await linkify(releaseNotes.body, {\n repository: `${baseUrl}${repository}`,\n });\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ err, baseUrl, repository }, 'Error linkifying');\n }\n } else {\n return null;\n }\n\n return releaseNotes;\n}\n\nfunction sectionize(text: string, level: number): string[] {\n const sections: [number, number][] = [];\n const lines = text.split(newlineRegex);\n const tokens = markdown.parse(text, undefined);\n tokens.forEach((token) => {\n if (token.type === 'heading_open') {\n const lev = +token.tag.substring(1);\n if (lev <= level) {\n sections.push([lev, token.map![0]]);\n }\n }\n });\n sections.push([-1, lines.length]);\n const result: string[] = [];\n for (let i = 1; i < sections.length; i += 1) {\n const [lev, start] = sections[i - 1];\n const [, end] = sections[i];\n if (lev === level) {\n result.push(lines.slice(start, end).join('\\n'));\n }\n }\n return result;\n}\n\nexport async function getReleaseNotesMdFileInner(\n project: ChangeLogProject,\n): Promise<ChangeLogFile | null> {\n const { repository, type } = project;\n const apiBaseUrl = project.apiBaseUrl;\n const sourceDirectory = project.sourceDirectory!;\n try {\n switch (type) {\n case 'bitbucket':\n return await bitbucket.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'bitbucket-server':\n return await bitbucketServer.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'forgejo':\n return await forgejo.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'gitea':\n return await gitea.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'github':\n return await github.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'gitlab':\n return await gitlab.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n default:\n logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');\n return null;\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode === 404) {\n logger.debug(\n { repository, type, apiBaseUrl },\n 'Error 404 getting changelog md',\n );\n } else {\n logger.debug(\n { err, repository, type, apiBaseUrl },\n 'Error getting changelog md',\n );\n }\n }\n return null;\n}\n\nexport function getReleaseNotesMdFile(\n project: ChangeLogProject,\n): Promise<ChangeLogFile | null> {\n const { sourceDirectory, repository, apiBaseUrl } = project;\n // TODO: types (#22198)\n const cacheKey = sourceDirectory\n ? `getReleaseNotesMdFile@v2-${repository}-${sourceDirectory}-${apiBaseUrl}`\n : `getReleaseNotesMdFile@v2-${repository}-${apiBaseUrl}`;\n const cachedResult = memCache.get<Promise<ChangeLogFile | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = getReleaseNotesMdFileInner(project);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport async function getReleaseNotesMd(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes | null> {\n const { baseUrl, repository, packageName } = project;\n const version = release.version;\n logger.trace(`getReleaseNotesMd(${repository}, ${version})`);\n\n if (shouldSkipChangelogMd(repository)) {\n return null;\n }\n\n const changelog = await getReleaseNotesMdFile(project);\n if (!changelog) {\n return null;\n }\n const { changelogFile } = changelog;\n const changelogMd = changelog.changelogMd.replace(\n regEx(/\\n\\s*<a name=\"[^\"]*\">.*?<\\/a>\\n/g),\n '\\n',\n );\n for (const level of [1, 2, 3, 4, 5, 6, 7]) {\n const changelogParsed = sectionize(changelogMd, level);\n if (changelogParsed.length >= 2) {\n for (const section of changelogParsed) {\n try {\n // replace brackets and parenthesis with space\n const deParenthesizedSection = section.replace(\n regEx(/[[\\]()]/g),\n ' ',\n );\n const [heading] = deParenthesizedSection.split(newlineRegex);\n const title = heading\n .replace(regEx(/^\\s*#*\\s*/), '')\n .split(' ')\n .filter(Boolean);\n const body = section.replace(regEx(/.*?\\n(-{3,}\\n)?/), '').trim();\n const notesSourceUrl = getNotesSourceUrl(\n baseUrl,\n repository,\n project,\n changelogFile,\n );\n const mdHeadingLink = title\n .filter((word) => !isHttpUrl(word))\n .join('-')\n .replace(regEx(/[^A-Za-z0-9-]/g), '');\n const url = `${notesSourceUrl}#${mdHeadingLink}`;\n // Look for version in title\n for (const word of title) {\n if (word.includes(version) && !isHttpUrl(word)) {\n logger.trace({ body }, `Found release notes for v${version}`);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n // Look for version in body - useful for monorepos. First check for heading with \"(yyyy-mm-dd)\"\n const releasesRegex = regEx(/([0-9]{4}-[0-9]{2}-[0-9]{2})/);\n if (packageName && heading.search(releasesRegex) !== -1) {\n // Now check if any line contains both the package name and the version\n // Skip Markdown link reference definitions (e.g. `[1.2.3]: https://…/compare/...`)\n // which Keep-a-Changelog files list at the bottom and would otherwise match every version.\n const linkRefDefRegex = regEx(/^\\s*\\[[^\\]]+\\]:\\s*\\S+/);\n const bodyLines = body.split('\\n');\n if (\n bodyLines.some(\n (line) =>\n line.includes(packageName) &&\n line.includes(version) &&\n !isHttpUrl(line) &&\n !linkRefDefRegex.test(line),\n )\n ) {\n logger.trace({ body }, `Found release notes for v${version}`);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn(\n { file: changelogFile, err },\n `Error parsing changelog file`,\n );\n }\n }\n }\n logger.trace({ repository }, `No level ${level} changelogs headings found`);\n }\n logger.trace({ repository, version }, `No entry found in ${changelogFile}`);\n return null;\n}\n\n/**\n * Determine how long to cache release notes based on when the version was released.\n *\n * It's not uncommon for release notes to be updated shortly after the release itself,\n * so only cache for about an hour when the release is less than a week old. Otherwise,\n * cache for days.\n */\nexport function releaseNotesCacheMinutes(releaseDate?: string | Date): number {\n const dt = isDate(releaseDate)\n ? DateTime.fromJSDate(releaseDate)\n : DateTime.fromISO(releaseDate!);\n\n const now = DateTime.local();\n\n if (!dt.isValid || now.diff(dt, 'days').days < 7) {\n return 55;\n }\n\n if (now.diff(dt, 'months').months < 6) {\n return 1435; // 5 minutes shy of one day\n }\n\n return 14495; // 5 minutes shy of 10 days\n}\n\nexport async function addReleaseNotes(\n input: ChangeLogResult | null | undefined,\n config: BranchUpgradeConfig,\n): Promise<ChangeLogResult | null> {\n if (!input?.versions || !input.project?.type) {\n logger.debug('Missing project or versions');\n return input ?? null;\n }\n const output: ChangeLogResult = {\n ...input,\n versions: [],\n hasReleaseNotes: false,\n };\n\n const { repository, sourceDirectory, type: projectType } = input.project;\n const cacheNamespace: PackageCacheNamespace = `changelog-${projectType}-notes@v2`;\n const cacheKeyPrefix = sourceDirectory\n ? `${repository}:${sourceDirectory}`\n : `${repository}`;\n\n for (const v of input.versions) {\n let releaseNotes: ChangeLogNotes | null | undefined;\n const gitRefCachePart = v.gitRef ? `:${v.gitRef}` : '';\n const cacheKey = `${cacheKeyPrefix}:${v.version}${gitRefCachePart}`;\n releaseNotes = await packageCache.get(cacheNamespace, cacheKey);\n releaseNotes ??= await getReleaseNotesMd(input.project, v);\n releaseNotes ??= await getReleaseNotes(input.project, v, config);\n\n // If there is no release notes, at least try to show the compare URL\n if (!releaseNotes && v.compare.url) {\n releaseNotes = { url: v.compare.url, notesSourceUrl: '' };\n }\n\n const cacheMinutes = releaseNotesCacheMinutes(v.date);\n await packageCache.set(\n cacheNamespace,\n cacheKey,\n releaseNotes,\n cacheMinutes,\n );\n output.versions!.push({\n ...v,\n releaseNotes: releaseNotes!,\n });\n\n if (releaseNotes) {\n output.hasReleaseNotes = true;\n }\n }\n return output;\n}\n\n/**\n * Skip fetching changelog/release-notes markdown files.\n * Will force a fallback to using GitHub release notes\n */\nexport function shouldSkipChangelogMd(repository: string): boolean {\n return repositoriesToSkipMdFetching.includes(repository);\n}\n\nfunction getNotesSourceUrl(\n baseUrl: string,\n repository: string,\n project: ChangeLogProject,\n changelogFile: string,\n): string {\n if (project.type === 'bitbucket-server') {\n const [projectKey, repositorySlug] = repository.split('/');\n return joinUrlParts(\n baseUrl,\n 'projects',\n projectKey,\n 'repos',\n repositorySlug,\n 'browse',\n changelogFile,\n '?at=HEAD',\n );\n }\n\n return joinUrlParts(\n baseUrl,\n repository,\n project.type === 'bitbucket' ? 'src' : 'blob',\n 'HEAD',\n changelogFile,\n );\n}\n\nasync function linkifyBody(\n { baseUrl, repository }: ChangeLogProject,\n bodyStr: string,\n): Promise<string> {\n const body = massageBody(bodyStr, baseUrl);\n if (body?.length) {\n try {\n return await linkify(body, {\n repository: `${baseUrl}${repository}`,\n });\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ body, err }, 'linkify error');\n }\n }\n return body;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"release-notes.js","names":["bitbucket.getReleaseList","forgejo.getReleaseList","gitea.getReleaseList","github.getReleaseList","gitlab.getReleaseList","memCache.get","bitbucket.getReleaseNotesMd","bitbucketServer.getReleaseNotesMd","forgejo.getReleaseNotesMd","gitea.getReleaseNotesMd","github.getReleaseNotesMd","gitlab.getReleaseNotesMd","packageCache.get","packageCache.set"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/release-notes.ts"],"sourcesContent":["import { isDate, isUndefined } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport MarkdownIt from 'markdown-it';\nimport { logger } from '../../../../../logger/index.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 { detectPlatform } from '../../../../../util/common.ts';\nimport { linkify } from '../../../../../util/markdown.ts';\nimport { newlineRegex, regEx } from '../../../../../util/regex.ts';\nimport { coerceString } from '../../../../../util/string.ts';\nimport { isHttpUrl, joinUrlParts } from '../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport * as bitbucket from './bitbucket/index.ts';\nimport * as bitbucketServer from './bitbucket-server/index.ts';\nimport * as forgejo from './forgejo/index.ts';\nimport * as gitea from './gitea/index.ts';\nimport * as github from './github/index.ts';\nimport * as gitlab from './gitlab/index.ts';\nimport type {\n ChangeLogFile,\n ChangeLogNotes,\n ChangeLogProject,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types.ts';\n\nconst markdown = new MarkdownIt('zero');\nmarkdown.enable(['heading', 'lheading', 'fence']);\n\nconst repositoriesToSkipMdFetching = ['react/react-native'];\n\nexport async function getReleaseList(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n logger.trace('getReleaseList()');\n const { apiBaseUrl, repository, type } = project;\n try {\n switch (type) {\n case 'bitbucket':\n return bitbucket.getReleaseList(project, release);\n case 'bitbucket-server':\n logger.trace(\n 'Unsupported Bitbucket Server feature. Skipping release fetching.',\n );\n return [];\n case 'forgejo':\n return await forgejo.getReleaseList(project, release);\n case 'gitea':\n return await gitea.getReleaseList(project, release);\n case 'github':\n return await github.getReleaseList(project, release);\n case 'gitlab':\n return await gitlab.getReleaseList(project, release);\n default:\n logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');\n return [];\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode === 404) {\n logger.debug({ repository, type, apiBaseUrl }, 'getReleaseList 404');\n } else {\n logger.debug(\n { repository, type, apiBaseUrl, err },\n 'getReleaseList error',\n );\n }\n }\n return [];\n}\n\nexport function getCachedReleaseList(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes[]> {\n const { repository, apiBaseUrl } = project;\n // TODO: types (#22198)\n const cacheKey = `getReleaseList-${apiBaseUrl}-${repository}`;\n const cachedResult = memCache.get<Promise<ChangeLogNotes[]>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = getReleaseList(project, release);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function massageBody(\n input: string | undefined | null,\n baseUrl: string,\n): string {\n let body = coerceString(input);\n // Convert line returns\n body = body.replace(regEx(/\\r\\n/g), '\\n');\n // semantic-release cleanup\n body = body.replace(regEx(/^<a name=\"[^\"]*\"><\\/a>\\n/), '');\n body = body.replace(\n regEx(\n `^##? \\\\[[^\\\\]]*\\\\]\\\\(${baseUrl}[^/]*/[^/]*/compare/.*?\\\\n`,\n undefined,\n false,\n ),\n '',\n );\n // Clean-up unnecessary commits link\n body = `\\n${body}\\n`.replace(\n regEx(`\\\\n${baseUrl}[^/]+/[^/]+/compare/[^\\\\n]+(\\\\n|$)`),\n '\\n',\n );\n // Reduce headings size\n body = body\n .split(regEx(/(```[\\s\\S]*?```)/g))\n .map((part) =>\n part.startsWith('```') // do not modify # inside of codeblocks\n ? part\n : part\n .replace(regEx(/\\n\\s*####? /g), '\\n##### ')\n .replace(regEx(/\\n\\s*## /g), '\\n#### ')\n .replace(regEx(/\\n\\s*# /g), '\\n### '),\n )\n .join('');\n // Trim whitespace\n return body.trim();\n}\n\nexport function massageName(\n input: string | undefined | null,\n version: string | undefined,\n): string | undefined {\n let name = input ?? '';\n\n if (version) {\n name = name.replace(RegExp(`^(Release )?v?${version}`, 'i'), '').trim();\n }\n\n name = name.trim();\n if (!name.length) {\n return undefined;\n }\n\n return name;\n}\n\nexport async function getReleaseNotes(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n config: BranchUpgradeConfig,\n): Promise<ChangeLogNotes | null> {\n const { packageName, depName, repository } = project;\n const { version, gitRef } = release;\n // TODO: types (#22198)\n logger.trace(\n `getReleaseNotes(${repository}, ${version}, ${packageName!}, ${depName!})`,\n );\n const releases = await getCachedReleaseList(project, release);\n logger.trace({ releases }, 'Release list from getReleaseList');\n let releaseNotes: ChangeLogNotes | null = null;\n\n let matchedRelease = getExactReleaseMatch(\n packageName!,\n depName!,\n version,\n releases,\n );\n if (isUndefined(matchedRelease)) {\n // no exact match of a release then check other cases\n matchedRelease = releases.find(\n (r) =>\n r.tag === version ||\n r.tag === `v${version}` ||\n r.tag === gitRef ||\n r.tag === `v${gitRef}`,\n );\n }\n if (isUndefined(matchedRelease) && config.extractVersion) {\n const extractVersionRegEx = regEx(config.extractVersion);\n matchedRelease = releases.find((r) => {\n const extractedVersion = extractVersionRegEx.exec(r.tag!)?.groups\n ?.version;\n return version === extractedVersion;\n });\n }\n releaseNotes = await releaseNotesResult(matchedRelease, project);\n logger.trace({ releaseNotes });\n return releaseNotes;\n}\n\nfunction getExactReleaseMatch(\n packageName: string,\n depName: string,\n version: string,\n releases: ChangeLogNotes[],\n): ChangeLogNotes | undefined {\n const exactReleaseReg = regEx(\n `(?:^|/)(?:${packageName}|${depName})[@_/-]v?${version}`,\n );\n const candidateReleases = releases.filter((r) => r.tag?.endsWith(version));\n const matchedRelease = candidateReleases.find((r) =>\n exactReleaseReg.test(r.tag!),\n );\n return matchedRelease;\n}\n\nasync function releaseNotesResult(\n releaseMatch: ChangeLogNotes | undefined,\n project: ChangeLogProject,\n): Promise<ChangeLogNotes | null> {\n if (!releaseMatch) {\n return null;\n }\n const { baseUrl, repository } = project;\n const releaseNotes: ChangeLogNotes = releaseMatch;\n if (detectPlatform(baseUrl) === 'gitlab') {\n releaseNotes.url = `${baseUrl}${repository}/tags/${releaseMatch.tag!}`;\n } else {\n releaseNotes.url = releaseMatch.url\n ? releaseMatch.url\n : /* istanbul ignore next */\n `${baseUrl}${repository}/releases/${releaseMatch.tag!}`;\n }\n // set body for release notes\n releaseNotes.body = massageBody(releaseNotes.body, baseUrl);\n releaseNotes.name = massageName(releaseNotes.name, releaseNotes.tag);\n if (releaseNotes.body.length || releaseNotes.name?.length) {\n try {\n if (baseUrl !== 'https://gitlab.com/') {\n releaseNotes.body = await linkify(releaseNotes.body, {\n repository: `${baseUrl}${repository}`,\n });\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ err, baseUrl, repository }, 'Error linkifying');\n }\n } else {\n return null;\n }\n\n return releaseNotes;\n}\n\nfunction sectionize(text: string, level: number): string[] {\n const sections: [number, number][] = [];\n const lines = text.split(newlineRegex);\n const tokens = markdown.parse(text, undefined);\n tokens.forEach((token) => {\n if (token.type === 'heading_open') {\n const lev = +token.tag.substring(1);\n if (lev <= level) {\n sections.push([lev, token.map![0]]);\n }\n }\n });\n sections.push([-1, lines.length]);\n const result: string[] = [];\n for (let i = 1; i < sections.length; i += 1) {\n const [lev, start] = sections[i - 1];\n const [, end] = sections[i];\n if (lev === level) {\n result.push(lines.slice(start, end).join('\\n'));\n }\n }\n return result;\n}\n\nexport async function getReleaseNotesMdFileInner(\n project: ChangeLogProject,\n): Promise<ChangeLogFile | null> {\n const { repository, type } = project;\n const apiBaseUrl = project.apiBaseUrl;\n const sourceDirectory = project.sourceDirectory!;\n try {\n switch (type) {\n case 'bitbucket':\n return await bitbucket.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'bitbucket-server':\n return await bitbucketServer.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'forgejo':\n return await forgejo.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'gitea':\n return await gitea.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'github':\n return await github.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n case 'gitlab':\n return await gitlab.getReleaseNotesMd(\n repository,\n apiBaseUrl,\n sourceDirectory,\n );\n default:\n logger.warn({ apiBaseUrl, repository, type }, 'Invalid project type');\n return null;\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode === 404) {\n logger.debug(\n { repository, type, apiBaseUrl },\n 'Error 404 getting changelog md',\n );\n } else {\n logger.debug(\n { err, repository, type, apiBaseUrl },\n 'Error getting changelog md',\n );\n }\n }\n return null;\n}\n\nexport function getReleaseNotesMdFile(\n project: ChangeLogProject,\n): Promise<ChangeLogFile | null> {\n const { sourceDirectory, repository, apiBaseUrl } = project;\n // TODO: types (#22198)\n const cacheKey = sourceDirectory\n ? `getReleaseNotesMdFile@v2-${repository}-${sourceDirectory}-${apiBaseUrl}`\n : `getReleaseNotesMdFile@v2-${repository}-${apiBaseUrl}`;\n const cachedResult = memCache.get<Promise<ChangeLogFile | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = getReleaseNotesMdFileInner(project);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport async function getReleaseNotesMd(\n project: ChangeLogProject,\n release: ChangeLogRelease,\n): Promise<ChangeLogNotes | null> {\n const { baseUrl, repository, packageName } = project;\n const version = release.version;\n logger.trace(`getReleaseNotesMd(${repository}, ${version})`);\n\n if (shouldSkipChangelogMd(repository)) {\n return null;\n }\n\n const changelog = await getReleaseNotesMdFile(project);\n if (!changelog) {\n return null;\n }\n const { changelogFile } = changelog;\n const changelogMd = changelog.changelogMd.replace(\n regEx(/\\n\\s*<a name=\"[^\"]*\">.*?<\\/a>\\n/g),\n '\\n',\n );\n for (const level of [1, 2, 3, 4, 5, 6, 7]) {\n const changelogParsed = sectionize(changelogMd, level);\n if (changelogParsed.length >= 2) {\n for (const section of changelogParsed) {\n try {\n // replace brackets and parenthesis with space\n const deParenthesizedSection = section.replace(\n regEx(/[[\\]()]/g),\n ' ',\n );\n const [heading] = deParenthesizedSection.split(newlineRegex);\n const title = heading\n .replace(regEx(/^\\s*#*\\s*/), '')\n .split(' ')\n .filter(Boolean);\n const body = section.replace(regEx(/.*?\\n(-{3,}\\n)?/), '').trim();\n const notesSourceUrl = getNotesSourceUrl(\n baseUrl,\n repository,\n project,\n changelogFile,\n );\n const mdHeadingLink = title\n .filter((word) => !isHttpUrl(word))\n .join('-')\n .replace(regEx(/[^A-Za-z0-9-]/g), '');\n const url = `${notesSourceUrl}#${mdHeadingLink}`;\n // Look for version in title\n for (const word of title) {\n if (word.includes(version) && !isHttpUrl(word)) {\n logger.trace({ body }, `Found release notes for v${version}`);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n // Look for version in body - useful for monorepos. First check for heading with \"(yyyy-mm-dd)\"\n const releasesRegex = regEx(/([0-9]{4}-[0-9]{2}-[0-9]{2})/);\n if (packageName && heading.search(releasesRegex) !== -1) {\n // Now check if any line contains both the package name and the version\n // Skip Markdown link reference definitions (e.g. `[1.2.3]: https://…/compare/...`)\n // which Keep-a-Changelog files list at the bottom and would otherwise match every version.\n const linkRefDefRegex = regEx(/^\\s*\\[[^\\]]+\\]:\\s*\\S+/);\n const bodyLines = body.split('\\n');\n if (\n bodyLines.some(\n (line) =>\n line.includes(packageName) &&\n line.includes(version) &&\n !isHttpUrl(line) &&\n !linkRefDefRegex.test(line),\n )\n ) {\n logger.trace({ body }, `Found release notes for v${version}`);\n return {\n body: await linkifyBody(project, body),\n url,\n notesSourceUrl,\n };\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn(\n { file: changelogFile, err },\n `Error parsing changelog file`,\n );\n }\n }\n }\n logger.trace({ repository }, `No level ${level} changelogs headings found`);\n }\n logger.trace({ repository, version }, `No entry found in ${changelogFile}`);\n return null;\n}\n\n/**\n * Determine how long to cache release notes based on when the version was released.\n *\n * It's not uncommon for release notes to be updated shortly after the release itself,\n * so only cache for about an hour when the release is less than a week old. Otherwise,\n * cache for days.\n */\nexport function releaseNotesCacheMinutes(releaseDate?: string | Date): number {\n const dt = isDate(releaseDate)\n ? DateTime.fromJSDate(releaseDate)\n : DateTime.fromISO(releaseDate!);\n\n const now = DateTime.local();\n\n if (!dt.isValid || now.diff(dt, 'days').days < 7) {\n return 55;\n }\n\n if (now.diff(dt, 'months').months < 6) {\n return 1435; // 5 minutes shy of one day\n }\n\n return 14495; // 5 minutes shy of 10 days\n}\n\nexport async function addReleaseNotes(\n input: ChangeLogResult | null | undefined,\n config: BranchUpgradeConfig,\n): Promise<ChangeLogResult | null> {\n if (!input?.versions || !input.project?.type) {\n logger.debug('Missing project or versions');\n return input ?? null;\n }\n const output: ChangeLogResult = {\n ...input,\n versions: [],\n hasReleaseNotes: false,\n };\n\n const { repository, sourceDirectory, type: projectType } = input.project;\n const cacheNamespace: PackageCacheNamespace = `changelog-${projectType}-notes@v2`;\n const cacheKeyPrefix = sourceDirectory\n ? `${repository}:${sourceDirectory}`\n : `${repository}`;\n\n for (const v of input.versions) {\n let releaseNotes: ChangeLogNotes | null | undefined;\n const gitRefCachePart = v.gitRef ? `:${v.gitRef}` : '';\n const cacheKey = `${cacheKeyPrefix}:${v.version}${gitRefCachePart}`;\n releaseNotes = await packageCache.get(cacheNamespace, cacheKey);\n releaseNotes ??= await getReleaseNotesMd(input.project, v);\n releaseNotes ??= await getReleaseNotes(input.project, v, config);\n\n // If there is no release notes, at least try to show the compare URL\n if (!releaseNotes && v.compare.url) {\n releaseNotes = { url: v.compare.url, notesSourceUrl: '' };\n }\n\n const cacheMinutes = releaseNotesCacheMinutes(v.date);\n await packageCache.set(\n cacheNamespace,\n cacheKey,\n releaseNotes,\n cacheMinutes,\n );\n output.versions!.push({\n ...v,\n releaseNotes: releaseNotes!,\n });\n\n if (releaseNotes) {\n output.hasReleaseNotes = true;\n }\n }\n return output;\n}\n\n/**\n * Skip fetching changelog/release-notes markdown files.\n * Will force a fallback to using GitHub release notes\n */\nexport function shouldSkipChangelogMd(repository: string): boolean {\n return repositoriesToSkipMdFetching.includes(repository);\n}\n\nfunction getNotesSourceUrl(\n baseUrl: string,\n repository: string,\n project: ChangeLogProject,\n changelogFile: string,\n): string {\n if (project.type === 'bitbucket-server') {\n const [projectKey, repositorySlug] = repository.split('/');\n return joinUrlParts(\n baseUrl,\n 'projects',\n projectKey,\n 'repos',\n repositorySlug,\n 'browse',\n changelogFile,\n '?at=HEAD',\n );\n }\n\n return joinUrlParts(\n baseUrl,\n repository,\n project.type === 'bitbucket' ? 'src' : 'blob',\n 'HEAD',\n changelogFile,\n );\n}\n\nasync function linkifyBody(\n { baseUrl, repository }: ChangeLogProject,\n bodyStr: string,\n): Promise<string> {\n const body = massageBody(bodyStr, baseUrl);\n if (body?.length) {\n try {\n return await linkify(body, {\n repository: `${baseUrl}${repository}`,\n });\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ body, err }, 'linkify error');\n }\n }\n return body;\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.
|
|
4
|
+
"version": "43.278.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -104,6 +104,7 @@
|
|
|
104
104
|
"@opentelemetry/instrumentation-bunyan": "0.65.0",
|
|
105
105
|
"@opentelemetry/instrumentation-http": "0.220.0",
|
|
106
106
|
"@opentelemetry/instrumentation-redis": "0.68.0",
|
|
107
|
+
"@opentelemetry/otlp-transformer": "0.213.0",
|
|
107
108
|
"@opentelemetry/resource-detector-aws": "2.20.0",
|
|
108
109
|
"@opentelemetry/resource-detector-azure": "0.28.0",
|
|
109
110
|
"@opentelemetry/resource-detector-gcp": "0.55.0",
|
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 43.
|
|
3
|
+
"title": "JSON schema for Renovate 43.278.0 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "43.
|
|
5
|
+
"x-renovate-version": "43.278.0",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|