From d01054b73b42980c13137720a3f43152f086de0a Mon Sep 17 00:00:00 2001 From: David Luna Date: Wed, 23 Jul 2025 11:55:58 +0200 Subject: [PATCH 1/3] feat: add esm output --- packages/instrumentation-undici/package.json | 26 ++++++++++++++++--- packages/instrumentation-undici/src/index.ts | 4 +-- .../src/internal-types.ts | 2 +- packages/instrumentation-undici/src/undici.ts | 8 +++--- .../instrumentation-undici/test/fetch.test.ts | 8 +++--- .../test/metrics.test.ts | 8 +++--- .../test/undici.test.ts | 8 +++--- .../test/utils/assertSpan.ts | 2 +- .../instrumentation-undici/tsconfig.esm.json | 11 ++++++++ packages/instrumentation-undici/tsconfig.json | 4 ++- 10 files changed, 57 insertions(+), 24 deletions(-) create mode 100644 packages/instrumentation-undici/tsconfig.esm.json diff --git a/packages/instrumentation-undici/package.json b/packages/instrumentation-undici/package.json index 2069b893f1..790a86af4c 100644 --- a/packages/instrumentation-undici/package.json +++ b/packages/instrumentation-undici/package.json @@ -3,7 +3,9 @@ "version": "0.14.0", "description": "OpenTelemetry instrumentation for `undici` http client and Node.js fetch()", "main": "build/src/index.js", + "module": "build/esm/index.js", "types": "build/src/index.d.ts", + "type": "module", "repository": { "type": "git", "url": "https://github.com/open-telemetry/opentelemetry-js-contrib.git", @@ -12,11 +14,13 @@ "scripts": { "prepublishOnly": "npm run compile", "setup:dev": "nx run-many -t compile -p @opentelemetry/instrumentation-undici", - "compile": "tsc -p .", + "compile": "npm run compile:cjs && npm run compile:esm", + "compile:cjs": "tsc --build tsconfig.json && echo '{ \"type\": \"commonjs\" }' > build/src/package.json", + "compile:esm": "tsc --build tsconfig.esm.json", + "clean": "tsc --build --clean tsconfig.json tsconfig.esm.json", "test": "nyc mocha test/**/*.test.ts", "test-all-versions": "tav", "tdd": "npm run test -- --watch-extensions ts --watch", - "clean": "rimraf build/*", "lint": "eslint . --ext .ts", "lint:fix": "eslint . --ext .ts --fix", "watch": "tsc -w", @@ -35,10 +39,26 @@ "engines": { "node": "^18.19.0 || >=20.6.0" }, + "exports": { + "import": { + "types": "./build/esm/index.d.ts", + "default": "./build/esm/index.js" + }, + "require": { + "types": "./build/src/index.d.ts", + "default": "./build/src/index.js" + } + }, "files": [ "build/src/**/*.js", "build/src/**/*.js.map", - "build/src/**/*.d.ts" + "build/src/**/*.d.ts", + "build/src/**/*.js", + "build/src/**/*.js.map", + "build/src/**/*.d.ts", + "build/esm/**/*.js", + "build/esm/**/*.js.map", + "build/esm/**/*.d.ts" ], "publishConfig": { "access": "public" diff --git a/packages/instrumentation-undici/src/index.ts b/packages/instrumentation-undici/src/index.ts index 942dd61bb7..c0de41cfdd 100644 --- a/packages/instrumentation-undici/src/index.ts +++ b/packages/instrumentation-undici/src/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -export { UndiciInstrumentation } from './undici'; +export { UndiciInstrumentation } from './undici.js'; export type { IgnoreRequestFunction, RequestHookFunction, @@ -23,4 +23,4 @@ export type { UndiciInstrumentationConfig, UndiciRequest, UndiciResponse, -} from './types'; +} from './types.js'; diff --git a/packages/instrumentation-undici/src/internal-types.ts b/packages/instrumentation-undici/src/internal-types.ts index e6b2fff535..3e7c2645a0 100644 --- a/packages/instrumentation-undici/src/internal-types.ts +++ b/packages/instrumentation-undici/src/internal-types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { UndiciRequest, UndiciResponse } from './types'; +import { UndiciRequest, UndiciResponse } from './types.js'; export interface ListenerRecord { name: string; diff --git a/packages/instrumentation-undici/src/undici.ts b/packages/instrumentation-undici/src/undici.ts index 519ba4691f..666f1bce6f 100644 --- a/packages/instrumentation-undici/src/undici.ts +++ b/packages/instrumentation-undici/src/undici.ts @@ -35,7 +35,7 @@ import { } from '@opentelemetry/api'; /** @knipignore */ -import { PACKAGE_NAME, PACKAGE_VERSION } from './version'; +import { PACKAGE_NAME, PACKAGE_VERSION } from './version.js'; import { ListenerRecord, @@ -43,9 +43,9 @@ import { RequestMessage, RequestTrailersMessage, ResponseHeadersMessage, -} from './internal-types'; -import { UndiciInstrumentationConfig, UndiciRequest } from './types'; -import { SemanticAttributes } from './enums/SemanticAttributes'; +} from './internal-types.js'; +import { UndiciInstrumentationConfig, UndiciRequest } from './types.js'; +import { SemanticAttributes } from './enums/SemanticAttributes.js'; import { hrTime, hrTimeDuration, diff --git a/packages/instrumentation-undici/test/fetch.test.ts b/packages/instrumentation-undici/test/fetch.test.ts index 7e389838bb..becc772f5d 100644 --- a/packages/instrumentation-undici/test/fetch.test.ts +++ b/packages/instrumentation-undici/test/fetch.test.ts @@ -29,11 +29,11 @@ import { } from '@opentelemetry/sdk-trace-base'; import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; -import { UndiciInstrumentation } from '../src/undici'; +import { UndiciInstrumentation } from '../src/undici.js'; -import { MockPropagation } from './utils/mock-propagation'; -import { MockServer } from './utils/mock-server'; -import { assertSpan } from './utils/assertSpan'; +import { MockPropagation } from './utils/mock-propagation.js'; +import { MockServer } from './utils/mock-server.js'; +import { assertSpan } from './utils/assertSpan.js'; describe('UndiciInstrumentation `fetch` tests', function () { let instrumentation: UndiciInstrumentation; diff --git a/packages/instrumentation-undici/test/metrics.test.ts b/packages/instrumentation-undici/test/metrics.test.ts index bca94ac6e9..ecad70cdcb 100644 --- a/packages/instrumentation-undici/test/metrics.test.ts +++ b/packages/instrumentation-undici/test/metrics.test.ts @@ -25,11 +25,11 @@ import { MeterProvider, } from '@opentelemetry/sdk-metrics'; -import { UndiciInstrumentation } from '../src/undici'; +import { UndiciInstrumentation } from '../src/undici.js'; -import { MockServer } from './utils/mock-server'; -import { MockMetricsReader } from './utils/mock-metrics-reader'; -import { SemanticAttributes } from '../src/enums/SemanticAttributes'; +import { MockServer } from './utils/mock-server.js'; +import { MockMetricsReader } from './utils/mock-metrics-reader.js'; +import { SemanticAttributes } from '../src/enums/SemanticAttributes.js'; describe('UndiciInstrumentation metrics tests', function () { let instrumentation: UndiciInstrumentation; diff --git a/packages/instrumentation-undici/test/undici.test.ts b/packages/instrumentation-undici/test/undici.test.ts index 2a124fb199..991eb29b04 100644 --- a/packages/instrumentation-undici/test/undici.test.ts +++ b/packages/instrumentation-undici/test/undici.test.ts @@ -31,11 +31,11 @@ import { } from '@opentelemetry/sdk-trace-base'; import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; -import { UndiciInstrumentation } from '../src/undici'; +import { UndiciInstrumentation } from '../src/undici.js'; -import { MockPropagation } from './utils/mock-propagation'; -import { MockServer } from './utils/mock-server'; -import { assertSpan } from './utils/assertSpan'; +import { MockPropagation } from './utils/mock-propagation.js'; +import { MockServer } from './utils/mock-server.js'; +import { assertSpan } from './utils/assertSpan.js'; import type { fetch, stream, request, Client, Dispatcher } from 'undici'; diff --git a/packages/instrumentation-undici/test/utils/assertSpan.ts b/packages/instrumentation-undici/test/utils/assertSpan.ts index c5d584dd46..271ace0a9a 100644 --- a/packages/instrumentation-undici/test/utils/assertSpan.ts +++ b/packages/instrumentation-undici/test/utils/assertSpan.ts @@ -22,7 +22,7 @@ import { import { hrTimeToNanoseconds } from '@opentelemetry/core'; import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; -import { SemanticAttributes } from '../../src/enums/SemanticAttributes'; +import { SemanticAttributes } from '../../src/enums/SemanticAttributes.js'; type IncomingHttpHeaders = Record; diff --git a/packages/instrumentation-undici/tsconfig.esm.json b/packages/instrumentation-undici/tsconfig.esm.json new file mode 100644 index 0000000000..f97a35348f --- /dev/null +++ b/packages/instrumentation-undici/tsconfig.esm.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.esm.json", + "compilerOptions": { + "outDir": "build/esm", + "rootDir": "src", + "tsBuildInfoFile": "build/esm/tsconfig.esm.tsbuildinfo" + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/instrumentation-undici/tsconfig.json b/packages/instrumentation-undici/tsconfig.json index 4078877ce6..c3975a475d 100644 --- a/packages/instrumentation-undici/tsconfig.json +++ b/packages/instrumentation-undici/tsconfig.json @@ -2,7 +2,9 @@ "extends": "../../tsconfig.base", "compilerOptions": { "rootDir": ".", - "outDir": "build" + "outDir": "build", + "module": "commonjs", + "moduleResolution": "node10" }, "include": [ "src/**/*.ts", From 8058096c4398f40e3db42705f067f9c1a8d3ad8e Mon Sep 17 00:00:00 2001 From: David Luna Date: Wed, 23 Jul 2025 17:27:48 +0200 Subject: [PATCH 2/3] chore: fix lint script --- packages/instrumentation-undici/{.eslintrc.js => .eslintrc.cjs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/instrumentation-undici/{.eslintrc.js => .eslintrc.cjs} (100%) diff --git a/packages/instrumentation-undici/.eslintrc.js b/packages/instrumentation-undici/.eslintrc.cjs similarity index 100% rename from packages/instrumentation-undici/.eslintrc.js rename to packages/instrumentation-undici/.eslintrc.cjs From 0ea999597900616727c05369c1ac318c6e3d48f2 Mon Sep 17 00:00:00 2001 From: David Luna Date: Thu, 24 Jul 2025 16:03:18 +0200 Subject: [PATCH 3/3] chore: change compilation targets --- packages/instrumentation-undici/package.json | 25 ++++++++----------- .../test/undici.test.ts | 7 ++++++ .../instrumentation-undici/tsconfig.cjs.json | 13 ++++++++++ .../instrumentation-undici/tsconfig.esm.json | 11 -------- packages/instrumentation-undici/tsconfig.json | 8 +++--- 5 files changed, 34 insertions(+), 30 deletions(-) create mode 100644 packages/instrumentation-undici/tsconfig.cjs.json delete mode 100644 packages/instrumentation-undici/tsconfig.esm.json diff --git a/packages/instrumentation-undici/package.json b/packages/instrumentation-undici/package.json index 790a86af4c..fbc952a906 100644 --- a/packages/instrumentation-undici/package.json +++ b/packages/instrumentation-undici/package.json @@ -14,11 +14,9 @@ "scripts": { "prepublishOnly": "npm run compile", "setup:dev": "nx run-many -t compile -p @opentelemetry/instrumentation-undici", - "compile": "npm run compile:cjs && npm run compile:esm", - "compile:cjs": "tsc --build tsconfig.json && echo '{ \"type\": \"commonjs\" }' > build/src/package.json", - "compile:esm": "tsc --build tsconfig.esm.json", - "clean": "tsc --build --clean tsconfig.json tsconfig.esm.json", - "test": "nyc mocha test/**/*.test.ts", + "compile": "tsc --build tsconfig.json tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > build/cjs/package.json", + "clean": "tsc --build --clean tsconfig.json tsconfig.cjs.json", + "test": "nyc mocha --loader=ts-node/esm test/**/*.test.ts", "test-all-versions": "tav", "tdd": "npm run test -- --watch-extensions ts --watch", "lint": "eslint . --ext .ts", @@ -41,24 +39,21 @@ }, "exports": { "import": { - "types": "./build/esm/index.d.ts", - "default": "./build/esm/index.js" - }, - "require": { "types": "./build/src/index.d.ts", "default": "./build/src/index.js" + }, + "require": { + "types": "./build/cjs/index.d.ts", + "default": "./build/cjs/index.js" } }, "files": [ "build/src/**/*.js", "build/src/**/*.js.map", "build/src/**/*.d.ts", - "build/src/**/*.js", - "build/src/**/*.js.map", - "build/src/**/*.d.ts", - "build/esm/**/*.js", - "build/esm/**/*.js.map", - "build/esm/**/*.d.ts" + "build/cjs/**/*.js", + "build/cjs/**/*.js.map", + "build/cjs/**/*.d.ts" ], "publishConfig": { "access": "public" diff --git a/packages/instrumentation-undici/test/undici.test.ts b/packages/instrumentation-undici/test/undici.test.ts index 991eb29b04..c44ea33f37 100644 --- a/packages/instrumentation-undici/test/undici.test.ts +++ b/packages/instrumentation-undici/test/undici.test.ts @@ -15,6 +15,7 @@ */ import * as assert from 'assert'; import { Writable } from 'stream'; +import { createRequire } from 'module'; import { INVALID_SPAN_CONTEXT, @@ -39,6 +40,12 @@ import { assertSpan } from './utils/assertSpan.js'; import type { fetch, stream, request, Client, Dispatcher } from 'undici'; +// NOTE: now this test is compiled to ESM and `require` is not available. +// So we do this to not make a refactor on code that is not publishwd to the user. +// This could be handled once https://github.com/open-telemetry/opentelemetry-js/issues/4898 +// is closed. +const require = createRequire(import.meta.url); + // Undici docs (https://github.com/nodejs/undici#garbage-collection) suggest // that an undici response body should always be consumed. async function consumeResponseBody(body: Dispatcher.ResponseData['body']) { diff --git a/packages/instrumentation-undici/tsconfig.cjs.json b/packages/instrumentation-undici/tsconfig.cjs.json new file mode 100644 index 0000000000..9b87ebb819 --- /dev/null +++ b/packages/instrumentation-undici/tsconfig.cjs.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base", + "compilerOptions": { + "rootDir": "src", + "outDir": "build/cjs", + "module": "commonjs", + "moduleResolution": "node10", + "tsBuildInfoFile": "build/cjs/tsconfig.cjs.tsbuildinfo" + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/instrumentation-undici/tsconfig.esm.json b/packages/instrumentation-undici/tsconfig.esm.json deleted file mode 100644 index f97a35348f..0000000000 --- a/packages/instrumentation-undici/tsconfig.esm.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.base.esm.json", - "compilerOptions": { - "outDir": "build/esm", - "rootDir": "src", - "tsBuildInfoFile": "build/esm/tsconfig.esm.tsbuildinfo" - }, - "include": [ - "src/**/*.ts" - ] -} diff --git a/packages/instrumentation-undici/tsconfig.json b/packages/instrumentation-undici/tsconfig.json index c3975a475d..4d1e4c9930 100644 --- a/packages/instrumentation-undici/tsconfig.json +++ b/packages/instrumentation-undici/tsconfig.json @@ -1,10 +1,10 @@ { - "extends": "../../tsconfig.base", + "extends": "../../tsconfig.base.esm.json", "compilerOptions": { - "rootDir": ".", "outDir": "build", - "module": "commonjs", - "moduleResolution": "node10" + "rootDir": ".", + "module": "node16", + "tsBuildInfoFile": "build/src/tsconfig.esm.tsbuildinfo" }, "include": [ "src/**/*.ts",