@orpc/server 0.0.0-next.9fe2a8b → 0.0.0-next.a05fbfd

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 (73) hide show
  1. package/README.md +118 -0
  2. package/dist/adapters/fetch/index.d.mts +27 -0
  3. package/dist/adapters/fetch/index.d.ts +27 -0
  4. package/dist/adapters/fetch/index.mjs +9 -0
  5. package/dist/adapters/hono/index.d.mts +20 -0
  6. package/dist/adapters/hono/index.d.ts +20 -0
  7. package/dist/adapters/hono/index.mjs +32 -0
  8. package/dist/adapters/next/index.d.mts +27 -0
  9. package/dist/adapters/next/index.d.ts +27 -0
  10. package/dist/{next.js → adapters/next/index.mjs} +11 -18
  11. package/dist/adapters/node/index.d.mts +35 -0
  12. package/dist/adapters/node/index.d.ts +35 -0
  13. package/dist/adapters/node/index.mjs +28 -0
  14. package/dist/adapters/standard/index.d.mts +29 -0
  15. package/dist/adapters/standard/index.d.ts +29 -0
  16. package/dist/adapters/standard/index.mjs +7 -0
  17. package/dist/index.d.mts +253 -0
  18. package/dist/index.d.ts +253 -0
  19. package/dist/{index.js → index.mjs} +41 -99
  20. package/dist/plugins/index.d.mts +31 -0
  21. package/dist/plugins/index.d.ts +31 -0
  22. package/dist/plugins/index.mjs +103 -0
  23. package/dist/shared/server.BBGuTxHE.mjs +163 -0
  24. package/dist/shared/server.BqEaivV1.d.ts +9 -0
  25. package/dist/shared/server.CHpDfeOK.d.mts +77 -0
  26. package/dist/shared/server.CI7U5gRZ.d.mts +152 -0
  27. package/dist/shared/server.CI7U5gRZ.d.ts +152 -0
  28. package/dist/shared/server.CUE4Aija.mjs +24 -0
  29. package/dist/shared/server.DSZ2XY8G.d.ts +77 -0
  30. package/dist/shared/server.MnOqRlBp.d.mts +9 -0
  31. package/dist/shared/server.Q6ZmnTgO.mjs +12 -0
  32. package/dist/{chunk-KK4SDLC7.js → shared/server.V6zT5iYQ.mjs} +148 -89
  33. package/package.json +36 -24
  34. package/dist/chunk-ESTRJAOX.js +0 -299
  35. package/dist/chunk-WUOGVGWG.js +0 -1
  36. package/dist/fetch.js +0 -15
  37. package/dist/hono.js +0 -30
  38. package/dist/node.js +0 -87
  39. package/dist/src/adapters/fetch/index.d.ts +0 -6
  40. package/dist/src/adapters/fetch/orpc-handler.d.ts +0 -20
  41. package/dist/src/adapters/fetch/orpc-payload-codec.d.ts +0 -16
  42. package/dist/src/adapters/fetch/orpc-procedure-matcher.d.ts +0 -12
  43. package/dist/src/adapters/fetch/super-json.d.ts +0 -12
  44. package/dist/src/adapters/fetch/types.d.ts +0 -21
  45. package/dist/src/adapters/hono/index.d.ts +0 -3
  46. package/dist/src/adapters/hono/middleware.d.ts +0 -12
  47. package/dist/src/adapters/next/index.d.ts +0 -3
  48. package/dist/src/adapters/next/serve.d.ts +0 -19
  49. package/dist/src/adapters/node/index.d.ts +0 -5
  50. package/dist/src/adapters/node/orpc-handler.d.ts +0 -12
  51. package/dist/src/adapters/node/request-listener.d.ts +0 -28
  52. package/dist/src/adapters/node/types.d.ts +0 -22
  53. package/dist/src/builder-variants.d.ts +0 -74
  54. package/dist/src/builder.d.ts +0 -57
  55. package/dist/src/config.d.ts +0 -6
  56. package/dist/src/context.d.ts +0 -9
  57. package/dist/src/hidden.d.ts +0 -8
  58. package/dist/src/implementer-procedure.d.ts +0 -30
  59. package/dist/src/implementer-variants.d.ts +0 -17
  60. package/dist/src/implementer.d.ts +0 -28
  61. package/dist/src/index.d.ts +0 -21
  62. package/dist/src/lazy-utils.d.ts +0 -6
  63. package/dist/src/lazy.d.ts +0 -22
  64. package/dist/src/middleware-decorated.d.ts +0 -10
  65. package/dist/src/middleware-utils.d.ts +0 -5
  66. package/dist/src/middleware.d.ts +0 -37
  67. package/dist/src/procedure-client.d.ts +0 -20
  68. package/dist/src/procedure-decorated.d.ts +0 -21
  69. package/dist/src/procedure-utils.d.ts +0 -17
  70. package/dist/src/procedure.d.ts +0 -29
  71. package/dist/src/router-accessible-lazy.d.ts +0 -8
  72. package/dist/src/router-client.d.ts +0 -22
  73. package/dist/src/router.d.ts +0 -29
@@ -1,29 +1,12 @@
1
- import {
2
- LAZY_LOADER_SYMBOL,
3
- Procedure,
4
- adaptRouter,
5
- addMiddleware,
6
- createAccessibleLazyRouter,
7
- createLazyProcedureFormAnyLazy,
8
- createProcedureClient,
9
- deepSetLazyRouterPrefix,
10
- flatLazy,
11
- getLazyRouterPrefix,
12
- getRouterChild,
13
- getRouterContract,
14
- isLazy,
15
- isProcedure,
16
- lazy,
17
- middlewareOutputFn,
18
- setRouterContract,
19
- unlazy
20
- } from "./chunk-KK4SDLC7.js";
1
+ import { mergeErrorMap, mergeMeta, mergeRoute, mergePrefix, mergeTags, isContractProcedure } from '@orpc/contract';
2
+ export { ValidationError, eventIterator, type } from '@orpc/contract';
3
+ import { P as Procedure, d as addMiddleware, c as createProcedureClient, f as adaptRouter, h as flatLazy, l as lazy, s as setRouterContract, i as isProcedure, j as isLazy, k as createLazyProcedureFormAnyLazy, g as getRouterChild } from './shared/server.V6zT5iYQ.mjs';
4
+ export { L as LAZY_LOADER_SYMBOL, a as convertPathToHttpPath, q as createAccessibleLazyRouter, b as createContractedProcedure, n as deepSetLazyRouterPrefix, r as eachAllContractProcedure, e as eachContractProcedure, o as getLazyRouterPrefix, m as getRouterContract, p as middlewareOutputFn, u as unlazy } from './shared/server.V6zT5iYQ.mjs';
5
+ export { ORPCError, isDefinedError, safe } from '@orpc/client';
6
+ export { onError, onFinish, onStart, onSuccess } from '@orpc/shared';
7
+ export { getEventMeta, withEventMeta } from '@orpc/standard-server';
21
8
 
22
- // src/builder.ts
23
- import { mergeErrorMap as mergeErrorMap2, mergeMeta as mergeMeta2, mergePrefix, mergeRoute as mergeRoute2, mergeTags } from "@orpc/contract";
24
-
25
- // src/config.ts
26
- var DEFAULT_CONFIG = {
9
+ const DEFAULT_CONFIG = {
27
10
  initialInputValidationIndex: 0,
28
11
  initialOutputValidationIndex: 0
29
12
  };
@@ -34,7 +17,6 @@ function fallbackConfig(key, value) {
34
17
  return value;
35
18
  }
36
19
 
37
- // src/middleware-decorated.ts
38
20
  function decorateMiddleware(middleware) {
39
21
  const decorated = middleware;
40
22
  decorated.mapInput = (mapInput) => {
@@ -46,10 +28,14 @@ function decorateMiddleware(middleware) {
46
28
  decorated.concat = (concatMiddleware, mapInput) => {
47
29
  const mapped = mapInput ? decorateMiddleware(concatMiddleware).mapInput(mapInput) : concatMiddleware;
48
30
  const concatted = decorateMiddleware((options, input, output, ...rest) => {
49
- const next = async (...[nextOptions]) => {
50
- return mapped({ ...options, context: { ...nextOptions?.context, ...options.context } }, input, output, ...rest);
51
- };
52
- const merged = middleware({ ...options, next }, input, output, ...rest);
31
+ const merged = middleware({
32
+ ...options,
33
+ next: (...[nextOptions1]) => mapped({
34
+ ...options,
35
+ context: { ...options.context, ...nextOptions1?.context },
36
+ next: (...[nextOptions2]) => options.next({ context: { ...nextOptions1?.context, ...nextOptions2?.context } })
37
+ }, input, output, ...rest)
38
+ }, input, output, ...rest);
53
39
  return merged;
54
40
  });
55
41
  return concatted;
@@ -57,30 +43,28 @@ function decorateMiddleware(middleware) {
57
43
  return decorated;
58
44
  }
59
45
 
60
- // src/procedure-decorated.ts
61
- import { mergeErrorMap, mergeMeta, mergeRoute } from "@orpc/contract";
62
- var DecoratedProcedure = class _DecoratedProcedure extends Procedure {
46
+ class DecoratedProcedure extends Procedure {
63
47
  errors(errors) {
64
- return new _DecoratedProcedure({
48
+ return new DecoratedProcedure({
65
49
  ...this["~orpc"],
66
50
  errorMap: mergeErrorMap(this["~orpc"].errorMap, errors)
67
51
  });
68
52
  }
69
53
  meta(meta) {
70
- return new _DecoratedProcedure({
54
+ return new DecoratedProcedure({
71
55
  ...this["~orpc"],
72
56
  meta: mergeMeta(this["~orpc"].meta, meta)
73
57
  });
74
58
  }
75
59
  route(route) {
76
- return new _DecoratedProcedure({
60
+ return new DecoratedProcedure({
77
61
  ...this["~orpc"],
78
62
  route: mergeRoute(this["~orpc"].route, route)
79
63
  });
80
64
  }
81
65
  use(middleware, mapInput) {
82
66
  const mapped = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
83
- return new _DecoratedProcedure({
67
+ return new DecoratedProcedure({
84
68
  ...this["~orpc"],
85
69
  middlewares: addMiddleware(this["~orpc"].middlewares, mapped)
86
70
  });
@@ -100,10 +84,9 @@ var DecoratedProcedure = class _DecoratedProcedure extends Procedure {
100
84
  actionable(...rest) {
101
85
  return this.callable(...rest);
102
86
  }
103
- };
87
+ }
104
88
 
105
- // src/builder.ts
106
- var Builder = class _Builder {
89
+ class Builder {
107
90
  "~orpc";
108
91
  constructor(def) {
109
92
  this["~orpc"] = def;
@@ -114,7 +97,7 @@ var Builder = class _Builder {
114
97
  $config(config) {
115
98
  const inputValidationCount = this["~orpc"].inputValidationIndex - fallbackConfig("initialInputValidationIndex", this["~orpc"].config.initialInputValidationIndex);
116
99
  const outputValidationCount = this["~orpc"].outputValidationIndex - fallbackConfig("initialOutputValidationIndex", this["~orpc"].config.initialOutputValidationIndex);
117
- return new _Builder({
100
+ return new Builder({
118
101
  ...this["~orpc"],
119
102
  config,
120
103
  inputValidationIndex: fallbackConfig("initialInputValidationIndex", config.initialInputValidationIndex) + inputValidationCount,
@@ -125,7 +108,7 @@ var Builder = class _Builder {
125
108
  * Reset initial context
126
109
  */
127
110
  $context() {
128
- return new _Builder({
111
+ return new Builder({
129
112
  ...this["~orpc"],
130
113
  middlewares: [],
131
114
  inputValidationIndex: fallbackConfig("initialInputValidationIndex", this["~orpc"].config.initialInputValidationIndex),
@@ -136,7 +119,7 @@ var Builder = class _Builder {
136
119
  * Reset initial meta
137
120
  */
138
121
  $meta(initialMeta) {
139
- return new _Builder({
122
+ return new Builder({
140
123
  ...this["~orpc"],
141
124
  meta: initialMeta
142
125
  });
@@ -145,7 +128,7 @@ var Builder = class _Builder {
145
128
  * Reset initial route
146
129
  */
147
130
  $route(initialRoute) {
148
- return new _Builder({
131
+ return new Builder({
149
132
  ...this["~orpc"],
150
133
  route: initialRoute
151
134
  });
@@ -154,39 +137,39 @@ var Builder = class _Builder {
154
137
  return decorateMiddleware(middleware);
155
138
  }
156
139
  errors(errors) {
157
- return new _Builder({
140
+ return new Builder({
158
141
  ...this["~orpc"],
159
- errorMap: mergeErrorMap2(this["~orpc"].errorMap, errors)
142
+ errorMap: mergeErrorMap(this["~orpc"].errorMap, errors)
160
143
  });
161
144
  }
162
145
  use(middleware, mapInput) {
163
146
  const mapped = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
164
- return new _Builder({
147
+ return new Builder({
165
148
  ...this["~orpc"],
166
149
  middlewares: addMiddleware(this["~orpc"].middlewares, mapped)
167
150
  });
168
151
  }
169
152
  meta(meta) {
170
- return new _Builder({
153
+ return new Builder({
171
154
  ...this["~orpc"],
172
- meta: mergeMeta2(this["~orpc"].meta, meta)
155
+ meta: mergeMeta(this["~orpc"].meta, meta)
173
156
  });
174
157
  }
175
158
  route(route) {
176
- return new _Builder({
159
+ return new Builder({
177
160
  ...this["~orpc"],
178
- route: mergeRoute2(this["~orpc"].route, route)
161
+ route: mergeRoute(this["~orpc"].route, route)
179
162
  });
180
163
  }
181
164
  input(schema) {
182
- return new _Builder({
165
+ return new Builder({
183
166
  ...this["~orpc"],
184
167
  inputSchema: schema,
185
168
  inputValidationIndex: fallbackConfig("initialInputValidationIndex", this["~orpc"].config.initialInputValidationIndex) + this["~orpc"].middlewares.length
186
169
  });
187
170
  }
188
171
  output(schema) {
189
- return new _Builder({
172
+ return new Builder({
190
173
  ...this["~orpc"],
191
174
  outputSchema: schema,
192
175
  outputValidationIndex: fallbackConfig("initialOutputValidationIndex", this["~orpc"].config.initialOutputValidationIndex) + this["~orpc"].middlewares.length
@@ -199,13 +182,13 @@ var Builder = class _Builder {
199
182
  });
200
183
  }
201
184
  prefix(prefix) {
202
- return new _Builder({
185
+ return new Builder({
203
186
  ...this["~orpc"],
204
187
  prefix: mergePrefix(this["~orpc"].prefix, prefix)
205
188
  });
206
189
  }
207
190
  tag(...tags) {
208
- return new _Builder({
191
+ return new Builder({
209
192
  ...this["~orpc"],
210
193
  tags: mergeTags(this["~orpc"].tags, tags)
211
194
  });
@@ -216,8 +199,8 @@ var Builder = class _Builder {
216
199
  lazy(loader) {
217
200
  return adaptRouter(flatLazy(lazy(loader)), this["~orpc"]);
218
201
  }
219
- };
220
- var os = new Builder({
202
+ }
203
+ const os = new Builder({
221
204
  config: {},
222
205
  route: {},
223
206
  meta: {},
@@ -229,13 +212,10 @@ var os = new Builder({
229
212
  middlewares: []
230
213
  });
231
214
 
232
- // src/context.ts
233
215
  function mergeContext(context, other) {
234
216
  return { ...context, ...other };
235
217
  }
236
218
 
237
- // src/implementer.ts
238
- import { isContractProcedure } from "@orpc/contract";
239
219
  function implementerInternal(contract, config, middlewares) {
240
220
  if (isContractProcedure(contract)) {
241
221
  const impl2 = new Builder({
@@ -321,12 +301,10 @@ function implement(contract, config = {}) {
321
301
  return impl;
322
302
  }
323
303
 
324
- // src/procedure-utils.ts
325
304
  function call(procedure, input, ...rest) {
326
305
  return createProcedureClient(procedure, ...rest)(input);
327
306
  }
328
307
 
329
- // src/router-client.ts
330
308
  function createRouterClient(router, ...rest) {
331
309
  if (isProcedure(router)) {
332
310
  const caller = createProcedureClient(router, ...rest);
@@ -352,40 +330,4 @@ function createRouterClient(router, ...rest) {
352
330
  return recursive;
353
331
  }
354
332
 
355
- // src/index.ts
356
- import { isDefinedError, ORPCError, safe, type, ValidationError } from "@orpc/contract";
357
- export {
358
- Builder,
359
- DecoratedProcedure,
360
- LAZY_LOADER_SYMBOL,
361
- ORPCError,
362
- Procedure,
363
- ValidationError,
364
- adaptRouter,
365
- call,
366
- createAccessibleLazyRouter,
367
- createLazyProcedureFormAnyLazy,
368
- createProcedureClient,
369
- createRouterClient,
370
- decorateMiddleware,
371
- deepSetLazyRouterPrefix,
372
- fallbackConfig,
373
- flatLazy,
374
- getLazyRouterPrefix,
375
- getRouterChild,
376
- getRouterContract,
377
- implement,
378
- implementerInternal,
379
- isDefinedError,
380
- isLazy,
381
- isProcedure,
382
- lazy,
383
- mergeContext,
384
- middlewareOutputFn,
385
- os,
386
- safe,
387
- setRouterContract,
388
- type,
389
- unlazy
390
- };
391
- //# sourceMappingURL=index.js.map
333
+ export { Builder, DecoratedProcedure, Procedure, adaptRouter, call, createLazyProcedureFormAnyLazy, createProcedureClient, createRouterClient, decorateMiddleware, fallbackConfig, flatLazy, getRouterChild, implement, implementerInternal, isLazy, isProcedure, lazy, mergeContext, os, setRouterContract };
@@ -0,0 +1,31 @@
1
+ import { d as StandardHandlerInterceptorOptions, P as Plugin, a as StandardHandlerOptions } from '../shared/server.CHpDfeOK.mjs';
2
+ export { C as CompositePlugin } from '../shared/server.CHpDfeOK.mjs';
3
+ import { Value } from '@orpc/shared';
4
+ import { C as Context } from '../shared/server.CI7U5gRZ.mjs';
5
+ import '@orpc/contract';
6
+ import '@orpc/standard-server';
7
+ import '@orpc/client';
8
+
9
+ interface CORSOptions<TContext extends Context> {
10
+ origin?: Value<string | string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<TContext>]>;
11
+ timingOrigin?: Value<string | string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<TContext>]>;
12
+ allowMethods?: string[];
13
+ allowHeaders?: string[];
14
+ maxAge?: number;
15
+ credentials?: boolean;
16
+ exposeHeaders?: string[];
17
+ }
18
+ declare class CORSPlugin<TContext extends Context> implements Plugin<TContext> {
19
+ private readonly options;
20
+ constructor(options?: Partial<CORSOptions<TContext>>);
21
+ init(options: StandardHandlerOptions<TContext>): void;
22
+ }
23
+
24
+ interface ResponseHeadersPluginContext {
25
+ resHeaders?: Headers;
26
+ }
27
+ declare class ResponseHeadersPlugin<TContext extends ResponseHeadersPluginContext & Context> implements Plugin<TContext> {
28
+ init(options: StandardHandlerOptions<TContext>): void;
29
+ }
30
+
31
+ export { type CORSOptions, CORSPlugin, Plugin, ResponseHeadersPlugin, type ResponseHeadersPluginContext };
@@ -0,0 +1,31 @@
1
+ import { d as StandardHandlerInterceptorOptions, P as Plugin, a as StandardHandlerOptions } from '../shared/server.DSZ2XY8G.js';
2
+ export { C as CompositePlugin } from '../shared/server.DSZ2XY8G.js';
3
+ import { Value } from '@orpc/shared';
4
+ import { C as Context } from '../shared/server.CI7U5gRZ.js';
5
+ import '@orpc/contract';
6
+ import '@orpc/standard-server';
7
+ import '@orpc/client';
8
+
9
+ interface CORSOptions<TContext extends Context> {
10
+ origin?: Value<string | string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<TContext>]>;
11
+ timingOrigin?: Value<string | string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<TContext>]>;
12
+ allowMethods?: string[];
13
+ allowHeaders?: string[];
14
+ maxAge?: number;
15
+ credentials?: boolean;
16
+ exposeHeaders?: string[];
17
+ }
18
+ declare class CORSPlugin<TContext extends Context> implements Plugin<TContext> {
19
+ private readonly options;
20
+ constructor(options?: Partial<CORSOptions<TContext>>);
21
+ init(options: StandardHandlerOptions<TContext>): void;
22
+ }
23
+
24
+ interface ResponseHeadersPluginContext {
25
+ resHeaders?: Headers;
26
+ }
27
+ declare class ResponseHeadersPlugin<TContext extends ResponseHeadersPluginContext & Context> implements Plugin<TContext> {
28
+ init(options: StandardHandlerOptions<TContext>): void;
29
+ }
30
+
31
+ export { type CORSOptions, CORSPlugin, Plugin, ResponseHeadersPlugin, type ResponseHeadersPluginContext };
@@ -0,0 +1,103 @@
1
+ export { C as CompositePlugin } from '../shared/server.Q6ZmnTgO.mjs';
2
+ import { value } from '@orpc/shared';
3
+
4
+ class CORSPlugin {
5
+ options;
6
+ constructor(options) {
7
+ const defaults = {
8
+ origin: (origin) => origin,
9
+ allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"]
10
+ };
11
+ this.options = {
12
+ ...defaults,
13
+ ...options
14
+ };
15
+ }
16
+ init(options) {
17
+ options.rootInterceptors ??= [];
18
+ options.rootInterceptors.unshift(async (interceptorOptions) => {
19
+ if (interceptorOptions.request.method === "OPTIONS") {
20
+ const resHeaders = {};
21
+ if (this.options.maxAge !== void 0) {
22
+ resHeaders["access-control-max-age"] = this.options.maxAge.toString();
23
+ }
24
+ if (this.options.allowMethods?.length) {
25
+ resHeaders["access-control-allow-methods"] = this.options.allowMethods.join(",");
26
+ }
27
+ const allowHeaders = this.options.allowHeaders ?? interceptorOptions.request.headers["access-control-request-headers"];
28
+ if (Array.isArray(allowHeaders) && allowHeaders.length) {
29
+ resHeaders["access-control-allow-headers"] = allowHeaders.join(",");
30
+ } else if (typeof allowHeaders === "string") {
31
+ resHeaders["access-control-allow-headers"] = allowHeaders;
32
+ }
33
+ return {
34
+ matched: true,
35
+ response: {
36
+ status: 204,
37
+ headers: resHeaders,
38
+ body: void 0
39
+ }
40
+ };
41
+ }
42
+ return interceptorOptions.next();
43
+ });
44
+ options.rootInterceptors.unshift(async (interceptorOptions) => {
45
+ const result = await interceptorOptions.next();
46
+ if (!result.matched) {
47
+ return result;
48
+ }
49
+ const origin = Array.isArray(interceptorOptions.request.headers.origin) ? interceptorOptions.request.headers.origin.join(",") : interceptorOptions.request.headers.origin || "";
50
+ const allowedOrigin = await value(this.options.origin, origin, interceptorOptions);
51
+ const allowedOriginArr = Array.isArray(allowedOrigin) ? allowedOrigin : [allowedOrigin];
52
+ if (allowedOriginArr.includes("*")) {
53
+ result.response.headers["access-control-allow-origin"] = "*";
54
+ } else {
55
+ if (allowedOriginArr.includes(origin)) {
56
+ result.response.headers["access-control-allow-origin"] = origin;
57
+ }
58
+ result.response.headers.vary = interceptorOptions.request.headers.vary ?? "origin";
59
+ }
60
+ const allowedTimingOrigin = await value(this.options.timingOrigin, origin, interceptorOptions);
61
+ const allowedTimingOriginArr = Array.isArray(allowedTimingOrigin) ? allowedTimingOrigin : [allowedTimingOrigin];
62
+ if (allowedTimingOriginArr.includes("*")) {
63
+ result.response.headers["timing-allow-origin"] = "*";
64
+ } else if (allowedTimingOriginArr.includes(origin)) {
65
+ result.response.headers["timing-allow-origin"] = origin;
66
+ }
67
+ if (this.options.credentials) {
68
+ result.response.headers["access-control-allow-credentials"] = "true";
69
+ }
70
+ if (this.options.exposeHeaders?.length) {
71
+ result.response.headers["access-control-expose-headers"] = this.options.exposeHeaders.join(",");
72
+ }
73
+ return result;
74
+ });
75
+ }
76
+ }
77
+
78
+ class ResponseHeadersPlugin {
79
+ init(options) {
80
+ options.rootInterceptors ??= [];
81
+ options.rootInterceptors.push(async (interceptorOptions) => {
82
+ const headers = new Headers();
83
+ interceptorOptions.context.resHeaders = headers;
84
+ const result = await interceptorOptions.next();
85
+ if (!result.matched) {
86
+ return result;
87
+ }
88
+ const responseHeaders = result.response.headers;
89
+ for (const [key, value] of headers) {
90
+ if (Array.isArray(responseHeaders[key])) {
91
+ responseHeaders[key].push(value);
92
+ } else if (responseHeaders[key] !== void 0) {
93
+ responseHeaders[key] = [responseHeaders[key], value];
94
+ } else {
95
+ responseHeaders[key] = value;
96
+ }
97
+ }
98
+ return result;
99
+ });
100
+ }
101
+ }
102
+
103
+ export { CORSPlugin, ResponseHeadersPlugin };
@@ -0,0 +1,163 @@
1
+ import { ORPCError, toORPCError } from '@orpc/client';
2
+ import { intercept, trim, parseEmptyableJSON } from '@orpc/shared';
3
+ import { C as CompositePlugin } from './server.Q6ZmnTgO.mjs';
4
+ import { c as createProcedureClient, e as eachContractProcedure, a as convertPathToHttpPath, i as isProcedure, u as unlazy, g as getRouterChild, b as createContractedProcedure } from './server.V6zT5iYQ.mjs';
5
+ import { RPCSerializer } from '@orpc/client/standard';
6
+
7
+ class StandardHandler {
8
+ constructor(router, matcher, codec, options = {}) {
9
+ this.matcher = matcher;
10
+ this.codec = codec;
11
+ this.options = options;
12
+ this.plugin = new CompositePlugin(options.plugins);
13
+ this.plugin.init(this.options);
14
+ this.matcher.init(router);
15
+ }
16
+ plugin;
17
+ handle(request, ...[options]) {
18
+ return intercept(
19
+ this.options.rootInterceptors ?? [],
20
+ {
21
+ request,
22
+ ...options,
23
+ context: options?.context ?? {}
24
+ // context is optional only when all fields are optional so we can safely force it to have a context
25
+ },
26
+ async (interceptorOptions) => {
27
+ let isDecoding = false;
28
+ try {
29
+ return await intercept(
30
+ this.options.interceptors ?? [],
31
+ interceptorOptions,
32
+ async (interceptorOptions2) => {
33
+ const method = interceptorOptions2.request.method;
34
+ const url = interceptorOptions2.request.url;
35
+ const pathname = `/${trim(url.pathname.replace(interceptorOptions2.prefix ?? "", ""), "/")}`;
36
+ const match = await this.matcher.match(method, pathname);
37
+ if (!match) {
38
+ return { matched: false, response: void 0 };
39
+ }
40
+ const client = createProcedureClient(match.procedure, {
41
+ context: interceptorOptions2.context,
42
+ path: match.path,
43
+ interceptors: this.options.clientInterceptors
44
+ });
45
+ isDecoding = true;
46
+ const input = await this.codec.decode(request, match.params, match.procedure);
47
+ isDecoding = false;
48
+ const lastEventId = Array.isArray(request.headers["last-event-id"]) ? request.headers["last-event-id"].at(-1) : request.headers["last-event-id"];
49
+ const output = await client(input, { signal: request.signal, lastEventId });
50
+ const response = this.codec.encode(output, match.procedure);
51
+ return {
52
+ matched: true,
53
+ response
54
+ };
55
+ }
56
+ );
57
+ } catch (e) {
58
+ const error = isDecoding ? new ORPCError("BAD_REQUEST", {
59
+ message: `Malformed request. Ensure the request body is properly formatted and the 'Content-Type' header is set correctly.`,
60
+ cause: e
61
+ }) : toORPCError(e);
62
+ const response = this.codec.encodeError(error);
63
+ return {
64
+ matched: true,
65
+ response
66
+ };
67
+ }
68
+ }
69
+ );
70
+ }
71
+ }
72
+
73
+ class RPCCodec {
74
+ serializer;
75
+ constructor(options = {}) {
76
+ this.serializer = options.serializer ?? new RPCSerializer();
77
+ }
78
+ async decode(request, _params, _procedure) {
79
+ const serialized = request.method === "GET" ? parseEmptyableJSON(request.url.searchParams.getAll("data").at(-1)) : await request.body();
80
+ return this.serializer.deserialize(serialized);
81
+ }
82
+ encode(output, _procedure) {
83
+ return {
84
+ status: 200,
85
+ headers: {},
86
+ body: this.serializer.serialize(output)
87
+ };
88
+ }
89
+ encodeError(error) {
90
+ return {
91
+ status: error.status,
92
+ headers: {},
93
+ body: this.serializer.serialize(error.toJSON())
94
+ };
95
+ }
96
+ }
97
+
98
+ class RPCMatcher {
99
+ tree = {};
100
+ pendingRouters = [];
101
+ init(router, path = []) {
102
+ const laziedOptions = eachContractProcedure({
103
+ router,
104
+ path
105
+ }, ({ path: path2, contract }) => {
106
+ const httpPath = convertPathToHttpPath(path2);
107
+ if (isProcedure(contract)) {
108
+ this.tree[httpPath] = {
109
+ path: path2,
110
+ contract,
111
+ procedure: contract,
112
+ // this mean dev not used contract-first so we can used contract as procedure directly
113
+ router
114
+ };
115
+ } else {
116
+ this.tree[httpPath] = {
117
+ path: path2,
118
+ contract,
119
+ procedure: void 0,
120
+ router
121
+ };
122
+ }
123
+ });
124
+ this.pendingRouters.push(...laziedOptions.map((option) => ({
125
+ ...option,
126
+ httpPathPrefix: convertPathToHttpPath(option.path)
127
+ })));
128
+ }
129
+ async match(_method, pathname) {
130
+ if (this.pendingRouters.length) {
131
+ const newPendingRouters = [];
132
+ for (const pendingRouter of this.pendingRouters) {
133
+ if (pathname.startsWith(pendingRouter.httpPathPrefix)) {
134
+ const { default: router } = await unlazy(pendingRouter.lazied);
135
+ this.init(router, pendingRouter.path);
136
+ } else {
137
+ newPendingRouters.push(pendingRouter);
138
+ }
139
+ }
140
+ this.pendingRouters = newPendingRouters;
141
+ }
142
+ const match = this.tree[pathname];
143
+ if (!match) {
144
+ return void 0;
145
+ }
146
+ if (!match.procedure) {
147
+ const { default: maybeProcedure } = await unlazy(getRouterChild(match.router, ...match.path));
148
+ if (!isProcedure(maybeProcedure)) {
149
+ throw new Error(`
150
+ [Contract-First] Missing or invalid implementation for procedure at path: ${convertPathToHttpPath(match.path)}.
151
+ Ensure that the procedure is correctly defined and matches the expected contract.
152
+ `);
153
+ }
154
+ match.procedure = createContractedProcedure(match.contract, maybeProcedure);
155
+ }
156
+ return {
157
+ path: match.path,
158
+ procedure: match.procedure
159
+ };
160
+ }
161
+ }
162
+
163
+ export { RPCCodec as R, StandardHandler as S, RPCMatcher as a };
@@ -0,0 +1,9 @@
1
+ import { C as Context } from './server.CI7U5gRZ.js';
2
+ import { a as StandardHandlerOptions, b as StandardMatcher, c as StandardCodec } from './server.DSZ2XY8G.js';
3
+
4
+ interface RPCHandlerOptions<T extends Context> extends StandardHandlerOptions<T> {
5
+ matcher?: StandardMatcher;
6
+ codec?: StandardCodec;
7
+ }
8
+
9
+ export type { RPCHandlerOptions as R };