@trpc/server 10.0.0-proxy-beta.13 → 10.0.0-proxy-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/{TRPCError-281ac25a.mjs → TRPCError-e99e7cbe.mjs} +1 -1
  2. package/dist/adapters/aws-lambda/index.js +2 -3
  3. package/dist/adapters/aws-lambda/index.mjs +3 -4
  4. package/dist/adapters/express.js +3 -3
  5. package/dist/adapters/express.mjs +4 -4
  6. package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -1
  7. package/dist/adapters/fastify/index.js +2 -3
  8. package/dist/adapters/fastify/index.mjs +3 -4
  9. package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -1
  10. package/dist/adapters/fetch/index.js +2 -3
  11. package/dist/adapters/fetch/index.mjs +3 -4
  12. package/dist/adapters/next.js +3 -3
  13. package/dist/adapters/next.mjs +4 -4
  14. package/dist/adapters/node-http/index.js +3 -3
  15. package/dist/adapters/node-http/index.mjs +4 -4
  16. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
  17. package/dist/adapters/standalone.js +3 -3
  18. package/dist/adapters/standalone.mjs +4 -4
  19. package/dist/adapters/ws.d.ts.map +1 -1
  20. package/dist/adapters/ws.js +10 -3
  21. package/dist/adapters/ws.mjs +11 -4
  22. package/dist/core/initTRPC.d.ts +16 -4
  23. package/dist/core/initTRPC.d.ts.map +1 -1
  24. package/dist/core/internals/config.d.ts +13 -0
  25. package/dist/core/internals/config.d.ts.map +1 -1
  26. package/dist/core/middleware.d.ts +1 -1
  27. package/dist/core/middleware.d.ts.map +1 -1
  28. package/dist/deprecated/internals/procedure.d.ts.map +1 -1
  29. package/dist/deprecated/router.d.ts.map +1 -1
  30. package/dist/http/index.d.ts.map +1 -1
  31. package/dist/index.d.ts +0 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +739 -25
  34. package/dist/index.mjs +724 -9
  35. package/dist/{nodeHTTPRequestHandler-1bf460cc.mjs → nodeHTTPRequestHandler-205f7545.mjs} +2 -3
  36. package/dist/{nodeHTTPRequestHandler-71717219.js → nodeHTTPRequestHandler-efc38711.js} +1 -2
  37. package/dist/resolveHTTPResponse-4ceb1785.mjs +205 -0
  38. package/dist/resolveHTTPResponse-bf4c6ceb.js +207 -0
  39. package/dist/subscription.mjs +1 -1
  40. package/dist/{resolveHTTPResponse-c6e31b55.js → transformTRPCResponse-05aa84c1.js} +22 -201
  41. package/dist/{resolveHTTPResponse-f2b378b6.mjs → transformTRPCResponse-959de787.mjs} +21 -201
  42. package/dist/types.d.ts +9 -2
  43. package/dist/types.d.ts.map +1 -1
  44. package/package.json +6 -6
  45. package/src/adapters/fastify/fastifyRequestHandler.ts +0 -3
  46. package/src/adapters/fetch/fetchRequestHandler.ts +0 -3
  47. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +0 -3
  48. package/src/adapters/ws.ts +13 -3
  49. package/src/core/initTRPC.ts +12 -0
  50. package/src/core/internals/config.ts +19 -0
  51. package/src/core/middleware.ts +1 -1
  52. package/src/deprecated/internals/procedure.ts +0 -3
  53. package/src/deprecated/router.ts +0 -3
  54. package/src/http/index.ts +0 -4
  55. package/src/index.ts +0 -1
  56. package/src/types.ts +28 -7
  57. package/dist/assertNotBrowser.d.ts +0 -2
  58. package/dist/assertNotBrowser.d.ts.map +0 -1
  59. package/dist/router-15f9618e.js +0 -724
  60. package/dist/router-28a2c129.mjs +0 -718
  61. package/dist/transformTRPCResponse-11ac69cc.js +0 -27
  62. package/dist/transformTRPCResponse-c8138d5f.mjs +0 -25
  63. package/src/assertNotBrowser.ts +0 -12
@@ -1,13 +1,6 @@
1
- import { T as TRPCError, g as getTRPCErrorFromUnknown, a as getCauseFromUnknown } from './TRPCError-281ac25a.mjs';
1
+ import { T as TRPCError } from './TRPCError-e99e7cbe.mjs';
2
2
  import { i as invert, T as TRPC_ERROR_CODES_BY_KEY } from './codes-7d21f749.mjs';
3
3
  import { c as createRecursiveProxy } from './index-5a6a2e91.mjs';
4
- import { t as transformTRPCResponse } from './transformTRPCResponse-c8138d5f.mjs';
5
-
6
- /* istanbul ignore file */ function assertNotBrowser() {
7
- if (typeof window !== 'undefined' && !('Deno' in window) && process.env.NODE_ENV !== 'test' && process.env.JEST_WORKER_ID === undefined) {
8
- throw new Error('Imported server-only code in the browser');
9
- }
10
- }
11
4
 
12
5
  const defaultFormatter = ({ shape })=>{
13
6
  return shape;
@@ -253,205 +246,32 @@ const emptyRouter = {
253
246
  return procedure(opts);
254
247
  }
255
248
 
256
- const HTTP_METHOD_PROCEDURE_TYPE_MAP = {
257
- GET: 'query',
258
- POST: 'mutation'
259
- };
260
- function getRawProcedureInputOrThrow(req) {
261
- try {
262
- if (req.method === 'GET') {
263
- if (!req.query.has('input')) {
264
- return undefined;
265
- }
266
- const raw = req.query.get('input');
267
- return JSON.parse(raw);
268
- }
269
- if (typeof req.body === 'string') {
270
- // A mutation with no inputs will have req.body === ''
271
- return req.body.length === 0 ? undefined : JSON.parse(req.body);
272
- }
273
- return req.body;
274
- } catch (err) {
275
- throw new TRPCError({
276
- code: 'PARSE_ERROR',
277
- cause: getCauseFromUnknown(err)
278
- });
279
- }
280
- }
281
- async function resolveHTTPResponse(opts) {
282
- const { createContext , onError , router , req } = opts;
283
- const batchingEnabled = opts.batching?.enabled ?? true;
284
- if (req.method === 'HEAD') {
285
- // can be used for lambda warmup
249
+ /**
250
+ * The default check to see if we're in a server
251
+ */ const isServerDefault = typeof window === 'undefined' || 'Deno' in window || process.env.NODE_ENV === 'test' || !!process.env.JEST_WORKER_ID;
252
+
253
+ function transformTRPCResponseItem(router, item) {
254
+ if ('error' in item) {
286
255
  return {
287
- status: 204
256
+ ...item,
257
+ error: router._def.transformer.output.serialize(item.error)
288
258
  };
289
259
  }
290
- const type = HTTP_METHOD_PROCEDURE_TYPE_MAP[req.method] ?? 'unknown';
291
- let ctx = undefined;
292
- let paths = undefined;
293
- const isBatchCall = !!req.query.get('batch');
294
- function endResponse(untransformedJSON, errors) {
295
- let status = getHTTPStatusCode(untransformedJSON);
296
- const headers = {
297
- 'Content-Type': 'application/json'
298
- };
299
- const meta = opts.responseMeta?.({
300
- ctx,
301
- paths,
302
- type,
303
- data: Array.isArray(untransformedJSON) ? untransformedJSON : [
304
- untransformedJSON
305
- ],
306
- errors
307
- }) ?? {};
308
- for (const [key, value] of Object.entries(meta.headers ?? {})){
309
- headers[key] = value;
310
- }
311
- if (meta.status) {
312
- status = meta.status;
313
- }
314
- const transformedJSON = transformTRPCResponse(router, untransformedJSON);
315
- const body = JSON.stringify(transformedJSON);
260
+ if ('data' in item.result) {
316
261
  return {
317
- body,
318
- status,
319
- headers
320
- };
321
- }
322
- try {
323
- if (opts.error) {
324
- throw opts.error;
325
- }
326
- if (isBatchCall && !batchingEnabled) {
327
- throw new Error(`Batching is not enabled on the server`);
328
- }
329
- if (type === 'subscription') {
330
- throw new TRPCError({
331
- message: 'Subscriptions should use wsLink',
332
- code: 'METHOD_NOT_SUPPORTED'
333
- });
334
- }
335
- if (type === 'unknown') {
336
- throw new TRPCError({
337
- message: `Unexpected request method ${req.method}`,
338
- code: 'METHOD_NOT_SUPPORTED'
339
- });
340
- }
341
- const rawInput = getRawProcedureInputOrThrow(req);
342
- paths = isBatchCall ? opts.path.split(',') : [
343
- opts.path
344
- ];
345
- ctx = await createContext();
346
- const deserializeInputValue = (rawValue)=>{
347
- return typeof rawValue !== 'undefined' ? router._def.transformer.input.deserialize(rawValue) : rawValue;
348
- };
349
- const getInputs = ()=>{
350
- if (!isBatchCall) {
351
- return {
352
- 0: deserializeInputValue(rawInput)
353
- };
354
- }
355
- if (rawInput == null || typeof rawInput !== 'object' || Array.isArray(rawInput)) {
356
- throw new TRPCError({
357
- code: 'BAD_REQUEST',
358
- message: '"input" needs to be an object when doing a batch call'
359
- });
360
- }
361
- const input = {};
362
- for(const key in rawInput){
363
- const k = key;
364
- const rawValue = rawInput[k];
365
- const value = deserializeInputValue(rawValue);
366
- input[k] = value;
262
+ ...item,
263
+ result: {
264
+ ...item.result,
265
+ data: router._def.transformer.output.serialize(item.result.data)
367
266
  }
368
- return input;
369
267
  };
370
- const inputs = getInputs();
371
- const rawResults = await Promise.all(paths.map(async (path, index)=>{
372
- const input = inputs[index];
373
- try {
374
- const output = await callProcedure({
375
- procedures: router._def.procedures,
376
- path,
377
- rawInput: input,
378
- ctx,
379
- type
380
- });
381
- return {
382
- input,
383
- path,
384
- data: output
385
- };
386
- } catch (cause) {
387
- const error = getTRPCErrorFromUnknown(cause);
388
- onError?.({
389
- error,
390
- path,
391
- input,
392
- ctx,
393
- type: type,
394
- req
395
- });
396
- return {
397
- input,
398
- path,
399
- error
400
- };
401
- }
402
- }));
403
- const errors = rawResults.flatMap((obj)=>obj.error ? [
404
- obj.error
405
- ] : []);
406
- const resultEnvelopes = rawResults.map((obj)=>{
407
- const { path , input } = obj;
408
- if (obj.error) {
409
- return {
410
- error: router.getErrorShape({
411
- error: obj.error,
412
- type,
413
- path,
414
- input,
415
- ctx
416
- })
417
- };
418
- } else {
419
- return {
420
- result: {
421
- data: obj.data
422
- }
423
- };
424
- }
425
- });
426
- const result = isBatchCall ? resultEnvelopes : resultEnvelopes[0];
427
- return endResponse(result, errors);
428
- } catch (cause) {
429
- // we get here if
430
- // - batching is called when it's not enabled
431
- // - `createContext()` throws
432
- // - post body is too large
433
- // - input deserialization fails
434
- const error = getTRPCErrorFromUnknown(cause);
435
- onError?.({
436
- error,
437
- path: undefined,
438
- input: undefined,
439
- ctx,
440
- type: type,
441
- req
442
- });
443
- return endResponse({
444
- error: router.getErrorShape({
445
- error,
446
- type,
447
- path: undefined,
448
- input: undefined,
449
- ctx
450
- })
451
- }, [
452
- error
453
- ]);
454
268
  }
269
+ return item;
270
+ }
271
+ /**
272
+ * Takes a unserialized `TRPCResponse` and serializes it with the router's transformers
273
+ **/ function transformTRPCResponse(router, itemOrItems) {
274
+ return Array.isArray(itemOrItems) ? itemOrItems.map((item)=>transformTRPCResponseItem(router, item)) : transformTRPCResponseItem(router, itemOrItems);
455
275
  }
456
276
 
457
- export { defaultTransformer as a, assertNotBrowser as b, createRouterFactory as c, defaultFormatter as d, callProcedure as e, getHTTPStatusCodeFromError as f, getDataTransformer as g, mergeWithoutOverrides as m, procedureTypes as p, resolveHTTPResponse as r };
277
+ export { defaultTransformer as a, getHTTPStatusCodeFromError as b, createRouterFactory as c, defaultFormatter as d, callProcedure as e, getHTTPStatusCode as f, getDataTransformer as g, isServerDefault as i, mergeWithoutOverrides as m, procedureTypes as p, transformTRPCResponse as t };
package/dist/types.d.ts CHANGED
@@ -2,12 +2,19 @@
2
2
  * @internal
3
3
  */
4
4
  export declare type identity<TType> = TType;
5
+ declare type InferOptional<TType, TKeys extends keyof TType> = Partial<Pick<TType, TKeys>> & Omit<TType, TKeys>;
6
+ declare type OmitNever<TType> = Pick<TType, {
7
+ [K in keyof TType]: TType[K] extends never ? never : K;
8
+ }[keyof TType]>;
9
+ declare type UndefinedKeys<TType> = keyof OmitNever<{
10
+ [K in keyof TType]: TType[K] extends undefined ? TType : never;
11
+ }>;
5
12
  /**
6
13
  * @internal
7
14
  */
8
- export declare type FlatOverwrite<TType, TWith> = identity<{
15
+ export declare type FlatOverwrite<TType, TWith> = Simplify<InferOptional<{
9
16
  [TKey in keyof TWith | keyof TType]: TKey extends keyof TWith ? TWith[TKey] : TKey extends keyof TType ? TType[TKey] : never;
10
- }>;
17
+ }, UndefinedKeys<TType> | UndefinedKeys<TWith>>>;
11
18
  /**
12
19
  * @public
13
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,oBAAY,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC;AAEpC;;GAEG;AACH,oBAAY,aAAa,CAAC,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC;KAChD,IAAI,IAAI,MAAM,KAAK,GAAG,MAAM,KAAK,GAAG,IAAI,SAAS,MAAM,KAAK,GACzD,KAAK,CAAC,IAAI,CAAC,GACX,IAAI,SAAS,MAAM,KAAK,GACxB,KAAK,CAAC,IAAI,CAAC,GACX,KAAK;CACV,CAAC,CAAC;AAEH;;GAEG;AACH,oBAAY,KAAK,CAAC,KAAK,IAAI,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC;AAEpD;;GAEG;AACH,oBAAY,OAAO,CAAC,KAAK,IAAI,KAAK,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAC3D,OAAO,CAAC,CAAC,CAAC,GACV,KAAK,CAAC;AAEV;;GAEG;AACH,oBAAY,QAAQ,CAAC,KAAK,IAAI;KAAG,OAAO,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;CAAE,CAAC;AAE3E;;GAEG;AACH,oBAAY,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;AAE5D;;GAEG;AACH,oBAAY,YAAY,CAAC,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;AAEzD;;;;;GAKG;AACH,oBAAY,SAAS,CAAC,KAAK,IAAI,KAAK,GAAG;KACpC,OAAO,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;CACzC,CAAC;AAEF;;GAEG;AACH,oBAAY,oBAAoB,CAAC,SAAS,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,IACtE,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAEjC,aAAK,UAAU,CAAC,IAAI,SAAS,MAAM,EAAE,OAAO,IAAI;KAC7C,IAAI,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,OAAO,GAAG,IAAI,GAAG,KAAK;CAChE,CAAC,MAAM,IAAI,CAAC,CAAC;AAEd;;GAEG;AACH,oBAAY,MAAM,CAAC,IAAI,SAAS,MAAM,EAAE,OAAO,IAAI,IAAI,CACrD,IAAI,EACJ,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAC1B,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,oBAAY,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC;AAEpC,aAAK,aAAa,CAAC,KAAK,EAAE,KAAK,SAAS,MAAM,KAAK,IAAI,OAAO,CAC5D,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CACnB,GACC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAErB,aAAK,SAAS,CAAC,KAAK,IAAI,IAAI,CAC1B,KAAK,EACL;KACG,CAAC,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,GAAG,CAAC;CACvD,CAAC,MAAM,KAAK,CAAC,CACf,CAAC;AAEF,aAAK,aAAa,CAAC,KAAK,IAAI,MAAM,SAAS,CAAC;KACzC,CAAC,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;CAC/D,CAAC,CAAC;AAEH;;GAEG;AACH,oBAAY,aAAa,CAAC,KAAK,EAAE,KAAK,IAAI,QAAQ,CAChD,aAAa,CACX;KACG,IAAI,IAAI,MAAM,KAAK,GAAG,MAAM,KAAK,GAAG,IAAI,SAAS,MAAM,KAAK,GACzD,KAAK,CAAC,IAAI,CAAC,GACX,IAAI,SAAS,MAAM,KAAK,GACxB,KAAK,CAAC,IAAI,CAAC,GACX,KAAK;CACV,EACD,aAAa,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAC5C,CACF,CAAC;AAEF;;GAEG;AACH,oBAAY,KAAK,CAAC,KAAK,IAAI,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC;AAEpD;;GAEG;AACH,oBAAY,OAAO,CAAC,KAAK,IAAI,KAAK,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAC3D,OAAO,CAAC,CAAC,CAAC,GACV,KAAK,CAAC;AAEV;;GAEG;AACH,oBAAY,QAAQ,CAAC,KAAK,IAAI;KAAG,OAAO,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;CAAE,CAAC;AAE3E;;GAEG;AACH,oBAAY,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;AAE5D;;GAEG;AACH,oBAAY,YAAY,CAAC,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;AAEzD;;;;;GAKG;AACH,oBAAY,SAAS,CAAC,KAAK,IAAI,KAAK,GAAG;KACpC,OAAO,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;CACzC,CAAC;AAEF;;GAEG;AACH,oBAAY,oBAAoB,CAAC,SAAS,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,IACtE,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAEjC,aAAK,UAAU,CAAC,IAAI,SAAS,MAAM,EAAE,OAAO,IAAI;KAC7C,IAAI,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,OAAO,GAAG,IAAI,GAAG,KAAK;CAChE,CAAC,MAAM,IAAI,CAAC,CAAC;AAEd;;GAEG;AACH,oBAAY,MAAM,CAAC,IAAI,SAAS,MAAM,EAAE,OAAO,IAAI,IAAI,CACrD,IAAI,EACJ,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAC1B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trpc/server",
3
- "version": "10.0.0-proxy-beta.13",
3
+ "version": "10.0.0-proxy-beta.14",
4
4
  "description": "tRPC Server",
5
5
  "author": "KATT",
6
6
  "license": "MIT",
@@ -122,10 +122,10 @@
122
122
  "@testing-library/jest-dom": "^5.16.5",
123
123
  "@testing-library/react": "^13.4.0",
124
124
  "@testing-library/user-event": "^14.4.3",
125
- "@trpc/client": "10.0.0-proxy-beta.13",
126
- "@trpc/next": "10.0.0-proxy-beta.13",
127
- "@trpc/react": "10.0.0-proxy-beta.13",
128
- "@trpc/server": "10.0.0-proxy-beta.13",
125
+ "@trpc/client": "10.0.0-proxy-beta.14",
126
+ "@trpc/next": "10.0.0-proxy-beta.14",
127
+ "@trpc/react": "10.0.0-proxy-beta.14",
128
+ "@trpc/server": "10.0.0-proxy-beta.14",
129
129
  "@types/aws-lambda": "^8.10.97",
130
130
  "@types/express": "^4.17.12",
131
131
  "@types/hash-sum": "^1.0.0",
@@ -161,5 +161,5 @@
161
161
  "yup": "^0.32.8",
162
162
  "zod": "^3.0.0"
163
163
  },
164
- "gitHead": "017ac71d5b0cc37d6c1fa22d03377a99a17b6dde"
164
+ "gitHead": "55d4775d90e8620889a6828a4a3d3373c1bdd5f5"
165
165
  }
@@ -1,5 +1,4 @@
1
1
  import { FastifyReply, FastifyRequest } from 'fastify';
2
- import { assertNotBrowser } from '../../assertNotBrowser';
3
2
  import { AnyRouter, inferRouterContext } from '../../core';
4
3
  import {
5
4
  HTTPBaseHandlerOptions,
@@ -8,8 +7,6 @@ import {
8
7
  import { resolveHTTPResponse } from '../../http/resolveHTTPResponse';
9
8
  import { NodeHTTPCreateContextOption } from '../node-http';
10
9
 
11
- assertNotBrowser();
12
-
13
10
  export type FastifyHandlerOptions<
14
11
  TRouter extends AnyRouter,
15
12
  TRequest extends FastifyRequest,
@@ -1,11 +1,8 @@
1
- import { assertNotBrowser } from '../../assertNotBrowser';
2
1
  import { AnyRouter } from '../../core';
3
2
  import { HTTPRequest } from '../../http/internals/types';
4
3
  import { resolveHTTPResponse } from '../../http/resolveHTTPResponse';
5
4
  import { FetchHandlerOptions } from './types';
6
5
 
7
- assertNotBrowser();
8
-
9
6
  export type FetchHandlerRequestOptions<TRouter extends AnyRouter> = {
10
7
  req: Request;
11
8
  endpoint: string;
@@ -1,5 +1,4 @@
1
1
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
2
- import { assertNotBrowser } from '../../assertNotBrowser';
3
2
  import { AnyRouter } from '../../core';
4
3
  import { inferRouterDef } from '../../core/types';
5
4
  import { HTTPRequest } from '../../http/internals/types';
@@ -11,8 +10,6 @@ import {
11
10
  NodeHTTPResponse,
12
11
  } from './types';
13
12
 
14
- assertNotBrowser();
15
-
16
13
  type NodeHTTPRequestHandlerOptions<
17
14
  TRouter extends AnyRouter,
18
15
  TRequest extends NodeHTTPRequest,
@@ -1,6 +1,11 @@
1
1
  import { IncomingMessage } from 'http';
2
2
  import ws from 'ws';
3
- import { AnyRouter, ProcedureType, inferRouterContext } from '../core';
3
+ import {
4
+ AnyRouter,
5
+ ProcedureType,
6
+ callProcedure,
7
+ inferRouterContext,
8
+ } from '../core';
4
9
  import { TRPCError } from '../error/TRPCError';
5
10
  import { getCauseFromUnknown, getTRPCErrorFromUnknown } from '../error/utils';
6
11
  import { transformTRPCResponse } from '../internals/transformTRPCResponse';
@@ -160,8 +165,13 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
160
165
  try {
161
166
  await ctxPromise; // asserts context has been set
162
167
 
163
- const caller = router.createCaller(ctx);
164
- const result = await caller[type](path, input as any);
168
+ const result = await callProcedure({
169
+ procedures: router._def.procedures,
170
+ path,
171
+ rawInput: input,
172
+ ctx,
173
+ type,
174
+ });
165
175
 
166
176
  if (type === 'subscription') {
167
177
  if (!isObservable(result)) {
@@ -18,6 +18,7 @@ import {
18
18
  CreateRootConfig,
19
19
  InitGenerics,
20
20
  InitOptions,
21
+ isServerDefault,
21
22
  } from './internals/config';
22
23
  import { createBuilder } from './internals/procedureBuilder';
23
24
  import { PickFirstDefined, ValidateShape } from './internals/utils';
@@ -95,6 +96,17 @@ function createTRPCInner<TParams extends Partial<InitGenerics>>() {
95
96
  transformer: $Transformer;
96
97
  }>;
97
98
 
99
+ {
100
+ // Server check
101
+ const isServer: boolean = options?.isServer ?? isServerDefault;
102
+
103
+ if (!isServer && options?.allowOutsideOfServer !== true) {
104
+ throw new Error(
105
+ `You're trying to use @trpc/server in a non-server environment. This is not supported by default.`,
106
+ );
107
+ }
108
+ }
109
+
98
110
  const errorFormatter = options?.errorFormatter ?? defaultFormatter;
99
111
  const transformer = getDataTransformer(
100
112
  options?.transformer ?? defaultTransformer,
@@ -12,6 +12,16 @@ export interface InitGenerics {
12
12
  ctx: Record<string, unknown>;
13
13
  meta: Record<string, unknown>;
14
14
  }
15
+
16
+ /**
17
+ * The default check to see if we're in a server
18
+ */
19
+ export const isServerDefault: boolean =
20
+ typeof window === 'undefined' ||
21
+ 'Deno' in window ||
22
+ process.env.NODE_ENV === 'test' ||
23
+ !!process.env.JEST_WORKER_ID;
24
+
15
25
  /**
16
26
  * The initial params that are used and actually represents real values underneath
17
27
  * @internal
@@ -19,6 +29,15 @@ export interface InitGenerics {
19
29
  export interface InitOptions<TType extends InitGenerics> {
20
30
  transformer: DataTransformerOptions;
21
31
  errorFormatter: ErrorFormatter<TType['ctx'], any>;
32
+ /**
33
+ * Allow `@trpc/server` to run in non-server environments
34
+ * @default false
35
+ */
36
+ allowOutsideOfServer: boolean;
37
+ /**
38
+ * Is this a server environment?
39
+ */
40
+ isServer: boolean;
22
41
  }
23
42
 
24
43
  /**
@@ -57,7 +57,7 @@ export type MiddlewareFunction<
57
57
  path: string;
58
58
  input: TParams['_input_out'];
59
59
  rawInput: unknown;
60
- meta: TParams['_meta'];
60
+ meta: TParams['_meta'] | undefined;
61
61
  next: {
62
62
  (): Promise<MiddlewareResult<TParams>>;
63
63
  <TContext>(opts: { ctx: TContext }): Promise<
@@ -1,5 +1,4 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { assertNotBrowser } from '../../assertNotBrowser';
3
2
  import { TRPCError } from '../../error/TRPCError';
4
3
  import {
5
4
  getCauseFromUnknown,
@@ -13,8 +12,6 @@ import {
13
12
  middlewareMarker,
14
13
  } from './middlewares';
15
14
 
16
- assertNotBrowser();
17
-
18
15
  export type ProcedureParserZodEsque<TInput, TOutput> = {
19
16
  _input: TInput;
20
17
  _output: TOutput;
@@ -1,5 +1,4 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { assertNotBrowser } from '../assertNotBrowser';
3
2
  import { TRPCError } from '../error/TRPCError';
4
3
  import { defaultFormatter } from '../error/formatter';
5
4
  import { getHTTPStatusCodeFromError } from '../http/internals/getHTTPStatusCode';
@@ -29,8 +28,6 @@ import {
29
28
  } from './internals/procedure';
30
29
  import { MigrateRouter, migrateRouter } from './interop';
31
30
 
32
- assertNotBrowser();
33
-
34
31
  export type { Procedure } from './internals/procedure';
35
32
 
36
33
  /**
package/src/http/index.ts CHANGED
@@ -1,6 +1,2 @@
1
- import { assertNotBrowser } from '../assertNotBrowser';
2
-
3
1
  export * from './resolveHTTPResponse';
4
2
  export * from './types';
5
-
6
- assertNotBrowser();
package/src/index.ts CHANGED
@@ -1,4 +1,3 @@
1
- export * from './assertNotBrowser';
2
1
  export * from './http';
3
2
  export * from './transformer';
4
3
  export * from './error/TRPCError';
package/src/types.ts CHANGED
@@ -5,16 +5,37 @@
5
5
  */
6
6
  export type identity<TType> = TType;
7
7
 
8
+ type InferOptional<TType, TKeys extends keyof TType> = Partial<
9
+ Pick<TType, TKeys>
10
+ > &
11
+ Omit<TType, TKeys>;
12
+
13
+ type OmitNever<TType> = Pick<
14
+ TType,
15
+ {
16
+ [K in keyof TType]: TType[K] extends never ? never : K;
17
+ }[keyof TType]
18
+ >;
19
+
20
+ type UndefinedKeys<TType> = keyof OmitNever<{
21
+ [K in keyof TType]: TType[K] extends undefined ? TType : never;
22
+ }>;
23
+
8
24
  /**
9
25
  * @internal
10
26
  */
11
- export type FlatOverwrite<TType, TWith> = identity<{
12
- [TKey in keyof TWith | keyof TType]: TKey extends keyof TWith
13
- ? TWith[TKey]
14
- : TKey extends keyof TType
15
- ? TType[TKey]
16
- : never;
17
- }>;
27
+ export type FlatOverwrite<TType, TWith> = Simplify<
28
+ InferOptional<
29
+ {
30
+ [TKey in keyof TWith | keyof TType]: TKey extends keyof TWith
31
+ ? TWith[TKey]
32
+ : TKey extends keyof TType
33
+ ? TType[TKey]
34
+ : never;
35
+ },
36
+ UndefinedKeys<TType> | UndefinedKeys<TWith>
37
+ >
38
+ >;
18
39
 
19
40
  /**
20
41
  * @public
@@ -1,2 +0,0 @@
1
- export declare function assertNotBrowser(): void;
2
- //# sourceMappingURL=assertNotBrowser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assertNotBrowser.d.ts","sourceRoot":"","sources":["../src/assertNotBrowser.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,SAS/B"}