Bug
apiPost in dist/client.js correctly wraps mutation payloads as { json: data } before sending, matching tRPC's superjson transformer convention:
export async function apiPost(endpoint, data) {
const client = createClient();
const response = await client.post(`/trpc/${endpoint}`, data ? { json: data } : undefined);
...
}
apiGet does not — it sends the raw params object as the query string, unwrapped:
export async function apiGet(endpoint, params) {
const client = createClient();
const query = params
? `?input=${encodeURIComponent(JSON.stringify(params))}`
: "";
...
}
Against a Dokploy server using the superjson transformer, any query procedure that requires input parameters fails with a 400:
{
"error": {
"json": {
"message": "[\n {\n \"expected\": \"object\",\n \"code\": \"invalid_type\",\n \"path\": [],\n \"message\": \"Invalid input: expected object, received undefined\"\n }\n]",
"code": -32600,
"data": { "code": "BAD_REQUEST", "httpStatus": 400, "path": "application.one", ... }
}
}
}
Repro
dokploy application one --applicationId <id>
# Request failed with status code 400
No-argument queries (e.g. project all) work fine, since an empty/undefined input happens to satisfy those procedures' schemas either way — which is why this doesn't show up immediately.
Expected
apiGet should wrap params the same way apiPost wraps data:
const query = params
? `?input=${encodeURIComponent(JSON.stringify({ json: params }))}`
: "";
Environment
@dokploy/cli 0.29.4 (reports dokploy --version → 0.3.0)
- Dokploy server v0.29.11
- Affects any query command that takes parameters:
application one, deployment all, mounts list-by-service-id, log reads, etc.
Bug
apiPostindist/client.jscorrectly wraps mutation payloads as{ json: data }before sending, matching tRPC's superjson transformer convention:apiGetdoes not — it sends the raw params object as the query string, unwrapped:Against a Dokploy server using the superjson transformer, any query procedure that requires input parameters fails with a 400:
{ "error": { "json": { "message": "[\n {\n \"expected\": \"object\",\n \"code\": \"invalid_type\",\n \"path\": [],\n \"message\": \"Invalid input: expected object, received undefined\"\n }\n]", "code": -32600, "data": { "code": "BAD_REQUEST", "httpStatus": 400, "path": "application.one", ... } } } }Repro
No-argument queries (e.g.
project all) work fine, since an empty/undefined input happens to satisfy those procedures' schemas either way — which is why this doesn't show up immediately.Expected
apiGetshould wrapparamsthe same wayapiPostwrapsdata:Environment
@dokploy/cli0.29.4 (reportsdokploy --version→ 0.3.0)application one,deployment all,mounts list-by-service-id, log reads, etc.