Open
Description
Version 1.13.3: Works fine.
Version 2.0.0: Din't work.
I'm using TRPC in my application (Electron + Vite + Vue + Typescript), according to the TRPC documentation I need to install superjson
to transport data of types: Date/Map/Set
. However, after installing the "superjson": "^2.0.0"
lib, I am getting this error when running the application.
App threw an error during load
Error [ERR_REQUIRE_ESM]: require() of ES Module ~/node_modules/superjson/dist/index.js from ~/dist-electron/main/index.js not supported.
Instead change the require of ~/node_modules/superjson/dist/index.js in ~/dist-electron/main/index.js to a dynamic import() which is available in all CommonJS modules.
at f._load (node:electron/js2c/asar_bundle:2:13330)
at Object.<anonymous> (~/dist-electron/main/index.js:11:19)
at f._load (node:electron/js2c/asar_bundle:2:13330)
at loadApplicationPackage (~/node_modules/electron/dist/Electron.app/Contents/Resources/default_app.asar/main.js:121:16)
at Object.<anonymous> (~/node_modules/electron/dist/Electron.app/Contents/Resources/default_app.asar/main.js:233:9)
at f._load (node:electron/js2c/asar_bundle:2:13330)
at node:electron/js2c/browser_init:2:115657
at node:electron/js2c/browser_init:2:115860
at node:electron/js2c/browser_init:2:115864
at f._load (node:electron/js2c/asar_bundle:2:13330)
tsconfig.json:
{
"compilerOptions": {
"target": "ESNext",
"useDefineForClassFields": true,
"module": "ESNext",
"moduleResolution": "Node",
"strict": true,
"jsx": "preserve",
"resolveJsonModule": true,
"isolatedModules": true,
"esModuleInterop": true,
"lib": ["ESNext", "DOM"],
"skipLibCheck": true,
"noEmit": true,
"types": ["vitest/globals"],
"noUnusedLocals": true,
"noUnusedParameters": true,
"paths": {
"@/*": ["./src/*"],
"@electron/*": ["./electron/*"]
}
},
"include": [
"src",
"src/**/*.vue"
],
"references": [
{ "path": "./tsconfig.node.json" }
]
}
Uso:
// trpc.ts
import { initTRPC } from '@trpc/server';
import SuperJSON from 'superjson';
const t = initTRPC.create({
transformer: SuperJSON
});
export { prisma } from '../prisma';
export const router = t.router;
export const publicProcedure = t.procedure;
// client.ts
import { ipcRenderer } from 'electron';
import { RequestInitEsque } from '@trpc/client/dist/internals/types';
import { createTRPCProxyClient, httpBatchLink } from '@trpc/client';
import type { AppRouter } from '@electron/api/routes/routes';
import SuperJSON from 'superjson';
type TRPCClient = ReturnType<typeof createTRPCProxyClient<AppRouter>>;
const fetch = async (url: RequestInfo | URL, init: RequestInit | RequestInitEsque | undefined) => {
const response = await ipcRenderer.invoke('trpc', {
url,
method: init?.method,
headers: init?.headers,
body: init?.body
});
return new Response(response.body, {
status: response.status,
headers: response.headers,
});
}
const useTRPC = () => {
return createTRPCProxyClient<AppRouter>({
transformer: SuperJSON,
links: [
httpBatchLink({
url: '/trpc',
fetch
}),
],
});
}
export { fetch, useTRPC }
export type { TRPCClient }
Metadata
Assignees
Labels
No labels