@temporary-name/server 1.9.3-alpha.0d2fa3247b6b23bbc2e3097a95f631b86740e4d8

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/dist/index.mjs ADDED
@@ -0,0 +1,618 @@
1
+ import { isContractProcedure, mergeErrorMap, mergeMeta, mergeRoute, mergePrefix, enhanceRoute, mergeTags, getContractRouter } from '@temporary-name/contract';
2
+ export { ValidationError, eventIterator, type, validateORPCError } from '@temporary-name/contract';
3
+ import { onError, resolveMaybeOptionalOptions } from '@temporary-name/shared';
4
+ export { AsyncIteratorClass, EventPublisher, ORPCError, asyncIteratorToStream as eventIteratorToStream, isDefinedError, onError, onFinish, onStart, onSuccess, safe, streamToAsyncIteratorClass as streamToEventIterator } from '@temporary-name/shared';
5
+ import { g as gatingContext } from './shared/server.D6K9uoPI.mjs';
6
+ import { c as createProcedureClient, i as isLazy, g as getLazyMeta, l as lazy, u as unlazy } from './shared/server.BEQrAa3A.mjs';
7
+ export { L as LAZY_SYMBOL, a as createORPCErrorConstructorMap, m as mergeCurrentContext, b as middlewareOutputFn } from './shared/server.BEQrAa3A.mjs';
8
+ export { getEventMeta, withEventMeta } from '@temporary-name/standard-server';
9
+ import 'node:async_hooks';
10
+ import 'zod';
11
+ import 'zod/v4/core';
12
+
13
+ function decorateMiddleware(middleware) {
14
+ const decorated = ((...args) => middleware(...args));
15
+ decorated.mapInput = (mapInput) => {
16
+ const mapped = decorateMiddleware(
17
+ (options, input, ...rest) => middleware(options, mapInput(input), ...rest)
18
+ );
19
+ return mapped;
20
+ };
21
+ decorated.concat = (concatMiddleware, mapInput) => {
22
+ const mapped = mapInput ? decorateMiddleware(concatMiddleware).mapInput(mapInput) : concatMiddleware;
23
+ const concatted = decorateMiddleware((options, input, output, ...rest) => {
24
+ const merged = middleware(
25
+ {
26
+ ...options,
27
+ next: (...[nextOptions1]) => mapped(
28
+ {
29
+ ...options,
30
+ context: { ...options.context, ...nextOptions1?.context },
31
+ next: (...[nextOptions2]) => options.next({ context: { ...nextOptions1?.context, ...nextOptions2?.context } })
32
+ },
33
+ input,
34
+ output,
35
+ ...rest
36
+ )
37
+ },
38
+ input,
39
+ output,
40
+ ...rest
41
+ );
42
+ return merged;
43
+ });
44
+ return concatted;
45
+ };
46
+ return decorated;
47
+ }
48
+
49
+ function isStartWithMiddlewares(middlewares, compare) {
50
+ if (compare.length > middlewares.length) {
51
+ return false;
52
+ }
53
+ for (let i = 0; i < middlewares.length; i++) {
54
+ if (compare[i] === void 0) {
55
+ return true;
56
+ }
57
+ if (middlewares[i] !== compare[i]) {
58
+ return false;
59
+ }
60
+ }
61
+ return true;
62
+ }
63
+ function mergeMiddlewares(first, second, options) {
64
+ if (options.dedupeLeading && isStartWithMiddlewares(second, first)) {
65
+ return second;
66
+ }
67
+ return [...first, ...second];
68
+ }
69
+ function addMiddleware(middlewares, addition) {
70
+ return [...middlewares, addition];
71
+ }
72
+
73
+ class Procedure {
74
+ /**
75
+ * This property holds the defined options.
76
+ */
77
+ "~orpc";
78
+ constructor(def) {
79
+ this["~orpc"] = def;
80
+ }
81
+ }
82
+ function isProcedure(item) {
83
+ if (item instanceof Procedure) {
84
+ return true;
85
+ }
86
+ return isContractProcedure(item) && "middlewares" in item["~orpc"] && "inputValidationIndex" in item["~orpc"] && "outputValidationIndex" in item["~orpc"] && "handler" in item["~orpc"];
87
+ }
88
+
89
+ class DecoratedProcedure extends Procedure {
90
+ /**
91
+ * Adds type-safe custom errors.
92
+ * The provided errors are spared-merged with any existing errors.
93
+ *
94
+ * @see {@link https://orpc.unnoq.com/docs/error-handling#type%E2%80%90safe-error-handling Type-Safe Error Handling Docs}
95
+ */
96
+ errors(errors) {
97
+ return new DecoratedProcedure({
98
+ ...this["~orpc"],
99
+ errorMap: mergeErrorMap(this["~orpc"].errorMap, errors)
100
+ });
101
+ }
102
+ /**
103
+ * Sets or updates the metadata.
104
+ * The provided metadata is spared-merged with any existing metadata.
105
+ *
106
+ * @see {@link https://orpc.unnoq.com/docs/metadata Metadata Docs}
107
+ */
108
+ meta(meta) {
109
+ return new DecoratedProcedure({
110
+ ...this["~orpc"],
111
+ meta: mergeMeta(this["~orpc"].meta, meta)
112
+ });
113
+ }
114
+ /**
115
+ * Sets or updates the route definition.
116
+ * The provided route is spared-merged with any existing route.
117
+ * This option is typically relevant when integrating with OpenAPI.
118
+ *
119
+ * @see {@link https://orpc.unnoq.com/docs/openapi/routing OpenAPI Routing Docs}
120
+ * @see {@link https://orpc.unnoq.com/docs/openapi/input-output-structure OpenAPI Input/Output Structure Docs}
121
+ */
122
+ route(route) {
123
+ return new DecoratedProcedure({
124
+ ...this["~orpc"],
125
+ route: mergeRoute(this["~orpc"].route, route)
126
+ });
127
+ }
128
+ use(middleware, mapInput) {
129
+ const mapped = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
130
+ return new DecoratedProcedure({
131
+ ...this["~orpc"],
132
+ middlewares: addMiddleware(this["~orpc"].middlewares, mapped)
133
+ });
134
+ }
135
+ /**
136
+ * Make this procedure callable (works like a function while still being a procedure).
137
+ *
138
+ * @see {@link https://orpc.unnoq.com/docs/client/server-side Server-side Client Docs}
139
+ */
140
+ callable(...rest) {
141
+ const client = createProcedureClient(this, ...rest);
142
+ return new Proxy(client, {
143
+ get: (target, key) => {
144
+ return Reflect.has(this, key) ? Reflect.get(this, key) : Reflect.get(target, key);
145
+ },
146
+ has: (target, key) => {
147
+ return Reflect.has(this, key) || Reflect.has(target, key);
148
+ }
149
+ });
150
+ }
151
+ }
152
+
153
+ const HIDDEN_ROUTER_CONTRACT_SYMBOL = Symbol("ORPC_HIDDEN_ROUTER_CONTRACT");
154
+ function setHiddenRouterContract(router, contract) {
155
+ return new Proxy(router, {
156
+ get(target, key) {
157
+ if (key === HIDDEN_ROUTER_CONTRACT_SYMBOL) {
158
+ return contract;
159
+ }
160
+ return Reflect.get(target, key);
161
+ }
162
+ });
163
+ }
164
+ function getHiddenRouterContract(router) {
165
+ return router[HIDDEN_ROUTER_CONTRACT_SYMBOL];
166
+ }
167
+
168
+ function getRouter(router, path) {
169
+ let current = router;
170
+ for (let i = 0; i < path.length; i++) {
171
+ const segment = path[i];
172
+ if (!current) {
173
+ return void 0;
174
+ }
175
+ if (isProcedure(current)) {
176
+ return void 0;
177
+ }
178
+ if (!isLazy(current)) {
179
+ current = current[segment];
180
+ continue;
181
+ }
182
+ const lazied = current;
183
+ const rest = path.slice(i);
184
+ return lazy(async () => {
185
+ const unwrapped = await unlazy(lazied);
186
+ const next = getRouter(unwrapped.default, rest);
187
+ return unlazy(next);
188
+ }, getLazyMeta(lazied));
189
+ }
190
+ return current;
191
+ }
192
+ function createAccessibleLazyRouter(lazied) {
193
+ const recursive = new Proxy(lazied, {
194
+ get(target, key) {
195
+ if (typeof key !== "string") {
196
+ return Reflect.get(target, key);
197
+ }
198
+ const next = getRouter(lazied, [key]);
199
+ return createAccessibleLazyRouter(next);
200
+ }
201
+ });
202
+ return recursive;
203
+ }
204
+ function enhanceRouter(router, options) {
205
+ if (isLazy(router)) {
206
+ const laziedMeta = getLazyMeta(router);
207
+ const enhancedPrefix = laziedMeta?.prefix ? mergePrefix(options.prefix, laziedMeta?.prefix) : options.prefix;
208
+ const enhanced2 = lazy(
209
+ async () => {
210
+ const { default: unlaziedRouter } = await unlazy(router);
211
+ const enhanced3 = enhanceRouter(unlaziedRouter, options);
212
+ return unlazy(enhanced3);
213
+ },
214
+ {
215
+ ...laziedMeta,
216
+ prefix: enhancedPrefix
217
+ }
218
+ );
219
+ const accessible = createAccessibleLazyRouter(enhanced2);
220
+ return accessible;
221
+ }
222
+ if (isProcedure(router)) {
223
+ const newMiddlewares = mergeMiddlewares(options.middlewares, router["~orpc"].middlewares, {
224
+ dedupeLeading: options.dedupeLeadingMiddlewares
225
+ });
226
+ const newMiddlewareAdded = newMiddlewares.length - router["~orpc"].middlewares.length;
227
+ const enhanced2 = new Procedure({
228
+ ...router["~orpc"],
229
+ route: enhanceRoute(router["~orpc"].route, options),
230
+ errorMap: mergeErrorMap(options.errorMap, router["~orpc"].errorMap),
231
+ middlewares: newMiddlewares,
232
+ inputValidationIndex: router["~orpc"].inputValidationIndex + newMiddlewareAdded,
233
+ outputValidationIndex: router["~orpc"].outputValidationIndex + newMiddlewareAdded
234
+ });
235
+ return enhanced2;
236
+ }
237
+ const enhanced = {};
238
+ for (const key in router) {
239
+ enhanced[key] = enhanceRouter(router[key], options);
240
+ }
241
+ return enhanced;
242
+ }
243
+ function traverseContractProcedures(options, callback, lazyOptions = []) {
244
+ let currentRouter = options.router;
245
+ const hiddenContract = getHiddenRouterContract(options.router);
246
+ if (hiddenContract !== void 0) {
247
+ currentRouter = hiddenContract;
248
+ }
249
+ if (isLazy(currentRouter)) {
250
+ lazyOptions.push({
251
+ router: currentRouter,
252
+ path: options.path
253
+ });
254
+ } else if (isContractProcedure(currentRouter)) {
255
+ callback({
256
+ contract: currentRouter,
257
+ path: options.path
258
+ });
259
+ } else {
260
+ for (const key in currentRouter) {
261
+ traverseContractProcedures(
262
+ {
263
+ router: currentRouter[key],
264
+ path: [...options.path, key]
265
+ },
266
+ callback,
267
+ lazyOptions
268
+ );
269
+ }
270
+ }
271
+ return lazyOptions;
272
+ }
273
+ async function resolveContractProcedures(options, callback) {
274
+ const pending = [options];
275
+ for (const options2 of pending) {
276
+ const lazyOptions = traverseContractProcedures(options2, callback);
277
+ for (const options3 of lazyOptions) {
278
+ const { default: router } = await unlazy(options3.router);
279
+ pending.push({
280
+ router,
281
+ path: options3.path
282
+ });
283
+ }
284
+ }
285
+ }
286
+ async function unlazyRouter(router) {
287
+ if (isProcedure(router)) {
288
+ return router;
289
+ }
290
+ const unlazied = {};
291
+ for (const key in router) {
292
+ const item = router[key];
293
+ const { default: unlaziedRouter } = await unlazy(item);
294
+ unlazied[key] = await unlazyRouter(unlaziedRouter);
295
+ }
296
+ return unlazied;
297
+ }
298
+
299
+ class Builder {
300
+ /**
301
+ * This property holds the defined options.
302
+ */
303
+ "~orpc";
304
+ constructor(def) {
305
+ this["~orpc"] = def;
306
+ }
307
+ /**
308
+ * Set or override the initial context.
309
+ *
310
+ * @see {@link https://orpc.unnoq.com/docs/context Context Docs}
311
+ */
312
+ $context() {
313
+ return this;
314
+ }
315
+ /**
316
+ * Creates a middleware.
317
+ *
318
+ * @see {@link https://orpc.unnoq.com/docs/middleware Middleware Docs}
319
+ */
320
+ middleware(middleware) {
321
+ return decorateMiddleware(middleware);
322
+ }
323
+ /**
324
+ * Adds type-safe custom errors.
325
+ * The provided errors are spared-merged with any existing errors.
326
+ *
327
+ * @see {@link https://orpc.unnoq.com/docs/error-handling#type%E2%80%90safe-error-handling Type-Safe Error Handling Docs}
328
+ */
329
+ errors(errors) {
330
+ return new Builder({
331
+ ...this["~orpc"],
332
+ errorMap: mergeErrorMap(this["~orpc"].errorMap, errors)
333
+ });
334
+ }
335
+ /**
336
+ * Uses a middleware to modify the context or improve the pipeline.
337
+ *
338
+ * @info Supports both normal middleware and inline middleware implementations.
339
+ * @note The current context must be satisfy middleware dependent-context
340
+ * @see {@link https://orpc.unnoq.com/docs/middleware Middleware Docs}
341
+ */
342
+ use(middleware) {
343
+ return new Builder({
344
+ ...this["~orpc"],
345
+ middlewares: addMiddleware(this["~orpc"].middlewares, middleware)
346
+ });
347
+ }
348
+ useGating(gates, isGateEnabled) {
349
+ return this.use(({ next, context }) => {
350
+ return gatingContext.run(
351
+ (gate) => isGateEnabled(gate, context),
352
+ () => next({ context: { isGateEnabled } })
353
+ );
354
+ });
355
+ }
356
+ /**
357
+ * Sets or updates the metadata.
358
+ * The provided metadata is spared-merged with any existing metadata.
359
+ *
360
+ * @see {@link https://orpc.unnoq.com/docs/metadata Metadata Docs}
361
+ */
362
+ meta(meta) {
363
+ return new Builder({
364
+ ...this["~orpc"],
365
+ meta: mergeMeta(this["~orpc"].meta, meta)
366
+ });
367
+ }
368
+ /**
369
+ * Sets or updates the route definition.
370
+ * The provided route is spared-merged with any existing route.
371
+ * This option is typically relevant when integrating with OpenAPI.
372
+ *
373
+ * @see {@link https://orpc.unnoq.com/docs/openapi/routing OpenAPI Routing Docs}
374
+ * @see {@link https://orpc.unnoq.com/docs/openapi/input-output-structure OpenAPI Input/Output Structure Docs}
375
+ */
376
+ route(route) {
377
+ return new Builder({
378
+ ...this["~orpc"],
379
+ route: mergeRoute(this["~orpc"].route, route)
380
+ });
381
+ }
382
+ /**
383
+ * Defines the input validation schema.
384
+ *
385
+ * @see {@link https://orpc.unnoq.com/docs/procedure#input-output-validation Input Validation Docs}
386
+ */
387
+ input(schema) {
388
+ return new Builder({
389
+ ...this["~orpc"],
390
+ inputSchema: schema,
391
+ inputValidationIndex: this["~orpc"].middlewares.length
392
+ });
393
+ }
394
+ /**
395
+ * Defines the output validation schema.
396
+ *
397
+ * @see {@link https://orpc.unnoq.com/docs/procedure#input-output-validation Output Validation Docs}
398
+ */
399
+ output(schema) {
400
+ return new Builder({
401
+ ...this["~orpc"],
402
+ outputSchema: schema,
403
+ outputValidationIndex: this["~orpc"].middlewares.length
404
+ });
405
+ }
406
+ /**
407
+ * Defines the handler of the procedure.
408
+ *
409
+ * @see {@link https://orpc.unnoq.com/docs/procedure Procedure Docs}
410
+ */
411
+ handler(handler) {
412
+ return new DecoratedProcedure({
413
+ ...this["~orpc"],
414
+ handler
415
+ });
416
+ }
417
+ /**
418
+ * Prefixes all procedures in the router.
419
+ * The provided prefix is post-appended to any existing router prefix.
420
+ *
421
+ * @note This option does not affect procedures that do not define a path in their route definition.
422
+ *
423
+ * @see {@link https://orpc.unnoq.com/docs/openapi/routing#route-prefixes OpenAPI Route Prefixes Docs}
424
+ */
425
+ prefix(prefix) {
426
+ return new Builder({
427
+ ...this["~orpc"],
428
+ prefix: mergePrefix(this["~orpc"].prefix, prefix)
429
+ });
430
+ }
431
+ /**
432
+ * Adds tags to all procedures in the router.
433
+ * This helpful when you want to group procedures together in the OpenAPI specification.
434
+ *
435
+ * @see {@link https://orpc.unnoq.com/docs/openapi/openapi-specification#operation-metadata OpenAPI Operation Metadata Docs}
436
+ */
437
+ tag(...tags) {
438
+ return new Builder({
439
+ ...this["~orpc"],
440
+ tags: mergeTags(this["~orpc"].tags, tags)
441
+ });
442
+ }
443
+ /**
444
+ * Applies all of the previously defined options to the specified router.
445
+ *
446
+ * @see {@link https://orpc.unnoq.com/docs/router#extending-router Extending Router Docs}
447
+ */
448
+ router(router) {
449
+ return enhanceRouter(router, this["~orpc"]);
450
+ }
451
+ /**
452
+ * Create a lazy router
453
+ * And applies all of the previously defined options to the specified router.
454
+ *
455
+ * @see {@link https://orpc.unnoq.com/docs/router#extending-router Extending Router Docs}
456
+ */
457
+ lazyRoute(loader) {
458
+ return enhanceRouter(lazy(loader), this["~orpc"]);
459
+ }
460
+ }
461
+ function createApiBuilder(opts = {}) {
462
+ const base = new Builder({
463
+ route: {},
464
+ meta: opts.meta ?? {},
465
+ errorMap: {},
466
+ inputValidationIndex: 0,
467
+ outputValidationIndex: 0,
468
+ middlewares: [
469
+ onError((error, options) => {
470
+ console.dir(error, { depth: null });
471
+ })
472
+ ],
473
+ // NB: this is a relic from orpc -- I'm not convinced there's a need for this (or if there is, that it's
474
+ // the best solution). For now I've removed the interface to configure it externally.
475
+ dedupeLeadingMiddlewares: true
476
+ });
477
+ return base;
478
+ }
479
+ const os = createApiBuilder();
480
+
481
+ function implementerInternal(contract, middlewares) {
482
+ if (isContractProcedure(contract)) {
483
+ const impl2 = new Builder({
484
+ ...contract["~orpc"],
485
+ middlewares,
486
+ inputValidationIndex: middlewares.length,
487
+ outputValidationIndex: middlewares.length,
488
+ dedupeLeadingMiddlewares: true
489
+ });
490
+ return impl2;
491
+ }
492
+ const impl = new Proxy(contract, {
493
+ get: (target, key) => {
494
+ if (typeof key !== "string") {
495
+ return Reflect.get(target, key);
496
+ }
497
+ let method;
498
+ if (key === "middleware") {
499
+ method = (mid) => decorateMiddleware(mid);
500
+ } else if (key === "use") {
501
+ method = (mid) => {
502
+ return implementerInternal(contract, addMiddleware(middlewares, mid));
503
+ };
504
+ } else if (key === "router") {
505
+ method = (router) => {
506
+ const adapted = enhanceRouter(router, {
507
+ middlewares,
508
+ errorMap: {},
509
+ prefix: void 0,
510
+ tags: void 0,
511
+ dedupeLeadingMiddlewares: true
512
+ });
513
+ return setHiddenRouterContract(adapted, contract);
514
+ };
515
+ } else if (key === "lazyRoute") {
516
+ method = (loader) => {
517
+ const adapted = enhanceRouter(lazy(loader), {
518
+ middlewares,
519
+ errorMap: {},
520
+ prefix: void 0,
521
+ tags: void 0,
522
+ dedupeLeadingMiddlewares: true
523
+ });
524
+ return setHiddenRouterContract(adapted, contract);
525
+ };
526
+ }
527
+ const next = getContractRouter(target, [key]);
528
+ if (!next) {
529
+ return method ?? next;
530
+ }
531
+ const nextImpl = implementerInternal(next, middlewares);
532
+ if (method) {
533
+ return new Proxy(method, {
534
+ get(_, key2) {
535
+ return Reflect.get(nextImpl, key2);
536
+ }
537
+ });
538
+ }
539
+ return nextImpl;
540
+ }
541
+ });
542
+ return impl;
543
+ }
544
+ function implement(contract) {
545
+ const implInternal = implementerInternal(contract, []);
546
+ const impl = new Proxy(implInternal, {
547
+ get: (target, key) => {
548
+ let method;
549
+ if (key === "$context") {
550
+ method = () => impl;
551
+ }
552
+ const next = Reflect.get(target, key);
553
+ if (!method || !next || typeof next !== "function" && typeof next !== "object") {
554
+ return method || next;
555
+ }
556
+ return new Proxy(method, {
557
+ get(_, key2) {
558
+ return Reflect.get(next, key2);
559
+ }
560
+ });
561
+ }
562
+ });
563
+ return impl;
564
+ }
565
+
566
+ function createAssertedLazyProcedure(lazied) {
567
+ const lazyProcedure = lazy(async () => {
568
+ const { default: maybeProcedure } = await unlazy(lazied);
569
+ if (!isProcedure(maybeProcedure)) {
570
+ throw new Error(`
571
+ Expected a lazy<procedure> but got lazy<unknown>.
572
+ This should be caught by TypeScript compilation.
573
+ Please report this issue if this makes you feel uncomfortable.
574
+ `);
575
+ }
576
+ return { default: maybeProcedure };
577
+ }, getLazyMeta(lazied));
578
+ return lazyProcedure;
579
+ }
580
+ function createContractedProcedure(procedure, contract) {
581
+ return new Procedure({
582
+ ...procedure["~orpc"],
583
+ errorMap: contract["~orpc"].errorMap,
584
+ route: contract["~orpc"].route,
585
+ meta: contract["~orpc"].meta
586
+ });
587
+ }
588
+ function call(procedure, input, ...rest) {
589
+ const options = resolveMaybeOptionalOptions(rest);
590
+ return createProcedureClient(procedure, options)(input, options);
591
+ }
592
+
593
+ function createRouterClient(router, ...rest) {
594
+ const options = resolveMaybeOptionalOptions(rest);
595
+ if (isProcedure(router)) {
596
+ const caller = createProcedureClient(router, options);
597
+ return caller;
598
+ }
599
+ const procedureCaller = isLazy(router) ? createProcedureClient(createAssertedLazyProcedure(router), options) : {};
600
+ const recursive = new Proxy(procedureCaller, {
601
+ get(target, key) {
602
+ if (typeof key !== "string") {
603
+ return Reflect.get(target, key);
604
+ }
605
+ const next = getRouter(router, [key]);
606
+ if (!next) {
607
+ return Reflect.get(target, key);
608
+ }
609
+ return createRouterClient(next, {
610
+ ...rest[0],
611
+ path: [...rest[0]?.path ?? [], key]
612
+ });
613
+ }
614
+ });
615
+ return recursive;
616
+ }
617
+
618
+ export { Builder, DecoratedProcedure, Procedure, addMiddleware, call, createAccessibleLazyRouter, createApiBuilder, createAssertedLazyProcedure, createContractedProcedure, createProcedureClient, createRouterClient, decorateMiddleware, enhanceRouter, getHiddenRouterContract, getLazyMeta, getRouter, implement, implementerInternal, isLazy, isProcedure, isStartWithMiddlewares, lazy, mergeMiddlewares, os, resolveContractProcedures, setHiddenRouterContract, traverseContractProcedures, unlazy, unlazyRouter };