Two related fixes:
1. Phone (and any LAN client) couldn't reach the web container because
the dev compose mapped 127.0.0.1:WEB_PORT instead of binding all
interfaces. Drop the loopback prefix.
2. Turbopack and NodeNext disagree on extension handling: bot's tsc
needs `.js` extensions in source imports; Turbopack's transpilePackages
path can't resolve those `.js` requests back to `.ts` source. Switch
to consuming the workspace packages via their compiled dist instead:
- packages/db + packages/shared point `main`/`exports` at ./dist/*
- drop transpilePackages from next.config.ts; web picks up the
compiled `.js` files directly
- dev compose command for web builds shared+db before running
`next dev` so dist is fresh when Turbopack starts
- put the `.js` extensions back in packages/db source so NodeNext
compilers (bot's tsc, packages/db's own tsc) are happy
26 lines
863 B
TypeScript
26 lines
863 B
TypeScript
import type { NextConfig } from "next";
|
|
import { join } from "node:path";
|
|
|
|
// Pin Turbopack's workspace root explicitly — pnpm + Turbopack can't always
|
|
// infer it inside Docker bind mounts.
|
|
const workspaceRoot = join(import.meta.dirname, "..", "..");
|
|
|
|
// We consume @cmbot/db and @cmbot/shared via their compiled dist (their
|
|
// package.json `main` points at ./dist/index.js). The dist is built at
|
|
// container start (see docker-compose.dev.yml) and during the production
|
|
// Docker build (see docker/web.Dockerfile). This sidesteps Turbopack's
|
|
// inability to resolve NodeNext-style `.js` extensions to `.ts` source.
|
|
const nextConfig: NextConfig = {
|
|
reactStrictMode: true,
|
|
output: "standalone",
|
|
outputFileTracingRoot: workspaceRoot,
|
|
experimental: {
|
|
typedRoutes: true,
|
|
},
|
|
turbopack: {
|
|
root: workspaceRoot,
|
|
},
|
|
};
|
|
|
|
export default nextConfig;
|