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 diff --git a/packages/instrumentation-undici/package.json b/packages/instrumentation-undici/package.json index 6be3ea1a36..f0a67d7ac7 100644 --- a/packages/instrumentation-undici/package.json +++ b/packages/instrumentation-undici/package.json @@ -3,25 +3,25 @@ "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", "directory": "packages/instrumentation-undici" }, "scripts": { - "clean": "rimraf build/*", - "compile": "tsc -p .", + "clean": "tsc --build --clean tsconfig.json tsconfig.cjs.json", + "compile": "tsc --build tsconfig.json tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > build/cjs/package.json", "compile:with-dependencies": "nx run-many -t compile -p @opentelemetry/instrumentation-undici", - "lint": "eslint . --ext=ts,js,mjs", - "lint:fix": "eslint . --ext=ts,js,mjs --fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "prepublishOnly": "npm run compile", "tdd": "npm run test -- --watch-extensions ts --watch", - "test": "nyc --no-clean mocha test/**/*.test.ts", + "test": "nyc mocha --loader=ts-node/esm test/**/*.test.ts", "test-all-versions": "tav", - "test-merge-coverage": "nyc merge .nyc_output coverage/coverage-final.json", - "version:update": "node ../../scripts/version-update.js", - "watch": "tsc -w" + "version:update": "node ../../scripts/version-update.js" }, "keywords": [ "opentelemetry", @@ -36,10 +36,23 @@ "engines": { "node": "^18.19.0 || >=20.6.0" }, + "exports": { + "import": { + "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/**/*.d.ts", + "build/cjs/**/*.js", + "build/cjs/**/*.js.map", + "build/cjs/**/*.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..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, @@ -31,14 +32,20 @@ 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'; +// 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/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.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.json b/packages/instrumentation-undici/tsconfig.json index 4078877ce6..4d1e4c9930 100644 --- a/packages/instrumentation-undici/tsconfig.json +++ b/packages/instrumentation-undici/tsconfig.json @@ -1,8 +1,10 @@ { - "extends": "../../tsconfig.base", + "extends": "../../tsconfig.base.esm.json", "compilerOptions": { + "outDir": "build", "rootDir": ".", - "outDir": "build" + "module": "node16", + "tsBuildInfoFile": "build/src/tsconfig.esm.tsbuildinfo" }, "include": [ "src/**/*.ts",