From 71416d76e9dbd1e694fa6831e70d438e937a6dca Mon Sep 17 00:00:00 2001
From: Trent Mick <trentm@gmail.com>
Date: Wed, 29 Jan 2025 15:41:34 -0800
Subject: [PATCH] chore(sdk): bump min-supported node to ^18.19.0 || >=20.6.0

This raises the min-supported Node.js version on all packages
except the 'api' and 'semantic-conventions' packages.
This new minimum allows the usage of 'module.register()'
for better ESM instrumentation support.

Closes: https://github.com/open-telemetry/opentelemetry-js/issues/5395
---
 .github/workflows/unit-test.yml               |  15 ++-
 examples/basic-tracer-node/package.json       |   2 +-
 examples/esm-http-ts/package.json             |   2 +-
 examples/grpc-js/package.json                 |   2 +-
 examples/http/package.json                    |   2 +-
 examples/https/package.json                   |   2 +-
 examples/opentelemetry-web/package.json       |   2 +-
 examples/opentracing-shim/package.json        |   2 +-
 examples/otlp-exporter-node/package.json      |   2 +-
 .../node14/package.json                       |   2 +-
 .../node16/package.json                       |   2 +-
 .../examples/opencensus-shim/package.json     |   2 +-
 experimental/packages/api-events/package.json |   2 +-
 experimental/packages/api-logs/package.json   |   2 +-
 .../exporter-logs-otlp-grpc/package.json      |   2 +-
 .../exporter-logs-otlp-http/package.json      |   2 +-
 .../exporter-logs-otlp-proto/package.json     |   2 +-
 .../exporter-trace-otlp-grpc/package.json     |   2 +-
 .../exporter-trace-otlp-http/package.json     |   2 +-
 .../exporter-trace-otlp-proto/package.json    |   2 +-
 .../package.json                              |   2 +-
 .../package.json                              |   2 +-
 .../package.json                              |   2 +-
 .../package.json                              |   2 +-
 .../package.json                              |   2 +-
 .../package.json                              |   2 +-
 .../package.json                              |   2 +-
 .../package.json                              |   2 +-
 .../package.json                              |   2 +-
 .../package.json                              |   2 +-
 .../opentelemetry-sdk-node/package.json       |   2 +-
 .../packages/otlp-exporter-base/package.json  |   2 +-
 .../otlp-grpc-exporter-base/package.json      |   2 +-
 .../packages/otlp-transformer/package.json    |   2 +-
 .../sampler-jaeger-remote/package.json        |   2 +-
 experimental/packages/sdk-events/package.json |   2 +-
 experimental/packages/sdk-logs/package.json   |   2 +-
 .../packages/shim-opencensus/package.json     |   2 +-
 experimental/packages/web-common/package.json |   2 +-
 integration-tests/api/package.json            |   2 +-
 .../package.json                              |   2 +-
 package-lock.json                             | 106 +++++++++---------
 .../package.json                              |   2 +-
 .../package.json                              |   2 +-
 .../opentelemetry-context-zone/package.json   |   2 +-
 packages/opentelemetry-core/package.json      |   2 +-
 .../package.json                              |   2 +-
 .../package.json                              |   2 +-
 .../opentelemetry-propagator-b3/package.json  |   2 +-
 .../package.json                              |   2 +-
 packages/opentelemetry-resources/package.json |   2 +-
 .../opentelemetry-sdk-trace-base/package.json |   2 +-
 .../opentelemetry-sdk-trace-node/package.json |   2 +-
 .../opentelemetry-sdk-trace-web/package.json  |   2 +-
 .../package.json                              |   2 +-
 packages/sdk-metrics/package.json             |   2 +-
 packages/template/package.json                |   2 +-
 57 files changed, 121 insertions(+), 110 deletions(-)

diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml
index 486832ea1de..6051fe5bdea 100644
--- a/.github/workflows/unit-test.yml
+++ b/.github/workflows/unit-test.yml
@@ -12,9 +12,12 @@ jobs:
       fail-fast: false
       matrix:
         node_version:
+          - "18.19.0"
           - "18"
+          - "20.6.0"
           - "20"
           - "22"
+          - "23"
     runs-on: ubuntu-latest
     env:
       NPM_CONFIG_UNSAFE_PERM: true
@@ -30,11 +33,19 @@ jobs:
           node-version: ${{ matrix.node_version }}
 
       - run: npm install -g npm@latest
-        if: ${{ matrix.node_version == '20' || matrix.node_version == '22' }}
+        if: ${{
+          matrix.node_version == '20.6.0' ||
+          matrix.node_version == '20' ||
+          matrix.node_version == '22' ||
+          matrix.node_version == '23'
+          }}
 
       # npm@11.0.0 drops support for Node.js v18
       - run: npm install -g npm@"<11.0.0"
-        if: ${{ matrix.node_version == '18'}}
+        if: ${{
+          matrix.node_version == '18.19.0' ||
+          matrix.node_version == '18'
+          }}
 
       - name: Bootstrap
         run: npm ci
diff --git a/examples/basic-tracer-node/package.json b/examples/basic-tracer-node/package.json
index d379943c7e8..2d7e6cd644e 100644
--- a/examples/basic-tracer-node/package.json
+++ b/examples/basic-tracer-node/package.json
@@ -16,7 +16,7 @@
     "tracing"
   ],
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
diff --git a/examples/esm-http-ts/package.json b/examples/esm-http-ts/package.json
index 96c8f6b4326..6873bc2a606 100644
--- a/examples/esm-http-ts/package.json
+++ b/examples/esm-http-ts/package.json
@@ -22,7 +22,7 @@
     "typescript"
   ],
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
diff --git a/examples/grpc-js/package.json b/examples/grpc-js/package.json
index 9ee04825350..319285591c3 100644
--- a/examples/grpc-js/package.json
+++ b/examples/grpc-js/package.json
@@ -20,7 +20,7 @@
     "tracing"
   ],
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
diff --git a/examples/http/package.json b/examples/http/package.json
index 1126b871140..0f4a4b2cb2c 100644
--- a/examples/http/package.json
+++ b/examples/http/package.json
@@ -21,7 +21,7 @@
     "tracing"
   ],
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
diff --git a/examples/https/package.json b/examples/https/package.json
index 8951bed78a9..90ab5287c73 100644
--- a/examples/https/package.json
+++ b/examples/https/package.json
@@ -25,7 +25,7 @@
     "tracing"
   ],
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
diff --git a/examples/opentelemetry-web/package.json b/examples/opentelemetry-web/package.json
index 627575e6e4d..85fd2fd53e4 100644
--- a/examples/opentelemetry-web/package.json
+++ b/examples/opentelemetry-web/package.json
@@ -25,7 +25,7 @@
     "web"
   ],
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
diff --git a/examples/opentracing-shim/package.json b/examples/opentracing-shim/package.json
index 913ae34c715..03328570113 100644
--- a/examples/opentracing-shim/package.json
+++ b/examples/opentracing-shim/package.json
@@ -22,7 +22,7 @@
     "opentracing"
   ],
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
diff --git a/examples/otlp-exporter-node/package.json b/examples/otlp-exporter-node/package.json
index 6fb4d21a3e0..432df4d98a6 100644
--- a/examples/otlp-exporter-node/package.json
+++ b/examples/otlp-exporter-node/package.json
@@ -21,7 +21,7 @@
     "tracing"
   ],
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
diff --git a/experimental/backwards-compatibility/node14/package.json b/experimental/backwards-compatibility/node14/package.json
index e85d0a1b4c0..00f4141ced8 100644
--- a/experimental/backwards-compatibility/node14/package.json
+++ b/experimental/backwards-compatibility/node14/package.json
@@ -20,6 +20,6 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   }
 }
diff --git a/experimental/backwards-compatibility/node16/package.json b/experimental/backwards-compatibility/node16/package.json
index bc93192456e..97c00246f07 100644
--- a/experimental/backwards-compatibility/node16/package.json
+++ b/experimental/backwards-compatibility/node16/package.json
@@ -20,6 +20,6 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   }
 }
diff --git a/experimental/examples/opencensus-shim/package.json b/experimental/examples/opencensus-shim/package.json
index 42e36e8141b..cdfa55206b9 100644
--- a/experimental/examples/opencensus-shim/package.json
+++ b/experimental/examples/opencensus-shim/package.json
@@ -20,7 +20,7 @@
     "opencensus"
   ],
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
diff --git a/experimental/packages/api-events/package.json b/experimental/packages/api-events/package.json
index 21c308e0d1b..f99849850e8 100644
--- a/experimental/packages/api-events/package.json
+++ b/experimental/packages/api-events/package.json
@@ -40,7 +40,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/api-logs/package.json b/experimental/packages/api-logs/package.json
index e12f03a5001..bad264b22d0 100644
--- a/experimental/packages/api-logs/package.json
+++ b/experimental/packages/api-logs/package.json
@@ -40,7 +40,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/exporter-logs-otlp-grpc/package.json b/experimental/packages/exporter-logs-otlp-grpc/package.json
index 79ad9d937c5..825cfe07349 100644
--- a/experimental/packages/exporter-logs-otlp-grpc/package.json
+++ b/experimental/packages/exporter-logs-otlp-grpc/package.json
@@ -33,7 +33,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/experimental/packages/exporter-logs-otlp-http/package.json b/experimental/packages/exporter-logs-otlp-http/package.json
index 736fe078329..90b9e2da25a 100644
--- a/experimental/packages/exporter-logs-otlp-http/package.json
+++ b/experimental/packages/exporter-logs-otlp-http/package.json
@@ -26,7 +26,7 @@
     "url": "https://github.com/open-telemetry/opentelemetry-js/issues"
   },
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "scripts": {
     "prepublishOnly": "npm run compile",
diff --git a/experimental/packages/exporter-logs-otlp-proto/package.json b/experimental/packages/exporter-logs-otlp-proto/package.json
index a209bde0385..e3fad3e5722 100644
--- a/experimental/packages/exporter-logs-otlp-proto/package.json
+++ b/experimental/packages/exporter-logs-otlp-proto/package.json
@@ -42,7 +42,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/exporter-trace-otlp-grpc/package.json b/experimental/packages/exporter-trace-otlp-grpc/package.json
index 3373678fe64..8f990e4303c 100644
--- a/experimental/packages/exporter-trace-otlp-grpc/package.json
+++ b/experimental/packages/exporter-trace-otlp-grpc/package.json
@@ -32,7 +32,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/experimental/packages/exporter-trace-otlp-http/package.json b/experimental/packages/exporter-trace-otlp-http/package.json
index 3974c2a2114..92bbb4575af 100644
--- a/experimental/packages/exporter-trace-otlp-http/package.json
+++ b/experimental/packages/exporter-trace-otlp-http/package.json
@@ -42,7 +42,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/exporter-trace-otlp-proto/package.json b/experimental/packages/exporter-trace-otlp-proto/package.json
index 637a107575c..251294e7247 100644
--- a/experimental/packages/exporter-trace-otlp-proto/package.json
+++ b/experimental/packages/exporter-trace-otlp-proto/package.json
@@ -41,7 +41,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/opentelemetry-browser-detector/package.json b/experimental/packages/opentelemetry-browser-detector/package.json
index 30c837c901f..88c70207473 100644
--- a/experimental/packages/opentelemetry-browser-detector/package.json
+++ b/experimental/packages/opentelemetry-browser-detector/package.json
@@ -33,7 +33,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json
index 89c0131a543..4acd5b8d2a8 100644
--- a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json
+++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json
@@ -32,7 +32,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json
index 0d5ee25c521..c726d1a8ead 100644
--- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json
+++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json
@@ -42,7 +42,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json
index 3920be12b17..366957b88f2 100644
--- a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json
+++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json
@@ -34,7 +34,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/opentelemetry-exporter-prometheus/package.json b/experimental/packages/opentelemetry-exporter-prometheus/package.json
index 7e553d3dcd1..e2de5835f29 100644
--- a/experimental/packages/opentelemetry-exporter-prometheus/package.json
+++ b/experimental/packages/opentelemetry-exporter-prometheus/package.json
@@ -29,7 +29,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/experimental/packages/opentelemetry-instrumentation-fetch/package.json b/experimental/packages/opentelemetry-instrumentation-fetch/package.json
index 14bfac05828..9d05cd22a6b 100644
--- a/experimental/packages/opentelemetry-instrumentation-fetch/package.json
+++ b/experimental/packages/opentelemetry-instrumentation-fetch/package.json
@@ -34,7 +34,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/opentelemetry-instrumentation-grpc/package.json b/experimental/packages/opentelemetry-instrumentation-grpc/package.json
index 089b1d9af14..8069de18139 100644
--- a/experimental/packages/opentelemetry-instrumentation-grpc/package.json
+++ b/experimental/packages/opentelemetry-instrumentation-grpc/package.json
@@ -32,7 +32,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/experimental/packages/opentelemetry-instrumentation-http/package.json b/experimental/packages/opentelemetry-instrumentation-http/package.json
index 8ab97f19d3d..5375a66da31 100644
--- a/experimental/packages/opentelemetry-instrumentation-http/package.json
+++ b/experimental/packages/opentelemetry-instrumentation-http/package.json
@@ -34,7 +34,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json b/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json
index cd31b43e34b..2f1e58ddc9f 100644
--- a/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json
+++ b/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json
@@ -34,7 +34,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/opentelemetry-instrumentation/package.json b/experimental/packages/opentelemetry-instrumentation/package.json
index 95582914649..617a970f2b6 100644
--- a/experimental/packages/opentelemetry-instrumentation/package.json
+++ b/experimental/packages/opentelemetry-instrumentation/package.json
@@ -110,7 +110,7 @@
     "webpack-cli": "6.0.1"
   },
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "sideEffects": false
 }
diff --git a/experimental/packages/opentelemetry-sdk-node/package.json b/experimental/packages/opentelemetry-sdk-node/package.json
index 4b952a8d3fa..70857f47f93 100644
--- a/experimental/packages/opentelemetry-sdk-node/package.json
+++ b/experimental/packages/opentelemetry-sdk-node/package.json
@@ -31,7 +31,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/experimental/packages/otlp-exporter-base/package.json b/experimental/packages/otlp-exporter-base/package.json
index 4ccb8644858..c2c9785b5e4 100644
--- a/experimental/packages/otlp-exporter-base/package.json
+++ b/experimental/packages/otlp-exporter-base/package.json
@@ -55,7 +55,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/otlp-grpc-exporter-base/package.json b/experimental/packages/otlp-grpc-exporter-base/package.json
index 36005c17372..58db797fa67 100644
--- a/experimental/packages/otlp-grpc-exporter-base/package.json
+++ b/experimental/packages/otlp-grpc-exporter-base/package.json
@@ -32,7 +32,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/experimental/packages/otlp-transformer/package.json b/experimental/packages/otlp-transformer/package.json
index 573c82ebd1e..89701979c65 100644
--- a/experimental/packages/otlp-transformer/package.json
+++ b/experimental/packages/otlp-transformer/package.json
@@ -42,7 +42,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/experimental/packages/sampler-jaeger-remote/package.json b/experimental/packages/sampler-jaeger-remote/package.json
index cf7699802bd..89b0a6c047b 100644
--- a/experimental/packages/sampler-jaeger-remote/package.json
+++ b/experimental/packages/sampler-jaeger-remote/package.json
@@ -29,7 +29,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=14"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/experimental/packages/sdk-events/package.json b/experimental/packages/sdk-events/package.json
index bfaa7e13701..92e87fa59c3 100644
--- a/experimental/packages/sdk-events/package.json
+++ b/experimental/packages/sdk-events/package.json
@@ -20,7 +20,7 @@
     "url": "https://github.com/open-telemetry/opentelemetry-js/issues"
   },
   "engines": {
-    "node": ">=14"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "scripts": {
     "clean": "tsc --build --clean tsconfig.json tsconfig.esm.json tsconfig.esnext.json",
diff --git a/experimental/packages/sdk-logs/package.json b/experimental/packages/sdk-logs/package.json
index edc23e31a51..e9249144e8f 100644
--- a/experimental/packages/sdk-logs/package.json
+++ b/experimental/packages/sdk-logs/package.json
@@ -26,7 +26,7 @@
     "url": "https://github.com/open-telemetry/opentelemetry-js/issues"
   },
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "scripts": {
     "prepublishOnly": "npm run compile",
diff --git a/experimental/packages/shim-opencensus/package.json b/experimental/packages/shim-opencensus/package.json
index 086f092c9aa..d693ed6fe09 100644
--- a/experimental/packages/shim-opencensus/package.json
+++ b/experimental/packages/shim-opencensus/package.json
@@ -34,7 +34,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/experimental/packages/web-common/package.json b/experimental/packages/web-common/package.json
index fc9b8c7c9e2..b707f288694 100644
--- a/experimental/packages/web-common/package.json
+++ b/experimental/packages/web-common/package.json
@@ -20,7 +20,7 @@
     "url": "https://github.com/open-telemetry/opentelemetry-js/issues"
   },
   "engines": {
-    "node": ">=14"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "scripts": {
     "clean": "tsc --build --clean tsconfig.json tsconfig.esm.json tsconfig.esnext.json",
diff --git a/integration-tests/api/package.json b/integration-tests/api/package.json
index 917a0dd2f7c..50721576d45 100644
--- a/integration-tests/api/package.json
+++ b/integration-tests/api/package.json
@@ -17,7 +17,7 @@
     "url": "https://github.com/open-telemetry/opentelemetry-js/issues"
   },
   "engines": {
-    "node": ">=14"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "scripts": {
     "compile": "cross-var lerna run version --scope $npm_package_name --include-dependencies",
diff --git a/integration-tests/propagation-validation-server/package.json b/integration-tests/propagation-validation-server/package.json
index a7d4833091f..3d066ed319d 100644
--- a/integration-tests/propagation-validation-server/package.json
+++ b/integration-tests/propagation-validation-server/package.json
@@ -23,6 +23,6 @@
     "typescript": "5.0.4"
   },
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   }
 }
diff --git a/package-lock.json b/package-lock.json
index ece793596b0..b8170473caf 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -210,7 +210,7 @@
         "@opentelemetry/semantic-conventions": "1.28.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "examples/http": {
@@ -232,7 +232,7 @@
         "cross-env": "^6.0.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "examples/https": {
@@ -254,7 +254,7 @@
         "cross-env": "^6.0.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "examples/opentelemetry-web": {
@@ -290,7 +290,7 @@
         "webpack-merge": "^5.10.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "examples/opentelemetry-web/node_modules/@discoveryjs/json-ext": {
@@ -506,7 +506,7 @@
         "@opentelemetry/semantic-conventions": "1.28.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "experimental/backwards-compatibility/node14": {
@@ -522,7 +522,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "experimental/backwards-compatibility/node14/node_modules/@types/node": {
@@ -544,7 +544,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "experimental/backwards-compatibility/node16/node_modules/@types/node": {
@@ -611,7 +611,7 @@
         "@opentelemetry/shim-opencensus": "0.57.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "experimental/examples/prometheus": {
@@ -652,7 +652,7 @@
         "webpack": "5.96.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "experimental/packages/api-events/node_modules/@types/node": {
@@ -789,7 +789,7 @@
         "webpack": "5.96.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "experimental/packages/api-logs/node_modules/@types/node": {
@@ -928,7 +928,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -1034,7 +1034,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -1185,7 +1185,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -1326,7 +1326,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -1431,7 +1431,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -1580,7 +1580,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -1725,7 +1725,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -1867,7 +1867,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -1972,7 +1972,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -2111,7 +2111,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -2201,7 +2201,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -2310,7 +2310,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -2356,7 +2356,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -2500,7 +2500,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -2599,7 +2599,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -2706,7 +2706,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -2968,7 +2968,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.3.0 <1.10.0"
@@ -3068,7 +3068,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -3207,7 +3207,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -3308,7 +3308,7 @@
         "webpack": "5.96.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -3438,7 +3438,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=14"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.3.0"
@@ -3570,7 +3570,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=14"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.4.0 <1.10.0"
@@ -3727,7 +3727,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.4.0 <1.10.0"
@@ -3916,7 +3916,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opencensus/core": "^0.1.0",
@@ -4021,7 +4021,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=14"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.4.0 <1.10.0"
@@ -4158,7 +4158,7 @@
         "nyc": "17.1.0"
       },
       "engines": {
-        "node": ">=14"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "integration-tests/api/node_modules/@types/node": {
@@ -4238,7 +4238,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "node_modules/@ampproject/remapping": {
@@ -28516,7 +28516,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.0.0 <1.10.0"
@@ -28597,7 +28597,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "packages/opentelemetry-context-zone-peer-dep": {
@@ -28633,7 +28633,7 @@
         "zone.js": "0.15.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.0.0 <1.10.0",
@@ -28777,7 +28777,7 @@
         "webpack": "5.96.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.0.0 <1.10.0"
@@ -28915,7 +28915,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.0.0"
@@ -29020,7 +29020,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": "^1.0.0"
@@ -29152,7 +29152,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.0.0 <1.10.0"
@@ -29249,7 +29249,7 @@
         "webpack": "5.96.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.0.0 <1.10.0"
@@ -29395,7 +29395,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.3.0 <1.10.0"
@@ -29591,7 +29591,7 @@
         "webpack": "5.96.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.3.0 <1.10.0"
@@ -29730,7 +29730,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.0.0 <1.10.0"
@@ -29839,7 +29839,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.0.0 <1.10.0"
@@ -29975,7 +29975,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.0.0 <1.10.0"
@@ -30075,7 +30075,7 @@
         "webpack-cli": "6.0.1"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       },
       "peerDependencies": {
         "@opentelemetry/api": ">=1.9.0 <1.10.0"
@@ -30199,7 +30199,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "packages/template/node_modules/@types/node": {
@@ -30230,7 +30230,7 @@
         "typescript": "5.0.4"
       },
       "engines": {
-        "node": ">=18"
+        "node": "^18.19.0 || >=20.6.0"
       }
     },
     "semantic-conventions/node_modules/@types/node": {
diff --git a/packages/opentelemetry-context-async-hooks/package.json b/packages/opentelemetry-context-async-hooks/package.json
index a14f964df1a..6487e2e3179 100644
--- a/packages/opentelemetry-context-async-hooks/package.json
+++ b/packages/opentelemetry-context-async-hooks/package.json
@@ -30,7 +30,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/packages/opentelemetry-context-zone-peer-dep/package.json b/packages/opentelemetry-context-zone-peer-dep/package.json
index 02b6ddfe0d6..573ccba7857 100644
--- a/packages/opentelemetry-context-zone-peer-dep/package.json
+++ b/packages/opentelemetry-context-zone-peer-dep/package.json
@@ -33,7 +33,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/packages/opentelemetry-context-zone/package.json b/packages/opentelemetry-context-zone/package.json
index d6b150b4c7b..194c2ee3dec 100644
--- a/packages/opentelemetry-context-zone/package.json
+++ b/packages/opentelemetry-context-zone/package.json
@@ -31,7 +31,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/packages/opentelemetry-core/package.json b/packages/opentelemetry-core/package.json
index bea41230698..f60cbe646bb 100644
--- a/packages/opentelemetry-core/package.json
+++ b/packages/opentelemetry-core/package.json
@@ -43,7 +43,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/packages/opentelemetry-exporter-jaeger/package.json b/packages/opentelemetry-exporter-jaeger/package.json
index 32ab4d0ee8b..2b510eca4d6 100644
--- a/packages/opentelemetry-exporter-jaeger/package.json
+++ b/packages/opentelemetry-exporter-jaeger/package.json
@@ -30,7 +30,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/packages/opentelemetry-exporter-zipkin/package.json b/packages/opentelemetry-exporter-zipkin/package.json
index 3810fc51e29..bc633994f9d 100644
--- a/packages/opentelemetry-exporter-zipkin/package.json
+++ b/packages/opentelemetry-exporter-zipkin/package.json
@@ -39,7 +39,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/packages/opentelemetry-propagator-b3/package.json b/packages/opentelemetry-propagator-b3/package.json
index f8d7c9f69d7..2bed964ef1a 100644
--- a/packages/opentelemetry-propagator-b3/package.json
+++ b/packages/opentelemetry-propagator-b3/package.json
@@ -32,7 +32,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/packages/opentelemetry-propagator-jaeger/package.json b/packages/opentelemetry-propagator-jaeger/package.json
index 9ba1271ad20..6dad1982a7b 100644
--- a/packages/opentelemetry-propagator-jaeger/package.json
+++ b/packages/opentelemetry-propagator-jaeger/package.json
@@ -34,7 +34,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/packages/opentelemetry-resources/package.json b/packages/opentelemetry-resources/package.json
index cf531557dbd..9a9d27a003d 100644
--- a/packages/opentelemetry-resources/package.json
+++ b/packages/opentelemetry-resources/package.json
@@ -43,7 +43,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/packages/opentelemetry-sdk-trace-base/package.json b/packages/opentelemetry-sdk-trace-base/package.json
index 2d1a746e299..3f3318ab34b 100644
--- a/packages/opentelemetry-sdk-trace-base/package.json
+++ b/packages/opentelemetry-sdk-trace-base/package.json
@@ -44,7 +44,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/packages/opentelemetry-sdk-trace-node/package.json b/packages/opentelemetry-sdk-trace-node/package.json
index 22a6b056e23..2914ee578ff 100644
--- a/packages/opentelemetry-sdk-trace-node/package.json
+++ b/packages/opentelemetry-sdk-trace-node/package.json
@@ -31,7 +31,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/packages/opentelemetry-sdk-trace-web/package.json b/packages/opentelemetry-sdk-trace-web/package.json
index 5df90fd1c9d..8a2b661d212 100644
--- a/packages/opentelemetry-sdk-trace-web/package.json
+++ b/packages/opentelemetry-sdk-trace-web/package.json
@@ -34,7 +34,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/packages/opentelemetry-shim-opentracing/package.json b/packages/opentelemetry-shim-opentracing/package.json
index 06540cb794f..5a180ce4002 100644
--- a/packages/opentelemetry-shim-opentracing/package.json
+++ b/packages/opentelemetry-shim-opentracing/package.json
@@ -28,7 +28,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/src/**/*.js",
diff --git a/packages/sdk-metrics/package.json b/packages/sdk-metrics/package.json
index b08d40ad606..d396007ef16 100644
--- a/packages/sdk-metrics/package.json
+++ b/packages/sdk-metrics/package.json
@@ -34,7 +34,7 @@
   "author": "OpenTelemetry Authors",
   "license": "Apache-2.0",
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "files": [
     "build/esm/**/*.js",
diff --git a/packages/template/package.json b/packages/template/package.json
index 1cc61fb0e25..cac742773f0 100644
--- a/packages/template/package.json
+++ b/packages/template/package.json
@@ -23,7 +23,7 @@
     "url": "https://github.com/open-telemetry/opentelemetry-js/issues"
   },
   "engines": {
-    "node": ">=18"
+    "node": "^18.19.0 || >=20.6.0"
   },
   "scripts": {
     "prepublishOnly": "npm run compile",