@orpc/server 2.0.0-beta.4 → 2.0.0-beta.41

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 (60) hide show
  1. package/README.md +97 -94
  2. package/dist/adapters/aws-lambda/index.d.mts +50 -0
  3. package/dist/adapters/aws-lambda/index.d.ts +50 -0
  4. package/dist/adapters/aws-lambda/index.mjs +39 -0
  5. package/dist/adapters/crossws/index.d.mts +21 -12
  6. package/dist/adapters/crossws/index.d.ts +21 -12
  7. package/dist/adapters/crossws/index.mjs +14 -10
  8. package/dist/adapters/fastify/index.d.mts +42 -0
  9. package/dist/adapters/fastify/index.d.ts +42 -0
  10. package/dist/adapters/fastify/index.mjs +39 -0
  11. package/dist/adapters/fetch/index.d.mts +21 -114
  12. package/dist/adapters/fetch/index.d.ts +21 -114
  13. package/dist/adapters/fetch/index.mjs +20 -182
  14. package/dist/adapters/message-port/index.d.mts +23 -20
  15. package/dist/adapters/message-port/index.d.ts +23 -20
  16. package/dist/adapters/message-port/index.mjs +31 -34
  17. package/dist/adapters/node/index.d.mts +19 -96
  18. package/dist/adapters/node/index.d.ts +19 -96
  19. package/dist/adapters/node/index.mjs +19 -157
  20. package/dist/adapters/standard/index.d.mts +91 -17
  21. package/dist/adapters/standard/index.d.ts +91 -17
  22. package/dist/adapters/standard/index.mjs +4 -4
  23. package/dist/adapters/standard-peer/index.d.mts +6 -11
  24. package/dist/adapters/standard-peer/index.d.ts +6 -11
  25. package/dist/adapters/standard-peer/index.mjs +10 -2
  26. package/dist/adapters/websocket/index.d.mts +45 -29
  27. package/dist/adapters/websocket/index.d.ts +45 -29
  28. package/dist/adapters/websocket/index.mjs +39 -28
  29. package/dist/extensions/callable.d.mts +5 -5
  30. package/dist/extensions/callable.d.ts +5 -5
  31. package/dist/extensions/callable.mjs +2 -2
  32. package/dist/helpers/index.d.mts +23 -6
  33. package/dist/helpers/index.d.ts +23 -6
  34. package/dist/helpers/index.mjs +13 -5
  35. package/dist/index.d.mts +332 -37
  36. package/dist/index.d.ts +332 -37
  37. package/dist/index.mjs +141 -65
  38. package/dist/plugins/index.d.mts +255 -31
  39. package/dist/plugins/index.d.ts +255 -31
  40. package/dist/plugins/index.mjs +559 -38
  41. package/dist/shared/server.1ExWFMze.mjs +69 -0
  42. package/dist/shared/{server.CjOb6ItT.mjs → server.AVQWL-DI.mjs} +1 -1
  43. package/dist/shared/{server.BL22TloH.d.mts → server.BEdOJs6S.d.mts} +41 -62
  44. package/dist/shared/{server.BL22TloH.d.ts → server.BEdOJs6S.d.ts} +41 -62
  45. package/dist/shared/{server.GDpX6Df8.mjs → server.BFEVk-EI.mjs} +164 -70
  46. package/dist/shared/{server.BwHnWUuN.mjs → server.BgvqVW_v.mjs} +25 -20
  47. package/dist/shared/server.BllfVJLm.d.mts +34 -0
  48. package/dist/shared/server.COfbQ0D8.d.ts +34 -0
  49. package/dist/shared/{server.DBANIheG.d.ts → server.CVO0hWyj.d.mts} +24 -13
  50. package/dist/shared/{server.BsNNjG5J.d.mts → server.DD1roZl9.d.mts} +32 -20
  51. package/dist/shared/server.DFEuNUt4.d.ts +14 -0
  52. package/dist/shared/{server.DJIkub_t.d.mts → server.DJNkZPfD.d.ts} +24 -13
  53. package/dist/shared/{server.Pa0F03f_.d.ts → server.DZeVx8K9.d.ts} +32 -20
  54. package/dist/shared/{server.CrlKQucM.mjs → server.FEqy7Hrj.mjs} +25 -53
  55. package/dist/shared/server.UG_xdTub.d.mts +14 -0
  56. package/package.json +48 -14
  57. package/dist/shared/server.CX4vUnDk.mjs +0 -11
  58. package/dist/shared/server.Cj5lgPuG.d.mts +0 -66
  59. package/dist/shared/server.D_QauotT.mjs +0 -30
  60. package/dist/shared/server.d_2NS3g5.d.ts +0 -66
package/dist/index.mjs CHANGED
@@ -1,15 +1,15 @@
1
1
  import { mergeErrorMap, resolveMetaPlugins, getHiddenMetaPlugins, ProcedureContract } from '@orpc/contract';
2
- export { ValidationError, defineMeta, eventIterator, reconcileORPCError, type } from '@orpc/contract';
3
- import { toArray, bindMethods, getOrBind, isTypescriptObject, resolveMaybeOptionalOptions } from '@orpc/shared';
4
- export { AsyncIteratorClass, asyncIteratorToStream as eventIteratorToStream, asyncIteratorToUnproxiedDataStream as eventIteratorToUnproxiedDataStream, onError, onFinish, onStart, onSuccess, streamToAsyncIteratorClass as streamToEventIterator } from '@orpc/shared';
5
- import { L as Lazy, P as Procedure, c as createProcedureClient } from './shared/server.CrlKQucM.mjs';
6
- export { a as createORPCErrorConstructorMap, u as unlazy } from './shared/server.CrlKQucM.mjs';
7
- import { D as DecoratedProcedure } from './shared/server.CjOb6ItT.mjs';
8
- import { b as augmentRouter, d as augmentImplementedRouter, e as withHiddenRouterContract, f as createGuardedProcedureLazy, g as getRouter } from './shared/server.BwHnWUuN.mjs';
9
- export { a as DEFAULT_ERROR_STATUS, D as DEFAULT_SUCCESS_STATUS, h as call, c as createContractProcedure, i as getHiddenRouterContract, u as unlazyRouter, j as walkProcedureContractsAsync, w as walkProcedureContractsSync } from './shared/server.BwHnWUuN.mjs';
2
+ export { ValidationError, asyncIteratorObject, defineMeta, error, eventIterator, reconcileORPCError, type } from '@orpc/contract';
3
+ import { toArray, bindMethods, isTypescriptObject, resolveMaybeOptionalOptions } from '@orpc/shared';
4
+ export { AsyncIteratorClass, asyncIteratorToStream, asyncIteratorToUnproxiedDataStream, asyncIteratorToStream as eventIteratorToStream, asyncIteratorToUnproxiedDataStream as eventIteratorToUnproxiedDataStream, onAsyncIteratorObjectError, onError, onFinish, onReadableStreamError, onStart, onSuccess, streamToAsyncIteratorObject, streamToAsyncIteratorObject as streamToEventIterator } from '@orpc/shared';
5
+ import { L as Lazy, P as Procedure, c as createProcedureClient } from './shared/server.FEqy7Hrj.mjs';
6
+ export { u as unlazy } from './shared/server.FEqy7Hrj.mjs';
7
+ import { D as DecoratedProcedure } from './shared/server.AVQWL-DI.mjs';
8
+ import { b as augmentRouter, d as augmentImplementedRouter, e as withHiddenRouterContract, f as createGuardedProcedureLazy, g as getRouter } from './shared/server.BgvqVW_v.mjs';
9
+ export { a as DEFAULT_ERROR_STATUS, D as DEFAULT_SUCCESS_STATUS, h as call, c as createContractProcedure, i as getHiddenRouterContract, u as unlazyRouter, j as walkProcedureContractsAsync, w as walkProcedureContractsSync } from './shared/server.BgvqVW_v.mjs';
10
10
  import { RECURSIVE_CLIENT_UNWRAP_KEYS } from '@orpc/client';
11
- export { COMMON_ERROR_STATUS_MAP, ORPCError, RPCJsonSerializer, RPCSerializer, cloneORPCError, isDefinedError, isInferableError, safe, toORPCError } from '@orpc/client';
12
- export { ErrorEvent, getEventMeta, unwrapEvent, withEventMeta } from '@standardserver/core';
11
+ export { COMMON_ERROR_STATUS_MAP, ORPCError, RPCJsonSerializer, RPCSerializer, cloneORPCError, isDefinedError, safe, toORPCError } from '@orpc/client';
12
+ export { ErrorEvent, getEventMeta, unwrapEvent, withEventMeta } from '@standard-server/core';
13
13
 
14
14
  function decorateMiddleware(middleware) {
15
15
  const decorated = ((...args) => middleware(...args));
@@ -23,9 +23,9 @@ function decorateMiddleware(middleware) {
23
23
  return middleware(opts, adapt(input), ...args);
24
24
  }
25
25
  );
26
- mapped["~orpc"] = middleware["~orpc"];
26
+ mapped["~orpc"] = decorated["~orpc"];
27
27
  Object.defineProperty(mapped, "name", {
28
- value: middleware.name
28
+ value: decorated.name
29
29
  });
30
30
  return mapped;
31
31
  };
@@ -72,12 +72,12 @@ function decorateMiddleware(middleware) {
72
72
  ...decorated["~orpc"],
73
73
  errorMap: mergeErrorMap(usedMiddleware["~orpc"]?.errorMap, decorated["~orpc"]?.errorMap),
74
74
  metaPlugins: [
75
- ...toArray(middleware["~orpc"]?.metaPlugins),
75
+ ...toArray(decorated["~orpc"]?.metaPlugins),
76
76
  ...toArray(usedMiddleware["~orpc"]?.metaPlugins)
77
77
  ]
78
78
  };
79
79
  Object.defineProperty(merged, "name", {
80
- value: `${middleware.name} + ${usedMiddleware.name}`
80
+ value: `${decorated.name} + ${usedMiddleware.name}`
81
81
  });
82
82
  return merged;
83
83
  };
@@ -86,9 +86,19 @@ function decorateMiddleware(middleware) {
86
86
 
87
87
  class Builder {
88
88
  "~orpc";
89
+ /**
90
+ * Private constructor to prevent direct instantiation.
91
+ * Use the static `create` method to initialize a new instance with a safe initial definition.
92
+ */
89
93
  constructor(definition) {
90
94
  this["~orpc"] = definition;
91
95
  }
96
+ /**
97
+ * Creates a fresh builder with an empty definition.
98
+ * Prefer the exported `os` instance over calling this directly.
99
+ *
100
+ * @see {@link https://orpc.dev/docs/procedure | Procedure}
101
+ */
92
102
  static create() {
93
103
  return new Builder({
94
104
  errorMap: {},
@@ -96,9 +106,32 @@ class Builder {
96
106
  orderedMiddlewares: []
97
107
  });
98
108
  }
109
+ /**
110
+ * Declares the initial context type that must be provided when executing
111
+ * procedures built from this builder.
112
+ *
113
+ * @see {@link https://orpc.dev/docs/context#initial-context | Context - Initial Context}
114
+ */
99
115
  $context() {
100
116
  return this;
101
117
  }
118
+ /**
119
+ * Overrides the procedure configuration, such as disabling runtime
120
+ * input/output validation.
121
+ *
122
+ * @see {@link https://orpc.dev/docs/recipes/validation-customization | Validation Customization}
123
+ */
124
+ $config(config) {
125
+ return new Builder({
126
+ ...this["~orpc"],
127
+ ...config
128
+ });
129
+ }
130
+ /**
131
+ * Applies metadata plugins to procedures built from this builder.
132
+ *
133
+ * @see {@link https://orpc.dev/docs/metadata | Metadata}
134
+ */
102
135
  meta(...plugins) {
103
136
  const [meta, metaPlugins] = resolveMetaPlugins(
104
137
  this["~orpc"].meta,
@@ -111,6 +144,12 @@ class Builder {
111
144
  metaPlugins
112
145
  });
113
146
  }
147
+ /**
148
+ * Defines typesafe errors that procedures built from this builder can throw
149
+ * via the `errors` utility in handlers and middleware.
150
+ *
151
+ * @see {@link https://orpc.dev/docs/error-handling#typesafe-errors | Error Handling - Typesafe Errors}
152
+ */
114
153
  errors(errors) {
115
154
  let builder = new Builder({
116
155
  ...this["~orpc"],
@@ -122,6 +161,12 @@ class Builder {
122
161
  }
123
162
  return builder;
124
163
  }
164
+ /**
165
+ * Applies a middleware that runs before the handler of every procedure
166
+ * built from this builder.
167
+ *
168
+ * @see {@link https://orpc.dev/docs/middleware | Middleware}
169
+ */
125
170
  use(middleware) {
126
171
  let builder = new Builder({
127
172
  ...this["~orpc"],
@@ -137,6 +182,12 @@ class Builder {
137
182
  }
138
183
  return builder;
139
184
  }
185
+ /**
186
+ * Creates a standalone middleware that can be composed and applied to any
187
+ * compatible builder or procedure with `.use`.
188
+ *
189
+ * @see {@link https://orpc.dev/docs/middleware | Middleware}
190
+ */
140
191
  middleware(middleware) {
141
192
  const allMiddlewares = [
142
193
  ...this["~orpc"].orderedMiddlewares.map(({ middleware: middleware2 }) => middleware2),
@@ -156,6 +207,11 @@ class Builder {
156
207
  };
157
208
  return current;
158
209
  }
210
+ /**
211
+ * Defines the input schema used to validate and type the procedure input.
212
+ *
213
+ * @see {@link https://orpc.dev/docs/procedure#inputoutput-validation | Procedure - Input/Output Validation}
214
+ */
159
215
  input(schema) {
160
216
  let builder = new Builder({
161
217
  ...this["~orpc"],
@@ -167,6 +223,11 @@ class Builder {
167
223
  }
168
224
  return builder;
169
225
  }
226
+ /**
227
+ * Defines the output schema used to validate and type the procedure output.
228
+ *
229
+ * @see {@link https://orpc.dev/docs/procedure#inputoutput-validation | Procedure - Input/Output Validation}
230
+ */
170
231
  output(schema) {
171
232
  let builder = new Builder({
172
233
  ...this["~orpc"],
@@ -178,6 +239,12 @@ class Builder {
178
239
  }
179
240
  return builder;
180
241
  }
242
+ /**
243
+ * Defines the function that implements the procedure and completes the
244
+ * chain, returning a callable procedure.
245
+ *
246
+ * @see {@link https://orpc.dev/docs/procedure | Procedure}
247
+ */
181
248
  handler(handler) {
182
249
  let procedure = new DecoratedProcedure({
183
250
  ...this["~orpc"],
@@ -189,14 +256,24 @@ class Builder {
189
256
  }
190
257
  return procedure;
191
258
  }
259
+ /**
260
+ * Applies the builder's middleware, errors, and metadata to every procedure
261
+ * in the given router.
262
+ *
263
+ * @see {@link https://orpc.dev/docs/router#extending-router | Router - Extending Router}
264
+ */
192
265
  router(router) {
193
266
  return augmentRouter(router, {
194
- middlewares: this["~orpc"].orderedMiddlewares.map(({ middleware }) => middleware),
195
- meta: this["~orpc"].meta,
196
- metaPlugins: this["~orpc"].metaPlugins,
197
- errorMap: this["~orpc"].errorMap
267
+ ...this["~orpc"],
268
+ middlewares: this["~orpc"].orderedMiddlewares.map(({ middleware }) => middleware)
198
269
  });
199
270
  }
271
+ /**
272
+ * Like `.router`, but loads the router lazily on first access, which helps
273
+ * reduce startup time for large applications.
274
+ *
275
+ * @see {@link https://orpc.dev/docs/router#lazy-router | Router - Lazy Router}
276
+ */
200
277
  lazy(loader) {
201
278
  return new Lazy({
202
279
  loader: async () => {
@@ -230,15 +307,7 @@ class ProcedureImplementer {
230
307
  "handler"(handler) {
231
308
  return new ImplementedProcedure({
232
309
  ...this["~orpc"],
233
- handler,
234
- /**
235
- * When enabled, errors returned (not thrown) by the handler are passed through as-is,
236
- * rather than being transformed into inferrable errors.
237
- *
238
- * This is intended for the contract-first approach, where the procedure adheres to an
239
- * external contract and returned errors should not affect the inferred contract types.
240
- */
241
- opaqueReturnedErrors: true
310
+ handler
242
311
  });
243
312
  }
244
313
  }
@@ -256,15 +325,20 @@ class ImplementedProcedure extends Procedure {
256
325
  }
257
326
 
258
327
  class SharedRouterImplementer {
259
- constructor(contract, middlewares) {
328
+ constructor(contract, config, middlewares) {
260
329
  this.contract = contract;
330
+ this.config = config;
261
331
  this.middlewares = middlewares;
262
332
  }
263
- static create(contract, middlewares = []) {
264
- return new SharedRouterImplementer(contract, middlewares);
333
+ static create(contract, config, middlewares = []) {
334
+ return new SharedRouterImplementer(
335
+ contract,
336
+ config,
337
+ middlewares
338
+ );
265
339
  }
266
340
  use(middleware) {
267
- return createRouterImplementerInternal(this.contract, [...this.middlewares, middleware]);
341
+ return createRouterImplementerInternal(this.contract, this.config, [...this.middlewares, middleware]);
268
342
  }
269
343
  middleware(middleware) {
270
344
  const allMiddlewares = [
@@ -280,49 +354,44 @@ class SharedRouterImplementer {
280
354
  router(router) {
281
355
  if (this.middlewares.length) {
282
356
  router = augmentImplementedRouter(router, {
357
+ ...this.config,
283
358
  middlewares: this.middlewares
284
359
  });
285
360
  }
286
361
  return withHiddenRouterContract(router, this.contract);
287
362
  }
288
363
  lazy(loader) {
289
- if (this.middlewares.length) {
290
- const originalLoader = loader;
291
- loader = async () => {
292
- const { default: router } = await originalLoader();
293
- return {
294
- default: augmentImplementedRouter(router, {
295
- middlewares: this.middlewares
296
- })
297
- };
298
- };
299
- }
300
- return new Lazy({ loader, meta: {} });
364
+ return new Lazy({
365
+ loader: async () => {
366
+ const { default: router } = await loader();
367
+ return { default: this.router(router) };
368
+ },
369
+ meta: {}
370
+ });
301
371
  }
302
372
  }
303
- function createRouterImplementer(contract) {
304
- return createRouterImplementerInternal(contract, []);
373
+ function createRouterImplementer(contract, config) {
374
+ return createRouterImplementerInternal(contract, config, []);
305
375
  }
306
- function createRouterImplementerInternal(contract, middlewares) {
376
+ function createRouterImplementerInternal(contract, config, middlewares) {
307
377
  if (contract instanceof ProcedureContract) {
308
378
  return new ProcedureImplementer({
379
+ ...config,
309
380
  ...contract["~orpc"],
310
381
  orderedMiddlewares: middlewares.map((middleware) => ({ middleware }))
311
382
  });
312
383
  }
313
384
  const implementer = {};
314
- for (const key in contract) {
315
- const child = contract[key];
316
- implementer[key] = createRouterImplementerInternal(child, middlewares);
385
+ for (const [key, child] of Object.entries(contract)) {
386
+ implementer[key] = createRouterImplementerInternal(child, config, middlewares);
317
387
  }
318
- const shared = bindMethods(SharedRouterImplementer.create(contract, middlewares));
319
- for (const key in shared) {
320
- const method = shared[key];
388
+ const shared = bindMethods(SharedRouterImplementer.create(contract, config, middlewares));
389
+ for (const [key, method] of Object.entries(shared)) {
321
390
  if (key in implementer) {
322
391
  const child = implementer[key];
323
392
  implementer[key] = new Proxy(method, {
324
393
  get(_, p) {
325
- return getOrBind(child, p);
394
+ return Reflect.get(child, p);
326
395
  }
327
396
  });
328
397
  } else {
@@ -332,22 +401,24 @@ function createRouterImplementerInternal(contract, middlewares) {
332
401
  return implementer;
333
402
  }
334
403
 
335
- function implement(contract) {
336
- const routerImplementer = createRouterImplementer(contract);
404
+ function implement(contract, config = {}) {
405
+ const routerImplementer = createRouterImplementer(contract, config);
337
406
  const implementer = new Proxy(routerImplementer, {
338
407
  get(_, p) {
339
408
  let method;
340
409
  if (p === "$context") {
341
410
  method = () => implementer;
411
+ } else if (p === "$config") {
412
+ method = (incoming) => implement(contract, { ...config, ...incoming });
342
413
  }
343
- const value = getOrBind(routerImplementer, p);
414
+ const value = Reflect.get(routerImplementer, p);
344
415
  if (method) {
345
416
  if (!isTypescriptObject(value)) {
346
417
  return method;
347
418
  }
348
419
  return new Proxy(method, {
349
420
  get(_2, p2) {
350
- return getOrBind(value, p2);
421
+ return Reflect.get(value, p2);
351
422
  }
352
423
  });
353
424
  }
@@ -363,19 +434,24 @@ function createRouterClient(router, ...rest) {
363
434
  return createProcedureClient(router, options);
364
435
  }
365
436
  const procedureCaller = router instanceof Lazy ? createProcedureClient(createGuardedProcedureLazy(router), options) : {};
437
+ const cache = /* @__PURE__ */ new Map();
366
438
  const recursive = new Proxy(procedureCaller, {
367
439
  get(target, key) {
368
440
  if (typeof key !== "string" || router instanceof Lazy && RECURSIVE_CLIENT_UNWRAP_KEYS.has(key)) {
369
- return getOrBind(target, key);
441
+ return Reflect.get(target, key);
370
442
  }
371
- const next = getRouter(router, [key]);
372
- if (!next) {
373
- return getOrBind(target, key);
443
+ let nextClient = cache.get(key);
444
+ if (nextClient === void 0) {
445
+ const next = getRouter(router, [key]);
446
+ if (!next) {
447
+ return Reflect.get(target, key);
448
+ }
449
+ nextClient = createRouterClient(next, {
450
+ ...options,
451
+ path: [...toArray(options.path), key]
452
+ });
453
+ cache.set(key, nextClient);
374
454
  }
375
- const nextClient = createRouterClient(next, {
376
- ...options,
377
- path: [...toArray(options.path), key]
378
- });
379
455
  return nextClient;
380
456
  }
381
457
  });