From b205b9937fd6fc658721c6291712870e0e53ecf0 Mon Sep 17 00:00:00 2001 From: Edoardo Luppi Date: Fri, 8 May 2026 14:58:35 +0200 Subject: [PATCH 1/3] build: configure tsdown to output both ESM and CJS --- packages/client/package.json | 78 ++++++++++++++---- .../client/test/client/barrelClean.test.ts | 2 +- packages/client/tsdown.config.ts | 10 ++- packages/core/package.json | 43 ++++++++-- packages/middleware/express/package.json | 14 +++- packages/middleware/express/tsdown.config.ts | 9 ++- packages/middleware/fastify/package.json | 14 +++- packages/middleware/fastify/tsdown.config.ts | 9 ++- packages/middleware/hono/package.json | 14 +++- packages/middleware/hono/tsdown.config.ts | 9 ++- packages/middleware/node/package.json | 16 +++- packages/middleware/node/tsdown.config.ts | 10 ++- packages/server/package.json | 80 ++++++++++++++----- .../server/test/server/barrelClean.test.ts | 2 +- packages/server/tsdown.config.ts | 10 ++- 15 files changed, 256 insertions(+), 64 deletions(-) diff --git a/packages/client/package.json b/packages/client/package.json index 537804b732..cfd07f96b7 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -19,46 +19,90 @@ "mcp", "client" ], + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.cts", "exports": { ".": { - "types": "./dist/index.d.mts", - "import": "./dist/index.mjs" + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } }, "./stdio": { - "types": "./dist/stdio.d.mts", - "import": "./dist/stdio.mjs" + "import": { + "types": "./dist/esm/stdio.d.mts", + "default": "./dist/esm/stdio.mjs" + }, + "require": { + "types": "./dist/cjs/stdio.d.cts", + "default": "./dist/cjs/stdio.cjs" + } }, "./validators/cf-worker": { - "types": "./dist/validators/cfWorker.d.mts", - "import": "./dist/validators/cfWorker.mjs" + "import": { + "types": "./dist/esm/validators/cfWorker.d.mts", + "default": "./dist/esm/validators/cfWorker.mjs" + }, + "require": { + "types": "./dist/cjs/validators/cfWorker.d.cts", + "default": "./dist/cjs/validators/cfWorker.cjs" + } }, "./_shims": { "workerd": { - "types": "./dist/shimsWorkerd.d.mts", - "import": "./dist/shimsWorkerd.mjs" + "import": { + "types": "./dist/esm/shimsWorkerd.d.mts", + "default": "./dist/esm/shimsWorkerd.mjs" + }, + "require": { + "types": "./dist/cjs/shimsWorkerd.d.cts", + "default": "./dist/cjs/shimsWorkerd.cjs" + } }, "browser": { - "types": "./dist/shimsBrowser.d.mts", - "import": "./dist/shimsBrowser.mjs" + "import": { + "types": "./dist/esm/shimsBrowser.d.mts", + "default": "./dist/esm/shimsBrowser.mjs" + }, + "require": { + "types": "./dist/cjs/shimsBrowser.d.cts", + "default": "./dist/cjs/shimsBrowser.cjs" + } }, "node": { - "types": "./dist/shimsNode.d.mts", - "import": "./dist/shimsNode.mjs" + "import": { + "types": "./dist/esm/shimsNode.d.mts", + "default": "./dist/esm/shimsNode.mjs" + }, + "require": { + "types": "./dist/cjs/shimsNode.d.cts", + "default": "./dist/cjs/shimsNode.cjs" + } }, "default": { - "types": "./dist/shimsNode.d.mts", - "import": "./dist/shimsNode.mjs" + "import": { + "types": "./dist/esm/shimsNode.d.mts", + "default": "./dist/esm/shimsNode.mjs" + }, + "require": { + "types": "./dist/cjs/shimsNode.d.cts", + "default": "./dist/cjs/shimsNode.cjs" + } } } }, - "types": "./dist/index.d.mts", "typesVersions": { "*": { "validators/cf-worker": [ - "dist/validators/cfWorker.d.mts" + "dist/cjs/validators/cfWorker.d.cts" ], "stdio": [ - "dist/stdio.d.mts" + "dist/cjs/stdio.d.cts" ] } }, diff --git a/packages/client/test/client/barrelClean.test.ts b/packages/client/test/client/barrelClean.test.ts index 6a7dc02b7f..c753f69a2b 100644 --- a/packages/client/test/client/barrelClean.test.ts +++ b/packages/client/test/client/barrelClean.test.ts @@ -6,7 +6,7 @@ import { fileURLToPath } from 'node:url'; import { beforeAll, describe, expect, test } from 'vitest'; const pkgDir = join(dirname(fileURLToPath(import.meta.url)), '../..'); -const distDir = join(pkgDir, 'dist'); +const distDir = join(pkgDir, 'dist/esm'); const NODE_ONLY = /\b(child_process|cross-spawn|node:stream|node:child_process)\b/; function chunkImportsOf(entryPath: string): string[] { diff --git a/packages/client/tsdown.config.ts b/packages/client/tsdown.config.ts index c547e6ec9a..882a6814fe 100644 --- a/packages/client/tsdown.config.ts +++ b/packages/client/tsdown.config.ts @@ -7,8 +7,16 @@ export default defineConfig({ entry: ['src/index.ts', 'src/stdio.ts', 'src/shimsNode.ts', 'src/shimsWorkerd.ts', 'src/shimsBrowser.ts', 'src/validators/cfWorker.ts'], // 2. Output Configuration - format: ['esm'], outDir: 'dist', + format: { + esm: { + outDir: 'dist/esm' + }, + cjs: { + outDir: 'dist/cjs' + } + }, + clean: true, // Recommended: Cleans 'dist' before building sourcemap: true, diff --git a/packages/core/package.json b/packages/core/package.json index 201773736f..dd0be6c617 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -20,22 +20,49 @@ "mcp", "core" ], + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.cts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.mjs" + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } }, "./types": { - "types": "./src/exports/types/index.ts", - "import": "./src/exports/types/index.ts" + "import": { + "types": "./src/exports/types/index.ts", + "default": "./src/exports/types/index.ts" + }, + "require": { + "types": "./src/exports/types/index.ts", + "default": "./src/exports/types/index.ts" + } }, "./public": { - "types": "./src/exports/public/index.ts", - "import": "./src/exports/public/index.ts" + "import": { + "types": "./src/exports/public/index.ts", + "default": "./src/exports/public/index.ts" + }, + "require": { + "types": "./src/exports/public/index.ts", + "default": "./src/exports/public/index.ts" + } }, "./validators/cfWorker": { - "types": "./src/validators/cfWorkerProvider.ts", - "import": "./src/validators/cfWorkerProvider.ts" + "import": { + "types": "./src/validators/cfWorkerProvider.ts", + "default": "./src/validators/cfWorkerProvider.ts" + }, + "require": { + "types": "./src/validators/cfWorkerProvider.ts", + "default": "./src/validators/cfWorkerProvider.ts" + } } }, "scripts": { diff --git a/packages/middleware/express/package.json b/packages/middleware/express/package.json index b0b695344e..bce3a4ce9c 100644 --- a/packages/middleware/express/package.json +++ b/packages/middleware/express/package.json @@ -21,13 +21,21 @@ "express", "middleware" ], + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.cts", "exports": { ".": { - "types": "./dist/index.d.mts", - "import": "./dist/index.mjs" + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } } }, - "types": "./dist/index.d.mts", "files": [ "dist" ], diff --git a/packages/middleware/express/tsdown.config.ts b/packages/middleware/express/tsdown.config.ts index 64ed143a86..f0fa38a7cf 100644 --- a/packages/middleware/express/tsdown.config.ts +++ b/packages/middleware/express/tsdown.config.ts @@ -3,8 +3,15 @@ import { defineConfig } from 'tsdown'; export default defineConfig({ failOnWarn: 'ci-only', entry: ['src/index.ts'], - format: ['esm'], outDir: 'dist', + format: { + esm: { + outDir: 'dist/esm' + }, + cjs: { + outDir: 'dist/cjs' + } + }, clean: true, sourcemap: true, target: 'esnext', diff --git a/packages/middleware/fastify/package.json b/packages/middleware/fastify/package.json index de6df8f3bc..b79e566e43 100644 --- a/packages/middleware/fastify/package.json +++ b/packages/middleware/fastify/package.json @@ -21,13 +21,21 @@ "fastify", "middleware" ], + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.cts", "exports": { ".": { - "types": "./dist/index.d.mts", - "import": "./dist/index.mjs" + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } } }, - "types": "./dist/index.d.mts", "files": [ "dist" ], diff --git a/packages/middleware/fastify/tsdown.config.ts b/packages/middleware/fastify/tsdown.config.ts index 64ed143a86..f0fa38a7cf 100644 --- a/packages/middleware/fastify/tsdown.config.ts +++ b/packages/middleware/fastify/tsdown.config.ts @@ -3,8 +3,15 @@ import { defineConfig } from 'tsdown'; export default defineConfig({ failOnWarn: 'ci-only', entry: ['src/index.ts'], - format: ['esm'], outDir: 'dist', + format: { + esm: { + outDir: 'dist/esm' + }, + cjs: { + outDir: 'dist/cjs' + } + }, clean: true, sourcemap: true, target: 'esnext', diff --git a/packages/middleware/hono/package.json b/packages/middleware/hono/package.json index f067aedf91..5987f05b60 100644 --- a/packages/middleware/hono/package.json +++ b/packages/middleware/hono/package.json @@ -21,13 +21,21 @@ "hono", "middleware" ], + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.cts", "exports": { ".": { - "types": "./dist/index.d.mts", - "import": "./dist/index.mjs" + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } } }, - "types": "./dist/index.d.mts", "files": [ "dist" ], diff --git a/packages/middleware/hono/tsdown.config.ts b/packages/middleware/hono/tsdown.config.ts index 64ed143a86..f0fa38a7cf 100644 --- a/packages/middleware/hono/tsdown.config.ts +++ b/packages/middleware/hono/tsdown.config.ts @@ -3,8 +3,15 @@ import { defineConfig } from 'tsdown'; export default defineConfig({ failOnWarn: 'ci-only', entry: ['src/index.ts'], - format: ['esm'], outDir: 'dist', + format: { + esm: { + outDir: 'dist/esm' + }, + cjs: { + outDir: 'dist/cjs' + } + }, clean: true, sourcemap: true, target: 'esnext', diff --git a/packages/middleware/node/package.json b/packages/middleware/node/package.json index 30fa7ed663..c2893244e7 100644 --- a/packages/middleware/node/package.json +++ b/packages/middleware/node/package.json @@ -20,17 +20,25 @@ "node.js", "middleware" ], + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.cts", "exports": { ".": { - "types": "./dist/index.d.mts", - "import": "./dist/index.mjs" + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } } }, - "types": "./dist/index.d.mts", "typesVersions": { "*": { "sse": [ - "dist/sse.d.mts" + "dist/cjs/sse.d.cts" ] } }, diff --git a/packages/middleware/node/tsdown.config.ts b/packages/middleware/node/tsdown.config.ts index 7d90f6517f..35ee11e2f1 100644 --- a/packages/middleware/node/tsdown.config.ts +++ b/packages/middleware/node/tsdown.config.ts @@ -7,8 +7,16 @@ export default defineConfig({ entry: ['src/index.ts'], // 2. Output Configuration - format: ['esm'], outDir: 'dist', + format: { + esm: { + outDir: 'dist/esm' + }, + cjs: { + outDir: 'dist/cjs' + } + }, + clean: true, // Recommended: Cleans 'dist' before building sourcemap: true, diff --git a/packages/server/package.json b/packages/server/package.json index 20195e7101..62fe065ae5 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -19,49 +19,93 @@ "mcp", "server" ], + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.cts", "exports": { ".": { - "types": "./dist/index.d.mts", - "import": "./dist/index.mjs" + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } }, "./stdio": { - "types": "./dist/stdio.d.mts", - "import": "./dist/stdio.mjs" + "import": { + "types": "./dist/esm/stdio.d.mts", + "default": "./dist/esm/stdio.mjs" + }, + "require": { + "types": "./dist/cjs/stdio.d.cts", + "default": "./dist/cjs/stdio.cjs" + } }, "./validators/cf-worker": { - "types": "./dist/validators/cfWorker.d.mts", - "import": "./dist/validators/cfWorker.mjs" + "import": { + "types": "./dist/esm/validators/cfWorker.d.mts", + "default": "./dist/esm/validators/cfWorker.mjs" + }, + "require": { + "types": "./dist/cjs/validators/cfWorker.d.cts", + "default": "./dist/cjs/validators/cfWorker.cjs" + } }, "./_shims": { "workerd": { - "types": "./dist/shimsWorkerd.d.mts", - "import": "./dist/shimsWorkerd.mjs" + "import": { + "types": "./dist/esm/shimsWorkerd.d.mts", + "default": "./dist/esm/shimsWorkerd.mjs" + }, + "require": { + "types": "./dist/cjs/shimsWorkerd.d.cts", + "default": "./dist/cjs/shimsWorkerd.cjs" + } }, "browser": { - "types": "./dist/shimsWorkerd.d.mts", - "import": "./dist/shimsWorkerd.mjs" + "import": { + "types": "./dist/esm/shimsWorkerd.d.mts", + "default": "./dist/esm/shimsWorkerd.mjs" + }, + "require": { + "types": "./dist/cjs/shimsWorkerd.d.cts", + "default": "./dist/cjs/shimsWorkerd.cjs" + } }, "node": { - "types": "./dist/shimsNode.d.mts", - "import": "./dist/shimsNode.mjs" + "import": { + "types": "./dist/esm/shimsNode.d.mts", + "default": "./dist/esm/shimsNode.mjs" + }, + "require": { + "types": "./dist/cjs/shimsNode.d.cts", + "default": "./dist/cjs/shimsNode.cjs" + } }, "default": { - "types": "./dist/shimsNode.d.mts", - "import": "./dist/shimsNode.mjs" + "import": { + "types": "./dist/esm/shimsNode.d.mts", + "default": "./dist/esm/shimsNode.mjs" + }, + "require": { + "types": "./dist/cjs/shimsNode.d.cts", + "default": "./dist/cjs/shimsNode.cjs" + } } } }, - "types": "./dist/index.d.mts", "typesVersions": { "*": { "validators/cf-worker": [ - "dist/validators/cfWorker.d.mts" + "dist/cjs/validators/cfWorker.d.cts" ], "zod-schemas": [ - "dist/zodSchemas.d.mts" + "dist/cjs/zodSchemas.d.cts" ], "stdio": [ - "dist/stdio.d.mts" + "dist/cjs/stdio.d.cts" ] } }, diff --git a/packages/server/test/server/barrelClean.test.ts b/packages/server/test/server/barrelClean.test.ts index e7f3e33c50..a6ae71b530 100644 --- a/packages/server/test/server/barrelClean.test.ts +++ b/packages/server/test/server/barrelClean.test.ts @@ -6,7 +6,7 @@ import { fileURLToPath } from 'node:url'; import { beforeAll, describe, expect, test } from 'vitest'; const pkgDir = join(dirname(fileURLToPath(import.meta.url)), '../..'); -const distDir = join(pkgDir, 'dist'); +const distDir = join(pkgDir, 'dist/esm'); const NODE_ONLY = /\b(child_process|cross-spawn|node:stream|node:child_process)\b/; function chunkImportsOf(entryPath: string): string[] { diff --git a/packages/server/tsdown.config.ts b/packages/server/tsdown.config.ts index 25a65f4e16..6f78c5e440 100644 --- a/packages/server/tsdown.config.ts +++ b/packages/server/tsdown.config.ts @@ -7,8 +7,16 @@ export default defineConfig({ entry: ['src/index.ts', 'src/stdio.ts', 'src/shimsNode.ts', 'src/shimsWorkerd.ts', 'src/validators/cfWorker.ts'], // 2. Output Configuration - format: ['esm'], outDir: 'dist', + format: { + esm: { + outDir: 'dist/esm' + }, + cjs: { + outDir: 'dist/cjs' + } + }, + clean: true, // Recommended: Cleans 'dist' before building sourcemap: true, From 4e8f80696c24435a5a2358b4c2914db204a3fa9d Mon Sep 17 00:00:00 2001 From: Edoardo Luppi Date: Fri, 8 May 2026 15:07:26 +0200 Subject: [PATCH 2/3] build: fix node10 resolution for client and server shims --- packages/client/package.json | 3 +++ packages/server/package.json | 3 +++ 2 files changed, 6 insertions(+) diff --git a/packages/client/package.json b/packages/client/package.json index cfd07f96b7..d2607c9d76 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -103,6 +103,9 @@ ], "stdio": [ "dist/cjs/stdio.d.cts" + ], + "_shims": [ + "dist/cjs/shimsNode.d.cts" ] } }, diff --git a/packages/server/package.json b/packages/server/package.json index 62fe065ae5..e2cba82528 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -106,6 +106,9 @@ ], "stdio": [ "dist/cjs/stdio.d.cts" + ], + "_shims": [ + "dist/cjs/shimsNode.d.cts" ] } }, From 4a86307fc00cec7e0456e7f8df6355d1f182cf1a Mon Sep 17 00:00:00 2001 From: Edoardo Luppi Date: Fri, 8 May 2026 18:50:24 +0200 Subject: [PATCH 3/3] build: parallelize tsc type resolution for @modelcontextprotocol/node This solves an OOM issue with rolldown and this project structure, which btw I cannot debug further. Will remain a mistery. --- packages/middleware/node/tsdown.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/middleware/node/tsdown.config.ts b/packages/middleware/node/tsdown.config.ts index 35ee11e2f1..303814b949 100644 --- a/packages/middleware/node/tsdown.config.ts +++ b/packages/middleware/node/tsdown.config.ts @@ -29,6 +29,7 @@ export default defineConfig({ // Bundles d.ts files into a single output dts: { resolver: 'tsc', + parallel: true, // override just for DTS generation: compilerOptions: { baseUrl: '.',