Skip to main content

Data Transformers

You are able to serialize the response data & input args. The transformers need to be added both to the server and the client.

Using superjson

SuperJSON allows us to able to transparently use e.g. standard Date/Map/Sets over the wire between the server and client. That means you can return any of these types in your API-resolver and use them in the client without recreating the objects from JSON.

How to

1. Install

yarn add superjson

3. Add to your backend

import superjson from 'superjson';
import * as trpc from '@trpc/server';

export const appRouter = trpc.router()
.transformer(superjson)
// .query(...)

3. Add to createTRPCCLient() or setupNext() config

import superjson from 'superjson';
import { transformerLink } from '@trpc/client/links/transformerLink';
import { httpBatchLink } from '@trpc/client/links/httpBatchLink';
// [...]

export const client = createTRPCClient<AppRouter>({
links: [
transformerLink(superjson), // <---
httpBatchLink({
url: `/api/trpc`,
}),
],
// [...]
});
import { httpBatchLink } from '@trpc/client/links/httpBatchLink';
import { transformerLink } from '@trpc/client/links/transformerLink';
import { setupTRPC } from '@trpc/next';
import superjson from 'superjson';
import type { AppRouter } from 'server/routers/_app';

// [...]

export default setupTRPC<AppRouter>({
transformer: superjson, // <-- Used for hydration when server-side rendering
config({ ctx }) {
links: [
transformerLink(superjson), // <-- Used for the actual requests
httpBatchLink({
url: `${getBaseUrl()}/api/trpc`,
}),
],
},
// [...]
})(MyApp);

Different transformers for upload and download

If a transformer should only be used for one directon or different transformers should be used for upload and download (e.g. for performance reasons), you can provide individual transformers for upload and download. Make sure you use the same combined transformer everywhere.

How to

Here superjson is be used for uploading and devalue for downloading data, because devalue is a lot faster but insecure to use on the server.

1. Install

yarn add superjson devalue

2. Add to utils/trpc.ts

import superjson from 'superjson';
import devalue from 'devalue';

// [...]

export const transformer = {
input: superjson,
output: {
serialize: (object) => devalue(object),
deserialize: (object) => eval(`(${object})`),
},
};

3. Add to createTRPCCLient()

import { transformer } from '../utils/trpc';

// [...]

export const client = createTRPCClient<AppRouter>({
// [...]
transformer: transformer,
});

4. Add to your AppRouter

import { transformer } from '../../utils/trpc';
import * as trpc from '@trpc/server';

export const appRouter = trpc.router()
.transformer(transformer)
// .query(...)

DataTransformer interface

type DataTransformer = {
serialize(object: any): any;
deserialize(object: any): any;
};

type CombinedDataTransformer = {
input: DataTransformer;
output: DataTransformer;
};