fix(build): make oRPC/tRPC dist runnable under node ESM (deploy crashloop)

flake.nix only rewrote @/ aliases but left extensionless relative imports
(./router) in compiled dist/. node dist/index.js (how prod runs) cannot
resolve extensionless ESM specifiers -> ERR_MODULE_NOT_FOUND -> backend
crashlooped (444 restarts, port 4001 dead). Extract the fixer into a shared
scripts/fix-imports.mjs that appends .js to extensionless relative imports and
rewrites @/ aliases, and wire it into backend + discord-gateway build phases.

Verified: fresh tsc + fixer -> node dist/index.js boots; oRPC over /trpc
serves both HTTP POST and WebSocket (config/dashboard/voice/moderation/
media/chatbot/analysis) end-to-end against Postgres + Redis. next build
passes with the oRPC client + partysocket.
This commit is contained in:
asepharyana
2026-08-16 14:45:02 +07:00
parent 2fa1827f17
commit 726a8e116b
27 changed files with 646 additions and 417 deletions
+6 -6
View File
@@ -1,12 +1,12 @@
import { trpc } from "@/lib/trpc/client";
import { orpc } from "@/lib/orpc/client";
import type { MediaState } from "@/lib/types";
export const mediaApi = {
getStatus: () => trpc.media.status.query() as unknown as Promise<MediaState>,
getStatus: () => orpc.media.status() as unknown as Promise<MediaState>,
queue: (source: string, mode: string) =>
trpc.media.queue.mutate({ source, mode }) as unknown as Promise<MediaState>,
skip: () => trpc.media.skip.mutate() as unknown as Promise<MediaState>,
stop: () => trpc.media.stop.mutate() as unknown as Promise<MediaState>,
orpc.media.queue({ source, mode }) as unknown as Promise<MediaState>,
skip: () => orpc.media.skip() as unknown as Promise<MediaState>,
stop: () => orpc.media.stop() as unknown as Promise<MediaState>,
loop: (loop: boolean) =>
trpc.media.loop.mutate({ loop }) as unknown as Promise<MediaState>,
orpc.media.loop({ loop }) as unknown as Promise<MediaState>,
};