@trpc/server 10.0.0-alpha.8 → 10.0.0-proxy-alpha.53
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.
- package/README.md +79 -1
- package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.d.ts +1 -0
- package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.dev.js +190 -0
- package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.js +7 -0
- package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.prod.js +190 -0
- package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.esm.js +186 -0
- package/adapters/aws-lambda/index.d.ts +1 -0
- package/adapters/aws-lambda/index.js +1 -0
- package/adapters/express/dist/trpc-server-adapters-express.cjs.dev.js +7 -7
- package/adapters/express/dist/trpc-server-adapters-express.cjs.prod.js +7 -7
- package/adapters/express/dist/trpc-server-adapters-express.esm.js +7 -7
- package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.dev.js +18 -11
- package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.prod.js +18 -11
- package/adapters/fastify/dist/trpc-server-adapters-fastify.esm.js +18 -11
- package/adapters/fastify/index.d.ts +1 -0
- package/adapters/fastify/index.js +1 -0
- package/adapters/fetch/index.d.ts +1 -0
- package/adapters/fetch/index.js +1 -0
- package/adapters/lambda/dist/trpc-server-adapters-lambda.cjs.d.ts +1 -0
- package/adapters/lambda/dist/trpc-server-adapters-lambda.cjs.dev.js +25 -0
- package/adapters/lambda/dist/trpc-server-adapters-lambda.cjs.js +7 -0
- package/adapters/lambda/dist/trpc-server-adapters-lambda.cjs.prod.js +25 -0
- package/adapters/lambda/dist/trpc-server-adapters-lambda.esm.js +21 -0
- package/adapters/next/dist/trpc-server-adapters-next.cjs.dev.js +4 -4
- package/adapters/next/dist/trpc-server-adapters-next.cjs.prod.js +4 -4
- package/adapters/next/dist/trpc-server-adapters-next.esm.js +4 -4
- package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.dev.js +4 -4
- package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.prod.js +4 -4
- package/adapters/node-http/dist/trpc-server-adapters-node-http.esm.js +4 -4
- package/adapters/node-http/index.js +1 -1
- package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.dev.js +5 -5
- package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.prod.js +5 -5
- package/adapters/standalone/dist/trpc-server-adapters-standalone.esm.js +5 -5
- package/adapters/ws/dist/trpc-server-adapters-ws.cjs.dev.js +24 -7
- package/adapters/ws/dist/trpc-server-adapters-ws.cjs.prod.js +24 -7
- package/adapters/ws/dist/trpc-server-adapters-ws.esm.js +24 -7
- package/dist/TRPCError-bcb38a84.js +61 -0
- package/dist/TRPCError-e6e632a5.mjs +57 -0
- package/dist/adapters/aws-lambda/index.d.ts +14 -0
- package/dist/adapters/aws-lambda/index.d.ts.map +1 -0
- package/dist/adapters/aws-lambda/index.js +153 -0
- package/dist/adapters/aws-lambda/index.mjs +149 -0
- package/dist/adapters/aws-lambda/utils.d.ts +35 -0
- package/dist/adapters/aws-lambda/utils.d.ts.map +1 -0
- package/dist/adapters/express.d.ts +1 -1
- package/dist/adapters/express.d.ts.map +1 -1
- package/dist/adapters/express.js +14 -13
- package/dist/adapters/express.mjs +14 -13
- package/dist/adapters/fastify/fastifyRequestHandler.d.ts +2 -2
- package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -1
- package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts +2 -2
- package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts.map +1 -1
- package/dist/adapters/fastify/index.d.ts.map +1 -1
- package/dist/adapters/fastify/index.js +87 -0
- package/dist/adapters/fastify/index.mjs +82 -0
- package/dist/adapters/fetch/fetchRequestHandler.d.ts +8 -0
- package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -0
- package/dist/adapters/fetch/index.d.ts +3 -0
- package/dist/adapters/fetch/index.d.ts.map +1 -0
- package/dist/adapters/fetch/index.js +57 -0
- package/dist/adapters/fetch/index.mjs +53 -0
- package/dist/adapters/fetch/types.d.ts +21 -0
- package/dist/adapters/fetch/types.d.ts.map +1 -0
- package/dist/adapters/lambda/index.d.ts +12 -0
- package/dist/adapters/lambda/index.d.ts.map +1 -0
- package/dist/adapters/next.d.ts +2 -2
- package/dist/adapters/next.d.ts.map +1 -1
- package/dist/adapters/next.js +42 -46
- package/dist/adapters/next.mjs +42 -46
- package/dist/adapters/node-http/index.d.ts.map +1 -1
- package/dist/adapters/node-http/index.js +5 -4
- package/dist/adapters/node-http/index.mjs +5 -4
- package/dist/adapters/node-http/internals/getPostBody.d.ts +1 -1
- package/dist/adapters/node-http/internals/getPostBody.d.ts.map +1 -1
- package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts +2 -2
- package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
- package/dist/adapters/node-http/types.d.ts +11 -9
- package/dist/adapters/node-http/types.d.ts.map +1 -1
- package/dist/adapters/standalone.d.ts +2 -2
- package/dist/adapters/standalone.d.ts.map +1 -1
- package/dist/adapters/standalone.js +30 -28
- package/dist/adapters/standalone.mjs +30 -27
- package/dist/adapters/ws.d.ts +8 -6
- package/dist/adapters/ws.d.ts.map +1 -1
- package/dist/adapters/ws.js +284 -317
- package/dist/adapters/ws.mjs +284 -317
- package/dist/assertNotBrowser.d.ts.map +1 -1
- package/dist/codes-1c24d919.js +47 -0
- package/dist/codes-aaa7d554.mjs +44 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/initTRPC.d.ts +95 -0
- package/dist/core/initTRPC.d.ts.map +1 -0
- package/dist/core/internals/__generated__/mergeRoutersGeneric.d.ts +302 -0
- package/dist/core/internals/__generated__/mergeRoutersGeneric.d.ts.map +1 -0
- package/dist/core/internals/config.d.ts +36 -0
- package/dist/core/internals/config.d.ts.map +1 -0
- package/dist/core/internals/getParseFn.d.ts +9 -0
- package/dist/core/internals/getParseFn.d.ts.map +1 -0
- package/dist/core/internals/mergeRouters.d.ts +3 -0
- package/dist/core/internals/mergeRouters.d.ts.map +1 -0
- package/dist/core/internals/mergeWithoutOverrides.d.ts +5 -0
- package/dist/core/internals/mergeWithoutOverrides.d.ts.map +1 -0
- package/dist/core/internals/omitPrototype.d.ts +6 -0
- package/dist/core/internals/omitPrototype.d.ts.map +1 -0
- package/dist/core/internals/prefixObjectKeys.d.ts +2 -0
- package/dist/core/internals/prefixObjectKeys.d.ts.map +1 -0
- package/dist/core/internals/procedureBuilder.d.ts +124 -0
- package/dist/core/internals/procedureBuilder.d.ts.map +1 -0
- package/dist/core/internals/utils.d.ts +44 -0
- package/dist/core/internals/utils.d.ts.map +1 -0
- package/dist/core/middleware.d.ts +87 -0
- package/dist/core/middleware.d.ts.map +1 -0
- package/dist/core/parser.d.ts +25 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/procedure.d.ts +89 -0
- package/dist/core/procedure.d.ts.map +1 -0
- package/dist/core/router.d.ts +136 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/types.d.ts +19 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/{internals → deprecated/internals}/callProcedure.d.ts +5 -2
- package/dist/deprecated/internals/callProcedure.d.ts.map +1 -0
- package/dist/{internals → deprecated/internals}/middlewares.d.ts +21 -3
- package/dist/deprecated/internals/middlewares.d.ts.map +1 -0
- package/dist/deprecated/internals/procedure.d.ts +96 -0
- package/dist/deprecated/internals/procedure.d.ts.map +1 -0
- package/dist/deprecated/interop.d.ts +61 -0
- package/dist/deprecated/interop.d.ts.map +1 -0
- package/dist/deprecated/router.d.ts +194 -0
- package/dist/deprecated/router.d.ts.map +1 -0
- package/dist/error/TRPCError.d.ts +11 -0
- package/dist/error/TRPCError.d.ts.map +1 -0
- package/dist/error/formatter.d.ts +33 -0
- package/dist/error/formatter.d.ts.map +1 -0
- package/dist/{internals/errors.d.ts → error/utils.d.ts} +3 -2
- package/dist/error/utils.d.ts.map +1 -0
- package/dist/http/index.d.ts +1 -1
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/internals/getHTTPStatusCode.d.ts +2 -1
- package/dist/http/internals/getHTTPStatusCode.d.ts.map +1 -1
- package/dist/http/internals/types.d.ts +11 -8
- package/dist/http/internals/types.d.ts.map +1 -1
- package/dist/http/resolveHTTPResponse.d.ts +4 -4
- package/dist/http/resolveHTTPResponse.d.ts.map +1 -1
- package/dist/http/{ResponseMeta.d.ts → types.d.ts} +1 -1
- package/dist/http/types.d.ts.map +1 -0
- package/dist/index-47817162.mjs +26 -0
- package/dist/index-9d687d33.js +28 -0
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -516
- package/dist/index.mjs +71 -508
- package/dist/internals/invert.d.ts.map +1 -1
- package/dist/internals/transformTRPCResponse.d.ts +5 -3
- package/dist/internals/transformTRPCResponse.d.ts.map +1 -1
- package/dist/internals/types.d.ts +23 -0
- package/dist/internals/types.d.ts.map +1 -0
- package/dist/internals.d.ts +11 -0
- package/dist/internals.d.ts.map +1 -0
- package/dist/nodeHTTPRequestHandler-2c467c02.mjs +80 -0
- package/dist/nodeHTTPRequestHandler-6609461a.js +82 -0
- package/dist/observable/index.d.ts +5 -0
- package/dist/observable/index.d.ts.map +1 -0
- package/dist/observable/index.js +157 -0
- package/dist/observable/index.mjs +148 -0
- package/dist/observable/internals/identity.d.ts +2 -0
- package/dist/observable/internals/identity.d.ts.map +1 -0
- package/dist/observable/internals/observableToPromise.d.ts +10 -0
- package/dist/observable/internals/observableToPromise.d.ts.map +1 -0
- package/dist/observable/internals/pipe.d.ts +4 -0
- package/dist/observable/internals/pipe.d.ts.map +1 -0
- package/dist/observable/observable.d.ts +5 -0
- package/dist/observable/observable.d.ts.map +1 -0
- package/dist/observable/operators/index.d.ts +4 -0
- package/dist/observable/operators/index.d.ts.map +1 -0
- package/dist/observable/operators/map.d.ts +3 -0
- package/dist/observable/operators/map.d.ts.map +1 -0
- package/dist/observable/operators/share.d.ts +6 -0
- package/dist/observable/operators/share.d.ts.map +1 -0
- package/dist/observable/operators/tap.d.ts +3 -0
- package/dist/observable/operators/tap.d.ts.map +1 -0
- package/dist/observable/types.d.ts +29 -0
- package/dist/observable/types.d.ts.map +1 -0
- package/dist/observable-b651bf11.js +84 -0
- package/dist/observable-e129ac9d.mjs +81 -0
- package/dist/resolveHTTPResponse-11d52bd0.mjs +255 -0
- package/dist/resolveHTTPResponse-29d4b64a.js +259 -0
- package/dist/router-3ee4babe.js +903 -0
- package/dist/router-a2a75de3.mjs +893 -0
- package/dist/rpc/codes.d.ts +2 -0
- package/dist/rpc/codes.d.ts.map +1 -1
- package/dist/rpc/envelopes.d.ts +64 -41
- package/dist/rpc/envelopes.d.ts.map +1 -1
- package/dist/rpc/index.d.ts.map +1 -1
- package/dist/rpc/index.js +1 -1
- package/dist/rpc/index.mjs +1 -1
- package/dist/rpc/internals/invert.d.ts +18 -0
- package/dist/rpc/internals/invert.d.ts.map +1 -0
- package/dist/shared/createProxy/index.d.ts +12 -0
- package/dist/shared/createProxy/index.d.ts.map +1 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +9 -0
- package/dist/shared/index.mjs +1 -0
- package/dist/subscription.d.ts +3 -52
- package/dist/subscription.d.ts.map +1 -1
- package/dist/subscription.js +34 -0
- package/dist/subscription.mjs +30 -0
- package/dist/transformTRPCResponse-11ac69cc.js +27 -0
- package/dist/transformTRPCResponse-c8138d5f.mjs +25 -0
- package/dist/transformer.d.ts +14 -0
- package/dist/transformer.d.ts.map +1 -1
- package/dist/types.d.ts +37 -10
- package/dist/types.d.ts.map +1 -1
- package/observable/index.d.ts +1 -0
- package/observable/index.js +1 -0
- package/package.json +53 -25
- package/rpc/dist/trpc-server-rpc.cjs.dev.js +1 -1
- package/rpc/dist/trpc-server-rpc.cjs.prod.js +1 -1
- package/rpc/dist/trpc-server-rpc.esm.js +1 -1
- package/rpc/index.js +1 -1
- package/shared/index.d.ts +1 -0
- package/shared/index.js +1 -0
- package/src/adapters/aws-lambda/index.ts +173 -0
- package/src/adapters/aws-lambda/utils.ts +92 -0
- package/src/adapters/express.ts +4 -4
- package/src/adapters/fastify/fastifyRequestHandler.ts +6 -8
- package/src/adapters/fastify/fastifyTRPCPlugin.ts +17 -9
- package/src/adapters/fetch/fetchRequestHandler.ts +61 -0
- package/src/adapters/fetch/index.ts +2 -0
- package/src/adapters/fetch/types.ts +28 -0
- package/src/adapters/lambda/index.ts +18 -0
- package/src/adapters/next.ts +10 -8
- package/src/adapters/node-http/internals/getPostBody.test.ts +2 -1
- package/src/adapters/node-http/internals/getPostBody.ts +1 -1
- package/src/adapters/node-http/nodeHTTPRequestHandler.ts +7 -7
- package/src/adapters/node-http/types.ts +11 -9
- package/src/adapters/standalone.ts +12 -4
- package/src/adapters/ws.ts +150 -91
- package/src/assertNotBrowser.ts +1 -0
- package/src/core/index.ts +15 -0
- package/src/core/initTRPC.ts +94 -0
- package/src/core/internals/__generated__/mergeRoutersGeneric.ts +406 -0
- package/src/core/internals/config.ts +43 -0
- package/src/core/internals/getParseFn.ts +47 -0
- package/src/core/internals/mergeRouters.ts +45 -0
- package/src/core/internals/mergeWithoutOverrides.ts +19 -0
- package/src/core/internals/omitPrototype.ts +9 -0
- package/src/core/internals/prefixObjectKeys.ts +9 -0
- package/src/core/internals/procedureBuilder.ts +430 -0
- package/src/core/internals/utils.ts +64 -0
- package/src/core/middleware.ts +96 -0
- package/src/core/parser.ts +45 -0
- package/src/core/procedure.ts +121 -0
- package/src/core/router.ts +351 -0
- package/src/core/types.ts +58 -0
- package/src/{internals → deprecated/internals}/callProcedure.ts +9 -3
- package/src/{internals → deprecated/internals}/middlewares.ts +23 -3
- package/src/deprecated/internals/procedure.ts +415 -0
- package/src/deprecated/interop.ts +272 -0
- package/src/{router.ts → deprecated/router.ts} +221 -108
- package/src/{TRPCError.ts → error/TRPCError.ts} +6 -14
- package/src/error/formatter.ts +51 -0
- package/src/{internals/errors.ts → error/utils.ts} +24 -5
- package/src/http/index.ts +1 -1
- package/src/http/internals/getHTTPStatusCode.ts +3 -2
- package/src/http/internals/types.ts +11 -14
- package/src/http/resolveHTTPResponse.ts +34 -39
- package/src/http/{ResponseMeta.ts → types.ts} +0 -0
- package/src/index.ts +4 -7
- package/src/internals/transformTRPCResponse.ts +21 -16
- package/src/internals/types.ts +24 -0
- package/src/internals.ts +14 -0
- package/src/observable/index.ts +4 -0
- package/src/observable/internals/identity.ts +3 -0
- package/src/observable/internals/observableToPromise.ts +49 -0
- package/src/observable/internals/pipe.ts +23 -0
- package/src/observable/observable.test.ts +101 -0
- package/src/observable/observable.ts +78 -0
- package/src/observable/operators/index.ts +3 -0
- package/src/observable/operators/map.test.ts +92 -0
- package/src/observable/operators/map.ts +25 -0
- package/src/observable/operators/share.test.ts +60 -0
- package/src/observable/operators/share.ts +67 -0
- package/src/observable/operators/tap.ts +26 -0
- package/src/observable/types.ts +69 -0
- package/src/rpc/codes.ts +2 -1
- package/src/rpc/envelopes.ts +94 -68
- package/src/rpc/internals/invert.ts +27 -0
- package/src/shared/createProxy/index.ts +38 -0
- package/src/shared/index.ts +1 -0
- package/src/subscription.ts +7 -125
- package/src/transformer.ts +28 -0
- package/src/types.ts +45 -15
- package/subscription/index.d.ts +1 -0
- package/subscription/index.js +1 -0
- package/adapters/fastify/package.json +0 -4
- package/dist/TRPCError.d.ts +0 -19
- package/dist/TRPCError.d.ts.map +0 -1
- package/dist/adapters/express.ts.js +0 -1
- package/dist/adapters/next.ts.js +0 -1
- package/dist/adapters/node-http/index.ts.js +0 -1
- package/dist/adapters/standalone.ts.js +0 -1
- package/dist/adapters/ws.ts.js +0 -1
- package/dist/codes-7a3d4f65.mjs +0 -56
- package/dist/codes-7f46544e.js +0 -60
- package/dist/deprecated/LegacyRouter.d.ts +0 -3
- package/dist/deprecated/LegacyRouter.d.ts.map +0 -1
- package/dist/deprecated/createHttpServer.d.ts +0 -19
- package/dist/deprecated/createHttpServer.d.ts.map +0 -1
- package/dist/deprecated/requestHandler.d.ts +0 -15
- package/dist/deprecated/requestHandler.d.ts.map +0 -1
- package/dist/http/ResponseMeta.d.ts.map +0 -1
- package/dist/index.ts.js +0 -1
- package/dist/internals/BaseHandlerOptions.d.ts +0 -13
- package/dist/internals/BaseHandlerOptions.d.ts.map +0 -1
- package/dist/internals/OnErrorFunction.d.ts +0 -11
- package/dist/internals/OnErrorFunction.d.ts.map +0 -1
- package/dist/internals/callProcedure.d.ts.map +0 -1
- package/dist/internals/errors.d.ts.map +0 -1
- package/dist/internals/middlewares.d.ts.map +0 -1
- package/dist/internals/procedure.d.ts +0 -74
- package/dist/internals/procedure.d.ts.map +0 -1
- package/dist/internals/wrapCallSafe.d.ts +0 -16
- package/dist/internals/wrapCallSafe.d.ts.map +0 -1
- package/dist/nodeHTTPRequestHandler-10e6d2f9.mjs +0 -394
- package/dist/nodeHTTPRequestHandler-d7c307d3.js +0 -399
- package/dist/router.d.ts +0 -176
- package/dist/router.d.ts.map +0 -1
- package/dist/rpc/index.ts.js +0 -1
- package/dist/subscription-5b7e1eba.js +0 -136
- package/dist/subscription-e1d42e69.mjs +0 -133
- package/dist/transformTRPCResponse-76e0c91e.mjs +0 -109
- package/dist/transformTRPCResponse-bd24f548.js +0 -114
- package/dist/ws/index.d.ts +0 -7
- package/dist/ws/index.d.ts.map +0 -1
- package/dist/ws/index.js +0 -15
- package/dist/ws/index.mjs +0 -11
- package/dist/ws/index.ts.js +0 -1
- package/src/deprecated/LegacyRouter.ts +0 -3
- package/src/deprecated/createHttpServer.ts +0 -29
- package/src/deprecated/requestHandler.ts +0 -26
- package/src/internals/BaseHandlerOptions.ts +0 -13
- package/src/internals/OnErrorFunction.ts +0 -11
- package/src/internals/procedure.ts +0 -283
- package/src/internals/wrapCallSafe.ts +0 -19
- package/src/ws/index.ts +0 -8
- package/ws/dist/trpc-server-ws.cjs.d.ts +0 -1
- package/ws/dist/trpc-server-ws.cjs.dev.js +0 -15
- package/ws/dist/trpc-server-ws.cjs.js +0 -7
- package/ws/dist/trpc-server-ws.cjs.prod.js +0 -15
- package/ws/dist/trpc-server-ws.esm.js +0 -11
- package/ws/index.d.ts +0 -1
- package/ws/index.js +0 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensures there are no duplicate keys when building a procedure.
|
|
3
|
+
*/
|
|
4
|
+
export function mergeWithoutOverrides<T extends Record<string, unknown>>(
|
|
5
|
+
obj1: T,
|
|
6
|
+
...objs: Partial<T>[]
|
|
7
|
+
): T {
|
|
8
|
+
const newObj: T = Object.assign(Object.create(null), obj1);
|
|
9
|
+
|
|
10
|
+
for (const overrides of objs) {
|
|
11
|
+
for (const key in overrides) {
|
|
12
|
+
if (key in newObj && newObj[key] !== overrides[key]) {
|
|
13
|
+
throw new Error(`Duplicate key ${key}`);
|
|
14
|
+
}
|
|
15
|
+
newObj[key as keyof T] = overrides[key] as T[keyof T];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return newObj;
|
|
19
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { omitPrototype } from './omitPrototype';
|
|
2
|
+
|
|
3
|
+
export function prefixObjectKeys(obj: Record<string, unknown>, prefix: string) {
|
|
4
|
+
const newObj: Record<string, unknown> = omitPrototype({});
|
|
5
|
+
for (const key in obj ?? {}) {
|
|
6
|
+
newObj[prefix + key] = obj[key];
|
|
7
|
+
}
|
|
8
|
+
return newObj;
|
|
9
|
+
}
|
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { TRPCError } from '../../error/TRPCError';
|
|
2
|
+
import { getCauseFromUnknown, getErrorFromUnknown } from '../../error/utils';
|
|
3
|
+
import { FlatOverwrite, MaybePromise } from '../../types';
|
|
4
|
+
import { MiddlewareFunction, MiddlewareResult } from '../middleware';
|
|
5
|
+
import { Parser, inferParser } from '../parser';
|
|
6
|
+
import {
|
|
7
|
+
MutationProcedure,
|
|
8
|
+
Procedure,
|
|
9
|
+
ProcedureParams,
|
|
10
|
+
QueryProcedure,
|
|
11
|
+
SubscriptionProcedure,
|
|
12
|
+
} from '../procedure';
|
|
13
|
+
import { ProcedureType } from '../types';
|
|
14
|
+
import { RootConfig } from './config';
|
|
15
|
+
import { ParseFn, getParseFn } from './getParseFn';
|
|
16
|
+
import { mergeWithoutOverrides } from './mergeWithoutOverrides';
|
|
17
|
+
import { ResolveOptions, middlewareMarker } from './utils';
|
|
18
|
+
import { DefaultValue as FallbackValue, Overwrite, UnsetMarker } from './utils';
|
|
19
|
+
|
|
20
|
+
type CreateProcedureReturnInput<
|
|
21
|
+
TPrev extends ProcedureParams,
|
|
22
|
+
TNext extends ProcedureParams,
|
|
23
|
+
> = ProcedureBuilder<{
|
|
24
|
+
_config: TPrev['_config'];
|
|
25
|
+
_meta: TPrev['_meta'];
|
|
26
|
+
_ctx_in: TPrev['_ctx_in'];
|
|
27
|
+
_ctx_out: Overwrite<TPrev['_ctx_out'], TNext['_ctx_out']>;
|
|
28
|
+
_input_in: FallbackValue<TNext['_input_in'], TPrev['_input_in']>;
|
|
29
|
+
_input_out: FallbackValue<TNext['_input_out'], TPrev['_input_out']>;
|
|
30
|
+
_output_in: FallbackValue<TNext['_output_in'], TPrev['_output_in']>;
|
|
31
|
+
_output_out: FallbackValue<TNext['_output_out'], TPrev['_output_out']>;
|
|
32
|
+
}>;
|
|
33
|
+
|
|
34
|
+
type OverwriteIfDefined<T, K> = UnsetMarker extends T ? K : FlatOverwrite<T, K>;
|
|
35
|
+
|
|
36
|
+
type ErrorMessage<T extends string> = T;
|
|
37
|
+
|
|
38
|
+
export interface ProcedureBuilder<TParams extends ProcedureParams> {
|
|
39
|
+
/**
|
|
40
|
+
* Add an input parser to the procedure.
|
|
41
|
+
*/
|
|
42
|
+
input<$TParser extends Parser>(
|
|
43
|
+
schema: TParams['_input_out'] extends UnsetMarker
|
|
44
|
+
? $TParser
|
|
45
|
+
: inferParser<$TParser>['out'] extends Record<string, unknown>
|
|
46
|
+
? TParams['_input_out'] extends Record<string, unknown>
|
|
47
|
+
? $TParser
|
|
48
|
+
: ErrorMessage<'All input parsers did not resolve to an object'>
|
|
49
|
+
: ErrorMessage<'All input parsers did not resolve to an object'>,
|
|
50
|
+
): ProcedureBuilder<{
|
|
51
|
+
_config: TParams['_config'];
|
|
52
|
+
_meta: TParams['_meta'];
|
|
53
|
+
_ctx_in: TParams['_ctx_in'];
|
|
54
|
+
_ctx_out: TParams['_ctx_out'];
|
|
55
|
+
_input_in: OverwriteIfDefined<
|
|
56
|
+
TParams['_input_in'],
|
|
57
|
+
inferParser<$TParser>['in']
|
|
58
|
+
>;
|
|
59
|
+
_input_out: OverwriteIfDefined<
|
|
60
|
+
TParams['_input_out'],
|
|
61
|
+
inferParser<$TParser>['out']
|
|
62
|
+
>;
|
|
63
|
+
_output_in: TParams['_output_in'];
|
|
64
|
+
_output_out: TParams['_output_out'];
|
|
65
|
+
}>;
|
|
66
|
+
/**
|
|
67
|
+
* Add an output parser to the procedure.
|
|
68
|
+
*/
|
|
69
|
+
output<$TParser extends Parser>(
|
|
70
|
+
schema: $TParser,
|
|
71
|
+
): ProcedureBuilder<{
|
|
72
|
+
_config: TParams['_config'];
|
|
73
|
+
_meta: TParams['_meta'];
|
|
74
|
+
_ctx_in: TParams['_ctx_in'];
|
|
75
|
+
_ctx_out: TParams['_ctx_out'];
|
|
76
|
+
_input_in: TParams['_input_in'];
|
|
77
|
+
_input_out: TParams['_input_out'];
|
|
78
|
+
_output_in: inferParser<$TParser>['in'];
|
|
79
|
+
_output_out: inferParser<$TParser>['out'];
|
|
80
|
+
}>;
|
|
81
|
+
/**
|
|
82
|
+
* Add a meta data to the procedure.
|
|
83
|
+
*/
|
|
84
|
+
meta(meta: TParams['_meta']): ProcedureBuilder<TParams>;
|
|
85
|
+
/**
|
|
86
|
+
* Add a middleware to the procedure.
|
|
87
|
+
*/
|
|
88
|
+
use<$TParams extends ProcedureParams>(
|
|
89
|
+
fn: MiddlewareFunction<TParams, $TParams>,
|
|
90
|
+
): CreateProcedureReturnInput<TParams, $TParams>;
|
|
91
|
+
/**
|
|
92
|
+
* Extend the procedure with another procedure.
|
|
93
|
+
* @warning The TypeScript inference fails when chaining concatenated procedures.
|
|
94
|
+
*/
|
|
95
|
+
unstable_concat<$ProcedureReturnInput extends AnyProcedureBuilder>(
|
|
96
|
+
proc: $ProcedureReturnInput,
|
|
97
|
+
): $ProcedureReturnInput extends ProcedureBuilder<infer $TParams>
|
|
98
|
+
? CreateProcedureReturnInput<TParams, $TParams>
|
|
99
|
+
: never;
|
|
100
|
+
/**
|
|
101
|
+
* Query procedure
|
|
102
|
+
*/
|
|
103
|
+
query<$TOutput>(
|
|
104
|
+
resolver: (
|
|
105
|
+
opts: ResolveOptions<TParams>,
|
|
106
|
+
) => MaybePromise<FallbackValue<TParams['_output_in'], $TOutput>>,
|
|
107
|
+
): UnsetMarker extends TParams['_output_out']
|
|
108
|
+
? QueryProcedure<
|
|
109
|
+
Overwrite<
|
|
110
|
+
TParams,
|
|
111
|
+
{
|
|
112
|
+
_output_in: $TOutput;
|
|
113
|
+
_output_out: $TOutput;
|
|
114
|
+
}
|
|
115
|
+
>
|
|
116
|
+
>
|
|
117
|
+
: QueryProcedure<TParams>;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Mutation procedure
|
|
121
|
+
*/
|
|
122
|
+
mutation<$TOutput>(
|
|
123
|
+
resolver: (
|
|
124
|
+
opts: ResolveOptions<TParams>,
|
|
125
|
+
) => MaybePromise<FallbackValue<TParams['_output_in'], $TOutput>>,
|
|
126
|
+
): UnsetMarker extends TParams['_output_out']
|
|
127
|
+
? MutationProcedure<
|
|
128
|
+
Overwrite<
|
|
129
|
+
TParams,
|
|
130
|
+
{
|
|
131
|
+
_output_in: $TOutput;
|
|
132
|
+
_output_out: $TOutput;
|
|
133
|
+
}
|
|
134
|
+
>
|
|
135
|
+
>
|
|
136
|
+
: MutationProcedure<TParams>;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Mutation procedure
|
|
140
|
+
*/
|
|
141
|
+
subscription<$TOutput>(
|
|
142
|
+
resolver: (
|
|
143
|
+
opts: ResolveOptions<TParams>,
|
|
144
|
+
) => MaybePromise<FallbackValue<TParams['_output_in'], $TOutput>>,
|
|
145
|
+
): UnsetMarker extends TParams['_output_out']
|
|
146
|
+
? SubscriptionProcedure<
|
|
147
|
+
Overwrite<
|
|
148
|
+
TParams,
|
|
149
|
+
{
|
|
150
|
+
_output_in: $TOutput;
|
|
151
|
+
_output_out: $TOutput;
|
|
152
|
+
}
|
|
153
|
+
>
|
|
154
|
+
>
|
|
155
|
+
: SubscriptionProcedure<TParams>;
|
|
156
|
+
/**
|
|
157
|
+
* @internal
|
|
158
|
+
*/
|
|
159
|
+
_def: {
|
|
160
|
+
inputs: Parser[];
|
|
161
|
+
output?: Parser;
|
|
162
|
+
meta?: Record<string, unknown>;
|
|
163
|
+
resolver?: ProcedureBuilderResolver;
|
|
164
|
+
middlewares: ProcedureBuilderMiddleware[];
|
|
165
|
+
mutation?: boolean;
|
|
166
|
+
query?: boolean;
|
|
167
|
+
subscription?: boolean;
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
type AnyProcedureBuilder = ProcedureBuilder<any>;
|
|
172
|
+
export type ProcedureBuilderDef = AnyProcedureBuilder['_def'];
|
|
173
|
+
|
|
174
|
+
export type ProcedureBuilderMiddleware = MiddlewareFunction<any, any>;
|
|
175
|
+
|
|
176
|
+
export type ProcedureBuilderResolver = (
|
|
177
|
+
opts: ResolveOptions<any>,
|
|
178
|
+
) => Promise<unknown>;
|
|
179
|
+
|
|
180
|
+
function createNewBuilder(
|
|
181
|
+
def1: ProcedureBuilderDef,
|
|
182
|
+
def2: Partial<ProcedureBuilderDef>,
|
|
183
|
+
) {
|
|
184
|
+
const { middlewares = [], inputs, ...rest } = def2;
|
|
185
|
+
|
|
186
|
+
// TODO: maybe have a fn here to warn about calls
|
|
187
|
+
return createBuilder({
|
|
188
|
+
...mergeWithoutOverrides(def1, rest),
|
|
189
|
+
inputs: [...def1.inputs, ...(inputs ?? [])],
|
|
190
|
+
middlewares: [...def1.middlewares, ...middlewares],
|
|
191
|
+
} as any);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export function createBuilder<TConfig extends RootConfig>(
|
|
195
|
+
initDef?: ProcedureBuilderDef,
|
|
196
|
+
): ProcedureBuilder<{
|
|
197
|
+
_config: TConfig;
|
|
198
|
+
_ctx_in: TConfig['ctx'];
|
|
199
|
+
_ctx_out: TConfig['ctx'];
|
|
200
|
+
_input_in: UnsetMarker;
|
|
201
|
+
_input_out: UnsetMarker;
|
|
202
|
+
_output_in: UnsetMarker;
|
|
203
|
+
_output_out: UnsetMarker;
|
|
204
|
+
_meta: TConfig['meta'];
|
|
205
|
+
}> {
|
|
206
|
+
const _def: ProcedureBuilderDef = initDef || {
|
|
207
|
+
inputs: [],
|
|
208
|
+
middlewares: [],
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
return {
|
|
212
|
+
_def,
|
|
213
|
+
input(input) {
|
|
214
|
+
const parser = getParseFn(input);
|
|
215
|
+
return createNewBuilder(_def, {
|
|
216
|
+
inputs: [input],
|
|
217
|
+
middlewares: [createInputMiddleware(parser)],
|
|
218
|
+
}) as AnyProcedureBuilder;
|
|
219
|
+
},
|
|
220
|
+
output(output: Parser) {
|
|
221
|
+
const parseOutput = getParseFn(output);
|
|
222
|
+
return createNewBuilder(_def, {
|
|
223
|
+
output,
|
|
224
|
+
middlewares: [createOutputMiddleware(parseOutput)],
|
|
225
|
+
}) as AnyProcedureBuilder;
|
|
226
|
+
},
|
|
227
|
+
meta(meta) {
|
|
228
|
+
return createNewBuilder(_def, {
|
|
229
|
+
meta: meta as Record<string, unknown>,
|
|
230
|
+
}) as AnyProcedureBuilder;
|
|
231
|
+
},
|
|
232
|
+
unstable_concat(builder) {
|
|
233
|
+
return createNewBuilder(_def, builder._def) as any;
|
|
234
|
+
},
|
|
235
|
+
use(middleware) {
|
|
236
|
+
return createNewBuilder(_def, {
|
|
237
|
+
middlewares: [middleware],
|
|
238
|
+
}) as AnyProcedureBuilder;
|
|
239
|
+
},
|
|
240
|
+
query(resolver) {
|
|
241
|
+
return createResolver(
|
|
242
|
+
{ ..._def, query: true },
|
|
243
|
+
resolver,
|
|
244
|
+
) as QueryProcedure<any>;
|
|
245
|
+
},
|
|
246
|
+
mutation(resolver) {
|
|
247
|
+
return createResolver(
|
|
248
|
+
{ ..._def, mutation: true },
|
|
249
|
+
resolver,
|
|
250
|
+
) as MutationProcedure<any>;
|
|
251
|
+
},
|
|
252
|
+
subscription(resolver) {
|
|
253
|
+
return createResolver(
|
|
254
|
+
{ ..._def, subscription: true },
|
|
255
|
+
resolver,
|
|
256
|
+
) as SubscriptionProcedure<any>;
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function isPlainObject(obj: unknown) {
|
|
262
|
+
return obj && typeof obj === 'object' && !Array.isArray(obj);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export function createInputMiddleware<T>(
|
|
266
|
+
parse: ParseFn<T>,
|
|
267
|
+
): ProcedureBuilderMiddleware {
|
|
268
|
+
return async function inputMiddleware({ next, rawInput, input }) {
|
|
269
|
+
let parsedInput: ReturnType<typeof parse>;
|
|
270
|
+
try {
|
|
271
|
+
parsedInput = await parse(rawInput);
|
|
272
|
+
} catch (cause) {
|
|
273
|
+
throw new TRPCError({
|
|
274
|
+
code: 'BAD_REQUEST',
|
|
275
|
+
cause: getCauseFromUnknown(cause),
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Multiple input parsers
|
|
280
|
+
const combinedInput =
|
|
281
|
+
isPlainObject(input) && isPlainObject(parsedInput)
|
|
282
|
+
? {
|
|
283
|
+
...input,
|
|
284
|
+
...parsedInput,
|
|
285
|
+
}
|
|
286
|
+
: parsedInput;
|
|
287
|
+
|
|
288
|
+
// TODO fix this typing?
|
|
289
|
+
return next({ input: combinedInput } as any);
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export function createOutputMiddleware<T>(
|
|
294
|
+
parse: ParseFn<T>,
|
|
295
|
+
): ProcedureBuilderMiddleware {
|
|
296
|
+
return async function outputMiddleware({ next }) {
|
|
297
|
+
const result = await next();
|
|
298
|
+
if (!result.ok) {
|
|
299
|
+
// pass through failures without validating
|
|
300
|
+
return result;
|
|
301
|
+
}
|
|
302
|
+
try {
|
|
303
|
+
const data = await parse(result.data);
|
|
304
|
+
return {
|
|
305
|
+
...result,
|
|
306
|
+
data,
|
|
307
|
+
};
|
|
308
|
+
} catch (cause) {
|
|
309
|
+
throw new TRPCError({
|
|
310
|
+
message: 'Output validation failed',
|
|
311
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
312
|
+
cause: getCauseFromUnknown(cause),
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function createResolver(
|
|
319
|
+
_def: ProcedureBuilderDef,
|
|
320
|
+
resolver: (opts: ResolveOptions<any>) => MaybePromise<any>,
|
|
321
|
+
) {
|
|
322
|
+
const finalBuilder = createNewBuilder(_def, {
|
|
323
|
+
resolver,
|
|
324
|
+
middlewares: [
|
|
325
|
+
async function resolveMiddleware(opts) {
|
|
326
|
+
const data = await resolver(opts);
|
|
327
|
+
return {
|
|
328
|
+
marker: middlewareMarker,
|
|
329
|
+
ok: true,
|
|
330
|
+
data,
|
|
331
|
+
ctx: opts.ctx,
|
|
332
|
+
} as const;
|
|
333
|
+
},
|
|
334
|
+
],
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
return createProcedureCaller(finalBuilder._def);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* @internal
|
|
342
|
+
*/
|
|
343
|
+
export interface ProcedureCallOptions {
|
|
344
|
+
ctx: unknown;
|
|
345
|
+
rawInput: unknown;
|
|
346
|
+
input?: unknown;
|
|
347
|
+
path: string;
|
|
348
|
+
type: ProcedureType;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const codeblock = `
|
|
352
|
+
If you want to call this function on the server, you do the following:
|
|
353
|
+
This is a client-only function.
|
|
354
|
+
|
|
355
|
+
const caller = appRouter.createCaller({
|
|
356
|
+
/* ... your context */
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
const result = await caller.call('myProcedure', input);
|
|
360
|
+
`.trim();
|
|
361
|
+
|
|
362
|
+
function createProcedureCaller(_def: ProcedureBuilderDef): Procedure<any> {
|
|
363
|
+
const procedure = async function resolve(opts: ProcedureCallOptions) {
|
|
364
|
+
// is direct server-side call
|
|
365
|
+
if (!opts || !('rawInput' in opts)) {
|
|
366
|
+
throw new Error(codeblock);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// run the middlewares recursively with the resolver as the last one
|
|
370
|
+
const callRecursive = async (
|
|
371
|
+
callOpts: { ctx: any; index: number; input?: unknown } = {
|
|
372
|
+
index: 0,
|
|
373
|
+
ctx: opts.ctx,
|
|
374
|
+
},
|
|
375
|
+
): Promise<MiddlewareResult<any>> => {
|
|
376
|
+
try {
|
|
377
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
378
|
+
const middleware = _def.middlewares[callOpts.index]!;
|
|
379
|
+
const result = await middleware({
|
|
380
|
+
ctx: callOpts.ctx,
|
|
381
|
+
type: opts.type,
|
|
382
|
+
path: opts.path,
|
|
383
|
+
rawInput: opts.rawInput,
|
|
384
|
+
meta: _def.meta,
|
|
385
|
+
input: callOpts.input,
|
|
386
|
+
next: async (nextOpts?: { ctx: any; input?: any }) => {
|
|
387
|
+
return await callRecursive({
|
|
388
|
+
index: callOpts.index + 1,
|
|
389
|
+
ctx:
|
|
390
|
+
nextOpts && 'ctx' in nextOpts
|
|
391
|
+
? { ...callOpts.ctx, ...nextOpts.ctx }
|
|
392
|
+
: callOpts.ctx,
|
|
393
|
+
input:
|
|
394
|
+
nextOpts && 'input' in nextOpts
|
|
395
|
+
? nextOpts.input
|
|
396
|
+
: callOpts.input,
|
|
397
|
+
});
|
|
398
|
+
},
|
|
399
|
+
});
|
|
400
|
+
return result;
|
|
401
|
+
} catch (cause) {
|
|
402
|
+
return {
|
|
403
|
+
ok: false,
|
|
404
|
+
error: getErrorFromUnknown(cause),
|
|
405
|
+
marker: middlewareMarker,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
// there's always at least one "next" since we wrap this.resolver in a middleware
|
|
411
|
+
const result = await callRecursive();
|
|
412
|
+
|
|
413
|
+
if (!result) {
|
|
414
|
+
throw new TRPCError({
|
|
415
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
416
|
+
message:
|
|
417
|
+
'No result from middlewares - did you forget to `return next()`?',
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
if (!result.ok) {
|
|
421
|
+
// re-throw original error
|
|
422
|
+
throw result.error;
|
|
423
|
+
}
|
|
424
|
+
return result.data;
|
|
425
|
+
};
|
|
426
|
+
procedure._def = _def;
|
|
427
|
+
procedure.meta = _def.meta;
|
|
428
|
+
|
|
429
|
+
return procedure as Procedure<any>;
|
|
430
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ProcedureParams } from '../procedure';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export type Overwrite<T, U> = Omit<T, keyof U> & U;
|
|
7
|
+
/**
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export type DefaultValue<TValue, TFallback> = UnsetMarker extends TValue
|
|
11
|
+
? TFallback
|
|
12
|
+
: TValue;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export const middlewareMarker = 'middlewareMarker' as 'middlewareMarker' & {
|
|
18
|
+
__brand: 'middlewareMarker';
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export type MiddlewareMarker = typeof middlewareMarker;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export const unsetMarker = Symbol('unsetMarker');
|
|
30
|
+
/**
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
export type UnsetMarker = typeof unsetMarker;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
38
|
+
export interface ResolveOptions<TParams extends ProcedureParams> {
|
|
39
|
+
ctx: TParams['_ctx_out'];
|
|
40
|
+
input: TParams['_input_out'];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
export type ValidateShape<TActualShape, TExpectedShape> =
|
|
47
|
+
TActualShape extends TExpectedShape
|
|
48
|
+
? Exclude<keyof TActualShape, keyof TExpectedShape> extends never
|
|
49
|
+
? TActualShape
|
|
50
|
+
: TExpectedShape
|
|
51
|
+
: never;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
export type PickFirstDefined<T, K> = undefined extends T
|
|
57
|
+
? undefined extends K
|
|
58
|
+
? never
|
|
59
|
+
: K
|
|
60
|
+
: T;
|
|
61
|
+
|
|
62
|
+
export type EnsureRecord<T> = T extends Record<string, any>
|
|
63
|
+
? T
|
|
64
|
+
: Record<string, never>;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { RootConfig } from './internals/config';
|
|
2
|
+
import { MiddlewareMarker } from './internals/utils';
|
|
3
|
+
import { ProcedureParams } from './procedure';
|
|
4
|
+
import { ProcedureType } from './types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
interface MiddlewareResultBase {
|
|
10
|
+
/**
|
|
11
|
+
* All middlewares should pass through their `next()`'s output.
|
|
12
|
+
* Requiring this marker makes sure that can't be forgotten at compile-time.
|
|
13
|
+
*/
|
|
14
|
+
readonly marker: MiddlewareMarker;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
interface MiddlewareOKResult<_TParams extends ProcedureParams>
|
|
21
|
+
extends MiddlewareResultBase {
|
|
22
|
+
ok: true;
|
|
23
|
+
data: unknown;
|
|
24
|
+
// this could be extended with `input`/`rawInput` later
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
interface MiddlewareErrorResult<_TParams extends ProcedureParams>
|
|
31
|
+
extends MiddlewareResultBase {
|
|
32
|
+
ok: false;
|
|
33
|
+
error: Error;
|
|
34
|
+
// we could guarantee it's always of this type
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
export type MiddlewareResult<TParams extends ProcedureParams> =
|
|
41
|
+
| MiddlewareOKResult<TParams>
|
|
42
|
+
| MiddlewareErrorResult<TParams>;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
export type MiddlewareFunction<
|
|
48
|
+
TParams extends ProcedureParams,
|
|
49
|
+
TParamsAfter extends ProcedureParams,
|
|
50
|
+
> = (opts: {
|
|
51
|
+
ctx: TParams['_ctx_out'];
|
|
52
|
+
type: ProcedureType;
|
|
53
|
+
path: string;
|
|
54
|
+
input: TParams['_input_out'];
|
|
55
|
+
rawInput: unknown;
|
|
56
|
+
meta: TParams['_meta'];
|
|
57
|
+
next: {
|
|
58
|
+
(): Promise<MiddlewareResult<TParams>>;
|
|
59
|
+
<$TContext>(opts: { ctx: $TContext }): Promise<
|
|
60
|
+
MiddlewareResult<{
|
|
61
|
+
_config: any;
|
|
62
|
+
_ctx_in: TParams['_ctx_in'];
|
|
63
|
+
_ctx_out: $TContext;
|
|
64
|
+
_input_in: TParams['_input_in'];
|
|
65
|
+
_input_out: TParams['_input_out'];
|
|
66
|
+
_output_in: TParams['_output_in'];
|
|
67
|
+
_output_out: TParams['_output_out'];
|
|
68
|
+
_meta: TParams['_meta'];
|
|
69
|
+
}>
|
|
70
|
+
>;
|
|
71
|
+
};
|
|
72
|
+
}) => Promise<MiddlewareResult<TParamsAfter>>;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @internal
|
|
76
|
+
*/
|
|
77
|
+
// FIXME this should use RootConfig
|
|
78
|
+
export function createMiddlewareFactory<TConfig extends RootConfig>() {
|
|
79
|
+
return function createMiddleware<$TNewParams extends ProcedureParams>(
|
|
80
|
+
fn: MiddlewareFunction<
|
|
81
|
+
{
|
|
82
|
+
_config: TConfig;
|
|
83
|
+
_ctx_in: TConfig['ctx'];
|
|
84
|
+
_ctx_out: TConfig['ctx'];
|
|
85
|
+
_input_out: unknown;
|
|
86
|
+
_input_in: unknown;
|
|
87
|
+
_output_in: unknown;
|
|
88
|
+
_output_out: unknown;
|
|
89
|
+
_meta: TConfig['meta'];
|
|
90
|
+
},
|
|
91
|
+
$TNewParams
|
|
92
|
+
>,
|
|
93
|
+
) {
|
|
94
|
+
return fn;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type ParserZodEsque<TInput, TParsedInput> = {
|
|
2
|
+
_input: TInput;
|
|
3
|
+
_output: TParsedInput;
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
export type ParserMyZodEsque<TInput> = {
|
|
7
|
+
parse: (input: any) => TInput;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type ParserSuperstructEsque<TInput> = {
|
|
11
|
+
create: (input: unknown) => TInput;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type ParserCustomValidatorEsque<TInput> = (
|
|
15
|
+
input: unknown,
|
|
16
|
+
) => TInput | Promise<TInput>;
|
|
17
|
+
|
|
18
|
+
export type ParserYupEsque<TInput> = {
|
|
19
|
+
validateSync: (input: unknown) => TInput;
|
|
20
|
+
};
|
|
21
|
+
export type ParserWithoutInput<TInput> =
|
|
22
|
+
| ParserYupEsque<TInput>
|
|
23
|
+
| ParserSuperstructEsque<TInput>
|
|
24
|
+
| ParserCustomValidatorEsque<TInput>
|
|
25
|
+
| ParserMyZodEsque<TInput>;
|
|
26
|
+
|
|
27
|
+
export type ParserWithInputOutput<TInput, TParsedInput> = ParserZodEsque<
|
|
28
|
+
TInput,
|
|
29
|
+
TParsedInput
|
|
30
|
+
>;
|
|
31
|
+
|
|
32
|
+
export type Parser = ParserWithoutInput<any> | ParserWithInputOutput<any, any>;
|
|
33
|
+
|
|
34
|
+
export type inferParser<TParser extends Parser> =
|
|
35
|
+
TParser extends ParserWithInputOutput<infer $TIn, infer $TOut>
|
|
36
|
+
? {
|
|
37
|
+
in: $TIn;
|
|
38
|
+
out: $TOut;
|
|
39
|
+
}
|
|
40
|
+
: TParser extends ParserWithoutInput<infer $InOut>
|
|
41
|
+
? {
|
|
42
|
+
in: $InOut;
|
|
43
|
+
out: $InOut;
|
|
44
|
+
}
|
|
45
|
+
: never;
|