diff --git a/examples/.wip/next-chat/package.json b/examples/.wip/next-chat/package.json index c696139c1fa..a9833e063ca 100644 --- a/examples/.wip/next-chat/package.json +++ b/examples/.wip/next-chat/package.json @@ -1,6 +1,6 @@ { "name": "@examples/chat", - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "private": true, "scripts": { "dx:next": "prisma generate && next dev", @@ -18,10 +18,10 @@ }, "dependencies": { "@prisma/client": "^2.18.0", - "@trpc/client": "^9.0.0-alpha.1", - "@trpc/next": "^9.0.0-alpha.1", - "@trpc/react": "^9.0.0-alpha.1", - "@trpc/server": "^9.0.0-alpha.1", + "@trpc/client": "^9.0.0-alpha.2", + "@trpc/next": "^9.0.0-alpha.2", + "@trpc/react": "^9.0.0-alpha.2", + "@trpc/server": "^9.0.0-alpha.2", "jest": "^27.0.5", "jest-playwright": "^0.0.1", "jest-playwright-preset": "^1.4.5", diff --git a/examples/express-server/package.json b/examples/express-server/package.json index 57b50f0cb4f..c5f1232db1e 100644 --- a/examples/express-server/package.json +++ b/examples/express-server/package.json @@ -1,6 +1,6 @@ { "name": "@examples/express-server", - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "private": true, "scripts": { "dev:server": "nodemon -e ts -w . -x ts-node ./src/server.ts", @@ -12,9 +12,9 @@ "test-start": "start-server-and-test 'node dist/server' 2021 'node dist/client'" }, "dependencies": { - "@trpc/client": "^9.0.0-alpha.1", - "@trpc/react": "^9.0.0-alpha.1", - "@trpc/server": "^9.0.0-alpha.1", + "@trpc/client": "^9.0.0-alpha.2", + "@trpc/react": "^9.0.0-alpha.2", + "@trpc/server": "^9.0.0-alpha.2", "@types/node-fetch": "^2.5.11", "abort-controller": "^3.0.0", "express": "^4.17.1", diff --git a/examples/next-prisma-starter-websockets/package.json b/examples/next-prisma-starter-websockets/package.json index 5da9e1f0681..68078b72957 100644 --- a/examples/next-prisma-starter-websockets/package.json +++ b/examples/next-prisma-starter-websockets/package.json @@ -1,6 +1,6 @@ { "name": "@examples/next-starter-websockets", - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "private": true, "scripts": { "build:1-generate": "prisma generate", @@ -31,10 +31,10 @@ }, "dependencies": { "@prisma/client": "^2.18.0", - "@trpc/client": "^9.0.0-alpha.1", - "@trpc/next": "^9.0.0-alpha.1", - "@trpc/react": "^9.0.0-alpha.1", - "@trpc/server": "^9.0.0-alpha.1", + "@trpc/client": "^9.0.0-alpha.2", + "@trpc/next": "^9.0.0-alpha.2", + "@trpc/react": "^9.0.0-alpha.2", + "@trpc/server": "^9.0.0-alpha.2", "clsx": "^1.1.1", "next": "^11.1.0", "next-auth": "^3.27.3", diff --git a/examples/next-prisma-starter/package.json b/examples/next-prisma-starter/package.json index 2780b0c79d9..79d121e6789 100644 --- a/examples/next-prisma-starter/package.json +++ b/examples/next-prisma-starter/package.json @@ -1,6 +1,6 @@ { "name": "@examples/next-starter", - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "private": true, "scripts": { "build:1-generate": "prisma generate", @@ -30,10 +30,10 @@ }, "dependencies": { "@prisma/client": "^2.18.0", - "@trpc/client": "^9.0.0-alpha.1", - "@trpc/next": "^9.0.0-alpha.1", - "@trpc/react": "^9.0.0-alpha.1", - "@trpc/server": "^9.0.0-alpha.1", + "@trpc/client": "^9.0.0-alpha.2", + "@trpc/next": "^9.0.0-alpha.2", + "@trpc/react": "^9.0.0-alpha.2", + "@trpc/server": "^9.0.0-alpha.2", "clsx": "^1.1.1", "next": "^11.1.0", "react": "^17.0.1", diff --git a/examples/next-prisma-todomvc/next-env.d.ts b/examples/next-prisma-todomvc/next-env.d.ts index c6643fda12f..9bc3dd46b9d 100644 --- a/examples/next-prisma-todomvc/next-env.d.ts +++ b/examples/next-prisma-todomvc/next-env.d.ts @@ -1,3 +1,6 @@ /// /// /// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/examples/next-prisma-todomvc/package.json b/examples/next-prisma-todomvc/package.json index 79f7431980c..a0e8683e475 100644 --- a/examples/next-prisma-todomvc/package.json +++ b/examples/next-prisma-todomvc/package.json @@ -1,6 +1,6 @@ { "name": "@examples/todo-web", - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "private": true, "scripts": { "migrate-sqlite": "npx prisma migrate dev --name init --schema=./prisma/_sqlite/schema.prisma", @@ -24,10 +24,10 @@ }, "dependencies": { "@prisma/client": "^2.18.0", - "@trpc/client": "^9.0.0-alpha.1", - "@trpc/next": "^9.0.0-alpha.1", - "@trpc/react": "^9.0.0-alpha.1", - "@trpc/server": "^9.0.0-alpha.1", + "@trpc/client": "^9.0.0-alpha.2", + "@trpc/next": "^9.0.0-alpha.2", + "@trpc/react": "^9.0.0-alpha.2", + "@trpc/server": "^9.0.0-alpha.2", "clsx": "^1.1.1", "jest": "^27.0.5", "jest-playwright": "^0.0.1", diff --git a/examples/standalone-server/package.json b/examples/standalone-server/package.json index 104a9be36d4..14e0f9c7a53 100644 --- a/examples/standalone-server/package.json +++ b/examples/standalone-server/package.json @@ -1,6 +1,6 @@ { "name": "@examples/standalone-server", - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "private": true, "scripts": { "dev:server": "nodemon -e ts -w . -x ts-node ./src/server.ts", @@ -12,9 +12,9 @@ "test-start": "start-server-and-test 'node dist/server' 2022 'node dist/client'" }, "dependencies": { - "@trpc/client": "^9.0.0-alpha.1", - "@trpc/react": "^9.0.0-alpha.1", - "@trpc/server": "^9.0.0-alpha.1", + "@trpc/client": "^9.0.0-alpha.2", + "@trpc/react": "^9.0.0-alpha.2", + "@trpc/server": "^9.0.0-alpha.2", "@types/node-fetch": "^2.5.11", "abort-controller": "^3.0.0", "node-fetch": "^2.6.1", diff --git a/lerna.json b/lerna.json index 4fe83d7d4f3..01ebf2cde77 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "registry": "https://registry.npmjs.org/", "publishConfig": { "access": "public" diff --git a/packages/client/package.json b/packages/client/package.json index 72f9b7b14a1..bacf15ce64d 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@trpc/client", - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "description": "tRPC Client lib", "author": "KATT", "license": "MIT", @@ -31,7 +31,7 @@ ], "dependencies": { "@babel/runtime": "^7.9.0", - "@trpc/server": "^9.0.0-alpha.1" + "@trpc/server": "^9.0.0-alpha.2" }, "publishConfig": { "access": "public" diff --git a/packages/client/src/internals/httpRequest.ts b/packages/client/src/internals/httpRequest.ts index c457012cf83..6053222da64 100644 --- a/packages/client/src/internals/httpRequest.ts +++ b/packages/client/src/internals/httpRequest.ts @@ -27,7 +27,13 @@ export function httpRequest( mutation: 'POST', subscription: 'PATCH', }; - const input = 'input' in props ? props.input : arrayToDict(props.inputs); + const input = + 'input' in props + ? rt.transformer.serialize(props.input) + : arrayToDict( + props.inputs.map((_input) => rt.transformer.serialize(_input)), + ); + function getUrl() { let url = props.url + '/' + path; const queryParts: string[] = []; @@ -35,11 +41,7 @@ export function httpRequest( queryParts.push('batch=1'); } if (type === 'query' && input !== undefined) { - queryParts.push( - `input=${encodeURIComponent( - JSON.stringify(rt.transformer.serialize(input)), - )}`, - ); + queryParts.push(`input=${encodeURIComponent(JSON.stringify(input))}`); } if (queryParts.length) { url += '?' + queryParts.join('&'); @@ -50,8 +52,7 @@ export function httpRequest( if (type === 'query') { return undefined; } - const rawInput = rt.transformer.serialize(input); - return rawInput !== undefined ? JSON.stringify(rawInput) : undefined; + return input !== undefined ? JSON.stringify(input) : undefined; } const promise = new Promise((resolve, reject) => { diff --git a/packages/next/package.json b/packages/next/package.json index 218c15f2405..8c0381095b5 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@trpc/next", - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "description": "tRPC Next lib", "author": "KATT", "license": "MIT", @@ -36,9 +36,9 @@ }, "dependencies": { "@babel/runtime": "^7.9.0", - "@trpc/client": "^9.0.0-alpha.1", - "@trpc/react": "^9.0.0-alpha.1", - "@trpc/server": "^9.0.0-alpha.1", + "@trpc/client": "^9.0.0-alpha.2", + "@trpc/react": "^9.0.0-alpha.2", + "@trpc/server": "^9.0.0-alpha.2", "react-ssr-prepass": "^1.4.0" }, "devDependencies": { diff --git a/packages/react/package.json b/packages/react/package.json index ce95f823240..9cf33a2c036 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@trpc/react", - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "description": "tRPC React lib", "author": "KATT", "license": "MIT", @@ -37,8 +37,8 @@ }, "dependencies": { "@babel/runtime": "^7.9.0", - "@trpc/client": "^9.0.0-alpha.1", - "@trpc/server": "^9.0.0-alpha.1" + "@trpc/client": "^9.0.0-alpha.2", + "@trpc/server": "^9.0.0-alpha.2" }, "devDependencies": { "@types/express": "^4.17.12", diff --git a/packages/server/package.json b/packages/server/package.json index 91ee1ea2d5a..fa41d6b4465 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@trpc/server", - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "description": "tRPC Server", "author": "KATT", "license": "MIT", diff --git a/packages/server/src/http/errors.ts b/packages/server/src/http/errors.ts deleted file mode 100644 index 4581c6dd259..00000000000 --- a/packages/server/src/http/errors.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { TRPCError } from '../TRPCError'; - -/* istanbul ignore next */ -/** - * @deprecated - */ -export const httpError = { - /** - * @deprecated use `new TRPCError({ code: 'FORBIDDEN', message: '... })` - */ - forbidden: (message?: string) => - new TRPCError({ message, code: 'FORBIDDEN' }), - /** - * @deprecated use `new TRPCError({ code: 'UNAUTHORIZED', message: '... })` - */ - unauthorized: (message?: string) => - new TRPCError({ message, code: 'UNAUTHORIZED' }), - /** - * @deprecated use `new TRPCError({ code: 'BAD_REQUEST', message: '... })` - */ - badRequest: (message?: string) => - new TRPCError({ message, code: 'BAD_REQUEST' }), - /** - * @deprecated use `new TRPCError({ code: 'METHOD_NOT_FOUND', message: '... })` - */ - notFound: (message?: string) => - new TRPCError({ message, code: 'PATH_NOT_FOUND' }), -}; diff --git a/packages/server/src/http/index.ts b/packages/server/src/http/index.ts index 8d0e6e16bd0..e424f9cad79 100644 --- a/packages/server/src/http/index.ts +++ b/packages/server/src/http/index.ts @@ -1,6 +1,5 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { assertNotBrowser } from '../assertNotBrowser'; -export * from './errors'; export * from './requestHandler'; assertNotBrowser(); diff --git a/packages/server/src/http/internals/getHTTPStatusCode.ts b/packages/server/src/http/internals/getHTTPStatusCode.ts index a696f9f33f1..9219aca8d09 100644 --- a/packages/server/src/http/internals/getHTTPStatusCode.ts +++ b/packages/server/src/http/internals/getHTTPStatusCode.ts @@ -12,8 +12,7 @@ const JSONRPC2_TO_HTTP_CODE: Record< > = { PARSE_ERROR: 400, BAD_REQUEST: 400, - METHOD_NOT_FOUND: 405, - PATH_NOT_FOUND: 404, + NOT_FOUND: 404, INTERNAL_SERVER_ERROR: 500, UNAUTHORIZED: 401, FORBIDDEN: 403, diff --git a/packages/server/src/http/requestHandler.ts b/packages/server/src/http/requestHandler.ts index 712cc4cf9f8..ee2754cae34 100644 --- a/packages/server/src/http/requestHandler.ts +++ b/packages/server/src/http/requestHandler.ts @@ -55,18 +55,6 @@ async function getRequestParams({ } const body = await getPostBody({ req, maxBodySize }); - /** - * @deprecated TODO delete me for next major - * */ - if ( - body && - typeof body === 'object' && - 'input' in body && - Object.keys(body).length === 1 - ) { - // legacy format - return { input: body.input }; - } return { input: body }; } @@ -95,7 +83,6 @@ export async function requestHandler< } const type = HTTP_METHOD_PROCEDURE_TYPE_MAP[req.method!] ?? ('unknown' as const); - let input: unknown = undefined; let ctx: inferRouterContext | undefined = undefined; const reqQueryParams = req.query @@ -124,35 +111,40 @@ export async function requestHandler< type, }); - input = - rawInput !== undefined - ? router._def.transformer.input.deserialize(rawInput) - : undefined; ctx = await createContext?.({ req, res }); - const getInputs = (): unknown[] | Record => { + const getInputs = (): Record => { if (!isBatchCall) { - return [input]; + return { + 0: router._def.transformer.input.deserialize(rawInput), + }; } - // TODO - next major, delete `Array.isArray()` if ( - !Array.isArray(input) && - (typeof input !== 'object' || input == null) + rawInput == null || + typeof rawInput !== 'object' || + Array.isArray(rawInput) ) { throw new TRPCError({ code: 'BAD_REQUEST', - message: - '"input" needs to be an array or object when doing a batch call', + message: '"input" needs to be an object when doing a batch call', }); } - return input as any; + const input: Record = {}; + for (const key in rawInput) { + const k = key as any as number; + input[k] = router._def.transformer.input.deserialize( + (rawInput as any)[k], + ); + } + return input; }; const inputs = getInputs(); const paths = isBatchCall ? opts.path.split(',') : [opts.path]; const results = await Promise.all( paths.map(async (path, index) => { const id = null; + const input = inputs[index]; try { const output = await callProcedure({ ctx, @@ -187,16 +179,34 @@ export async function requestHandler< const result = isBatchCall ? results : results[0]; endResponse(result); } catch (_err) { + // we get here if + // - batching is called when it's not enabled + // - `createContext()` throws + // - post body is too large + // - input deserialization fails const error = getErrorFromUnknown(_err); const json: TRPCErrorResponse = { - id: -1, + id: null, error: router._def.transformer.output.serialize( - router.getErrorShape({ error, type, path: undefined, input, ctx }), + router.getErrorShape({ + error, + type, + path: undefined, + input: undefined, + ctx, + }), ), }; endResponse(json); - onError?.({ error, path: undefined, input, ctx, type: type, req }); + onError?.({ + error, + path: undefined, + input: undefined, + ctx, + type: type, + req, + }); } await teardown?.(); } diff --git a/packages/server/src/router.ts b/packages/server/src/router.ts index efd1340e8cf..70735b509ba 100644 --- a/packages/server/src/router.ts +++ b/packages/server/src/router.ts @@ -442,7 +442,7 @@ export class Router< if (!procedure) { throw new TRPCError({ - code: 'PATH_NOT_FOUND', + code: 'NOT_FOUND', message: `No "${type}"-procedure on path "${path}"`, }); } diff --git a/packages/server/src/rpc/codes.ts b/packages/server/src/rpc/codes.ts index 7571dd8b74f..0a89a1ec9f6 100644 --- a/packages/server/src/rpc/codes.ts +++ b/packages/server/src/rpc/codes.ts @@ -17,11 +17,7 @@ export const TRPC_ERROR_CODES_BY_KEY = { /** * The JSON sent is not a valid Request object. */ - BAD_REQUEST: -32600, - /** - * The method does not exist / is not available. - */ - METHOD_NOT_FOUND: -32601, + BAD_REQUEST: -32600, // 400 /** * Internal JSON-RPC error. */ @@ -29,7 +25,7 @@ export const TRPC_ERROR_CODES_BY_KEY = { // Implementation specific errors UNAUTHORIZED: -32001, // 401 FORBIDDEN: -32003, // 403 - PATH_NOT_FOUND: -32004, // 404 + NOT_FOUND: -32004, // 404 METHOD_NOT_SUPPORTED: -32005, // 405 TIMEOUT: -32008, // 408 PAYLOAD_TOO_LARGE: -32013, // 413 diff --git a/packages/server/test/errors.test.ts b/packages/server/test/errors.test.ts index dc63b96b170..d702a3ef045 100644 --- a/packages/server/test/errors.test.ts +++ b/packages/server/test/errors.test.ts @@ -111,7 +111,7 @@ test('input error', async () => { close(); }); -test('httpError.unauthorized()', async () => { +test('unauthorized()', async () => { const onError = jest.fn(); const { client, close } = routerToServerAndClient( trpc.router().query('err', { @@ -249,7 +249,7 @@ test('make sure object is ignoring prototype', async () => { expect(clientError.shape.code).toMatchInlineSnapshot(`-32004`); expect(onError).toHaveBeenCalledTimes(1); const serverError = onError.mock.calls[0][0].error; - expect(serverError.code).toMatchInlineSnapshot(`"PATH_NOT_FOUND"`); + expect(serverError.code).toMatchInlineSnapshot(`"NOT_FOUND"`); close(); }); diff --git a/packages/server/test/index.test.tsx b/packages/server/test/index.test.tsx index c579107bf30..cbb2c631e80 100644 --- a/packages/server/test/index.test.tsx +++ b/packages/server/test/index.test.tsx @@ -7,7 +7,7 @@ import { createWSClient, wsLink } from '../../client/src/links/wsLink'; import { z } from 'zod'; import { TRPCClientError } from '../../client/src'; import * as trpc from '../src'; -import { CreateHttpContextOptions, Maybe } from '../src'; +import { CreateHttpContextOptions, Maybe, TRPCError } from '../src'; import { routerToServerAndClient } from './_testHelpers'; import WebSocket from 'ws'; import { waitFor } from '@testing-library/react'; @@ -270,7 +270,7 @@ describe('integration tests', () => { trpc.router().query('whoami', { async resolve({ ctx }) { if (!ctx.user) { - throw trpc.httpError.unauthorized(); + throw new TRPCError({ code: 'UNAUTHORIZED' }); } return ctx.user; }, diff --git a/packages/server/test/middleware.test.ts b/packages/server/test/middleware.test.ts index b3dbda4629a..9dbb1141e21 100644 --- a/packages/server/test/middleware.test.ts +++ b/packages/server/test/middleware.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { AsyncLocalStorage } from 'async_hooks'; import * as trpc from '../src'; -import { httpError } from '../src'; +import { TRPCError } from '../src'; import { MiddlewareResult } from '../src/internals/middlewares'; import { routerToServerAndClient, waitMs } from './_testHelpers'; @@ -81,7 +81,7 @@ test('allows you to throw an error (e.g. auth)', async () => { .router() .middleware(({ ctx, next }) => { if (!ctx.user?.isAdmin) { - throw httpError.unauthorized(); + throw new TRPCError({ code: 'UNAUTHORIZED' }); } return next(); }) @@ -266,7 +266,7 @@ test('equiv', () => { .router() .middleware(({ ctx, next }) => { if (!ctx.user?.isAdmin) { - throw httpError.unauthorized(); + throw new TRPCError({ code: 'UNAUTHORIZED' }); } return next(); }) @@ -289,7 +289,7 @@ test('equiv', () => { .router() .middleware(({ ctx, next }) => { if (!ctx.user?.isAdmin) { - throw httpError.unauthorized(); + throw new TRPCError({ code: 'UNAUTHORIZED' }); } return next(); }) diff --git a/packages/server/test/rawFetch.test.tsx b/packages/server/test/rawFetch.test.tsx index c53c5a334e0..93f1f20eb1c 100644 --- a/packages/server/test/rawFetch.test.tsx +++ b/packages/server/test/rawFetch.test.tsx @@ -30,78 +30,9 @@ const factory = () => }), ); -/** - * @deprecated TODO delete in next major - **/ -test('call mutation with `input`-prop', async () => { - const { close, httpUrl } = factory(); - - const res = await fetch(`${httpUrl}/myMutation`, { - method: 'POST', - body: JSON.stringify({ - input: { - name: 'alexdotjs', - }, - }), - }); - const json = await res.json(); - - expect(json).toHaveProperty('result'); - expect(json.result).toMatchInlineSnapshot(` -Object { - "data": Object { - "input": Object { - "name": "alexdotjs", - }, - }, - "type": "data", -} -`); - - close(); -}); - test('batching with raw batch', async () => { const { close, httpUrl } = factory(); - { - /** - * @deprecated TODO delete in next major - **/ - const res = await fetch( - `${httpUrl}/myQuery?batch=1&input=${JSON.stringify([])}`, - ); - const json = await res.json(); - - expect(json[0]).toHaveProperty('result'); - expect(json[0].result).toMatchInlineSnapshot(` -Object { - "data": "default", - "type": "data", -} -`); - } - - { - /** - * @deprecated TODO - remove in next major - **/ - const res = await fetch( - `${httpUrl}/myQuery?batch=1&input=${JSON.stringify([ - { name: 'alexdotjs' }, - ])}`, - ); - const json = await res.json(); - - expect(json[0]).toHaveProperty('result'); - expect(json[0].result).toMatchInlineSnapshot(` -Object { - "data": "alexdotjs", - "type": "data", -} -`); - } - { const res = await fetch( `${httpUrl}/myQuery?batch=1&input=${JSON.stringify({ diff --git a/packages/server/test/react.test.tsx b/packages/server/test/react.test.tsx index 3393892ac6b..719fb27fe9a 100644 --- a/packages/server/test/react.test.tsx +++ b/packages/server/test/react.test.tsx @@ -40,6 +40,7 @@ import { TRPCWebSocketClient, } from '../../client/src/links/wsLink'; import { splitLink } from '../../client/src/links/splitLink'; +import { TRPCError } from '../src/TRPCError'; setLogger({ log() {}, @@ -92,7 +93,7 @@ function createAppRouter() { postById(input); const post = db.posts.find((p) => p.id === input); if (!post) { - throw trpcServer.httpError.notFound(); + throw new TRPCError({ code: 'NOT_FOUND' }); } return post; }, diff --git a/packages/server/test/websockets.test.ts b/packages/server/test/websockets.test.ts index 5157f16205b..a3ecf38684a 100644 --- a/packages/server/test/websockets.test.ts +++ b/packages/server/test/websockets.test.ts @@ -443,7 +443,7 @@ test('not found error', async () => { ); expect(error.name).toBe('TRPCClientError'); - expect(error.shape?.data.code).toMatchInlineSnapshot(`"PATH_NOT_FOUND"`); + expect(error.shape?.data.code).toMatchInlineSnapshot(`"NOT_FOUND"`); close(); }); diff --git a/www/docs/server/authorization.md b/www/docs/server/authorization.md index 9d7d6633ace..664e67f18ea 100644 --- a/www/docs/server/authorization.md +++ b/www/docs/server/authorization.md @@ -74,6 +74,7 @@ export const appRouter = createRouter() ```ts import * as trpc from '@trpc/server'; +import { TRPCError } from '@trpc/server'; import { createRouter } from './[trpc]'; export const appRouter = createRouter() @@ -90,7 +91,7 @@ export const appRouter = createRouter() // this protectes all procedures defined after in this router .middleware(async ({ ctx, next }) => { if (!ctx.user?.isAdmin) { - throw httpError.unauthorized(); + throw new TRPCError({ code: 'UNAUTHORIZED' }); } return next() }) diff --git a/www/docs/server/error-handling.md b/www/docs/server/error-handling.md index a3a79cdba6a..af8b572c805 100644 --- a/www/docs/server/error-handling.md +++ b/www/docs/server/error-handling.md @@ -60,6 +60,6 @@ throw new TRPCError({ code: 'INTERNAL_SERVER_ERROR', message: 'Optional Message' // "FORBIDDEN" // "BAD_REQUEST" // "INTERNAL_SERVER_ERROR" -// "PATH_NOT_FOUND" +// "NOT_FOUND" // "TIMEOUT" ```