collab/mcp: bundle workspace deps so runtime doesn't import .ts files

@tasks/database (and @tasks/shared) export raw .ts files via "main" /
"exports", which works fine for tsx/dev but blows up at runtime in the
production image:

  ERR_UNKNOWN_FILE_EXTENSION: Unknown file extension ".ts" for
  /app/packages/database/src/client.ts

tsup was leaving those workspace imports as externals in the output, so
the deployed dist/index.mjs still tried to resolve them at startup.
Switch each app to a tsup.config.ts that sets noExternal: [/^@tasks\\//],
which inlines workspace packages into the bundle while keeping
node_modules deps (postgres, drizzle-orm, hocuspocus, mcp-sdk, etc.)
external.

Verified locally: collab-server bundle size goes from 7 KB to 304 KB,
confirming @tasks/database is now compiled in. Also fixed the collab
start script to point at index.mjs (tsup ESM output) instead of .js.

Made-with: Cursor
This commit is contained in:
Randall Stillwell 2026-04-27 16:47:17 -05:00
parent 403437dafc
commit 829cbdc899
4 changed files with 33 additions and 3 deletions

View file

@ -4,8 +4,8 @@
"private": true,
"scripts": {
"dev": "tsx watch src/index.ts",
"build": "tsup src/index.ts --format esm --dts",
"start": "node dist/index.js",
"build": "tsup",
"start": "node dist/index.mjs",
"type-check": "tsc --noEmit"
},
"dependencies": {

View file

@ -0,0 +1,15 @@
import { defineConfig } from "tsup";
export default defineConfig({
entry: ["src/index.ts"],
format: ["esm"],
dts: true,
// Bundle workspace packages into the output so the runtime image doesn't try
// to resolve `@tasks/database` (which exports raw .ts files) at import time —
// Node 20 cannot load .ts. Third-party deps stay external and are installed
// via the regular node_modules layer in the runtime image.
noExternal: [/^@tasks\//],
target: "node20",
platform: "node",
clean: true,
});

View file

@ -5,7 +5,7 @@
"type": "module",
"scripts": {
"dev": "tsx watch src/index.ts",
"build": "tsup src/index.ts --format esm --dts",
"build": "tsup",
"start": "node dist/index.js",
"type-check": "tsc --noEmit"
},

View file

@ -0,0 +1,15 @@
import { defineConfig } from "tsup";
export default defineConfig({
entry: ["src/index.ts"],
format: ["esm"],
dts: true,
// Bundle workspace packages into the output so the runtime image doesn't try
// to resolve `@tasks/database` / `@tasks/shared` (which export raw .ts files)
// at import time — Node 20 cannot load .ts. Third-party deps stay external
// and are installed via the regular node_modules layer in the runtime image.
noExternal: [/^@tasks\//],
target: "node20",
platform: "node",
clean: true,
});