@orpc/server 0.0.0-next.2ba0691 → 0.0.0-next.31590a1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. package/dist/chunk-CVIWJKJC.js +308 -0
  2. package/dist/chunk-EYGVJA7A.js +136 -0
  3. package/dist/chunk-NOA3GBJQ.js +380 -0
  4. package/dist/chunk-OXB4YX67.js +111 -0
  5. package/dist/fetch.js +14 -299
  6. package/dist/hono.js +42 -0
  7. package/dist/index.js +269 -383
  8. package/dist/next.js +39 -0
  9. package/dist/node.js +175 -0
  10. package/dist/plugins.js +11 -0
  11. package/dist/src/adapters/fetch/index.d.ts +4 -0
  12. package/dist/src/adapters/fetch/rpc-handler.d.ts +10 -0
  13. package/dist/src/adapters/fetch/types.d.ts +13 -0
  14. package/dist/src/adapters/fetch/utils.d.ts +6 -0
  15. package/dist/src/adapters/hono/index.d.ts +3 -0
  16. package/dist/src/adapters/hono/middleware.d.ts +13 -0
  17. package/dist/src/adapters/next/index.d.ts +3 -0
  18. package/dist/src/adapters/next/serve.d.ts +20 -0
  19. package/dist/src/adapters/node/index.d.ts +4 -0
  20. package/dist/src/adapters/node/rpc-handler.d.ts +10 -0
  21. package/dist/src/adapters/node/types.d.ts +21 -0
  22. package/dist/src/adapters/node/utils.d.ts +5 -0
  23. package/dist/src/adapters/standard/handler.d.ts +47 -0
  24. package/dist/src/adapters/standard/index.d.ts +7 -0
  25. package/dist/src/adapters/standard/rpc-codec.d.ts +15 -0
  26. package/dist/src/adapters/standard/rpc-handler.d.ts +8 -0
  27. package/dist/src/adapters/standard/rpc-matcher.d.ts +10 -0
  28. package/dist/src/adapters/standard/rpc-serializer.d.ts +16 -0
  29. package/dist/src/adapters/standard/types.d.ts +44 -0
  30. package/dist/src/builder-variants.d.ts +74 -0
  31. package/dist/src/builder.d.ts +52 -30
  32. package/dist/src/config.d.ts +6 -0
  33. package/dist/src/context.d.ts +9 -0
  34. package/dist/src/hidden.d.ts +6 -4
  35. package/dist/src/implementer-procedure.d.ts +30 -0
  36. package/dist/src/implementer-variants.d.ts +17 -0
  37. package/dist/src/implementer.d.ts +28 -0
  38. package/dist/src/index.d.ts +11 -11
  39. package/dist/src/lazy-utils.d.ts +4 -2
  40. package/dist/src/lazy.d.ts +9 -5
  41. package/dist/src/middleware-decorated.d.ts +7 -5
  42. package/dist/src/middleware-utils.d.ts +5 -0
  43. package/dist/src/middleware.d.ts +28 -14
  44. package/dist/src/plugins/base.d.ts +11 -0
  45. package/dist/src/plugins/cors.d.ts +18 -0
  46. package/dist/src/plugins/index.d.ts +4 -0
  47. package/dist/src/plugins/response-headers.d.ts +10 -0
  48. package/dist/src/procedure-client.d.ts +8 -22
  49. package/dist/src/procedure-decorated.d.ts +18 -11
  50. package/dist/src/procedure-utils.d.ts +17 -0
  51. package/dist/src/procedure.d.ts +24 -18
  52. package/dist/src/router-accessible-lazy.d.ts +8 -0
  53. package/dist/src/router-client.d.ts +7 -10
  54. package/dist/src/router.d.ts +25 -12
  55. package/dist/src/utils.d.ts +23 -2
  56. package/dist/standard.js +17 -0
  57. package/package.json +36 -6
  58. package/dist/chunk-37HIYNDO.js +0 -182
  59. package/dist/src/fetch/composite-handler.d.ts +0 -8
  60. package/dist/src/fetch/index.d.ts +0 -6
  61. package/dist/src/fetch/orpc-handler.d.ts +0 -20
  62. package/dist/src/fetch/orpc-payload-codec.d.ts +0 -11
  63. package/dist/src/fetch/orpc-procedure-matcher.d.ts +0 -12
  64. package/dist/src/fetch/super-json.d.ts +0 -12
  65. package/dist/src/fetch/types.d.ts +0 -16
  66. package/dist/src/implementer-chainable.d.ts +0 -10
  67. package/dist/src/lazy-decorated.d.ts +0 -10
  68. package/dist/src/procedure-builder.d.ts +0 -22
  69. package/dist/src/procedure-implementer.d.ts +0 -18
  70. package/dist/src/router-builder.d.ts +0 -29
  71. package/dist/src/router-implementer.d.ts +0 -21
  72. package/dist/src/types.d.ts +0 -12
package/dist/fetch.js CHANGED
@@ -1,303 +1,18 @@
1
1
  import {
2
- createProcedureClient,
3
- getRouterChild,
4
- isProcedure,
5
- unlazy
6
- } from "./chunk-37HIYNDO.js";
7
-
8
- // src/fetch/composite-handler.ts
9
- var CompositeHandler = class {
10
- constructor(handlers) {
11
- this.handlers = handlers;
12
- }
13
- async fetch(request, ...opt) {
14
- for (const handler of this.handlers) {
15
- if (handler.condition(request)) {
16
- return handler.fetch(request, ...opt);
17
- }
18
- }
19
- return new Response("None of the handlers can handle the request.", {
20
- status: 404
21
- });
22
- }
23
- };
24
-
25
- // src/fetch/orpc-handler.ts
26
- import { executeWithHooks, ORPC_HANDLER_HEADER, ORPC_HANDLER_VALUE, trim as trim2 } from "@orpc/shared";
27
- import { ORPCError as ORPCError2 } from "@orpc/shared/error";
28
-
29
- // src/fetch/orpc-payload-codec.ts
30
- import { findDeepMatches, set } from "@orpc/shared";
31
- import { ORPCError } from "@orpc/shared/error";
32
-
33
- // ../../node_modules/.pnpm/is-what@5.0.2/node_modules/is-what/dist/getType.js
34
- function getType(payload) {
35
- return Object.prototype.toString.call(payload).slice(8, -1);
36
- }
37
-
38
- // ../../node_modules/.pnpm/is-what@5.0.2/node_modules/is-what/dist/isPlainObject.js
39
- function isPlainObject(payload) {
40
- if (getType(payload) !== "Object")
41
- return false;
42
- const prototype = Object.getPrototypeOf(payload);
43
- return !!prototype && prototype.constructor === Object && prototype === Object.prototype;
44
- }
45
-
46
- // src/fetch/super-json.ts
47
- function serialize(value, segments = [], meta = []) {
48
- if (typeof value === "bigint") {
49
- meta.push(["bigint", segments]);
50
- return { data: value.toString(), meta };
51
- }
52
- if (value instanceof Date) {
53
- meta.push(["date", segments]);
54
- const data = Number.isNaN(value.getTime()) ? "Invalid Date" : value.toISOString();
55
- return { data, meta };
56
- }
57
- if (Number.isNaN(value)) {
58
- meta.push(["nan", segments]);
59
- return { data: "NaN", meta };
60
- }
61
- if (value instanceof RegExp) {
62
- meta.push(["regexp", segments]);
63
- return { data: value.toString(), meta };
64
- }
65
- if (value instanceof URL) {
66
- meta.push(["url", segments]);
67
- return { data: value.toString(), meta };
68
- }
69
- if (isPlainObject(value)) {
70
- const data = {};
71
- for (const k in value) {
72
- data[k] = serialize(value[k], [...segments, k], meta).data;
73
- }
74
- return { data, meta };
75
- }
76
- if (Array.isArray(value)) {
77
- const data = value.map((v, i) => {
78
- if (v === void 0) {
79
- meta.push(["undefined", [...segments, i]]);
80
- return null;
81
- }
82
- return serialize(v, [...segments, i], meta).data;
83
- });
84
- return { data, meta };
85
- }
86
- if (value instanceof Set) {
87
- const result = serialize(Array.from(value), segments, meta);
88
- meta.push(["set", segments]);
89
- return result;
90
- }
91
- if (value instanceof Map) {
92
- const result = serialize(Array.from(value.entries()), segments, meta);
93
- meta.push(["map", segments]);
94
- return result;
95
- }
96
- return { data: value, meta };
97
- }
98
- function deserialize({
99
- data,
100
- meta
101
- }) {
102
- if (meta.length === 0) {
103
- return data;
104
- }
105
- const ref = { data };
106
- for (const [type, segments] of meta) {
107
- let currentRef = ref;
108
- let preSegment = "data";
109
- for (let i = 0; i < segments.length; i++) {
110
- currentRef = currentRef[preSegment];
111
- preSegment = segments[i];
112
- }
113
- switch (type) {
114
- case "nan":
115
- currentRef[preSegment] = Number.NaN;
116
- break;
117
- case "bigint":
118
- currentRef[preSegment] = BigInt(currentRef[preSegment]);
119
- break;
120
- case "date":
121
- currentRef[preSegment] = new Date(currentRef[preSegment]);
122
- break;
123
- case "regexp": {
124
- const [, pattern, flags] = currentRef[preSegment].match(/^\/(.*)\/([a-z]*)$/);
125
- currentRef[preSegment] = new RegExp(pattern, flags);
126
- break;
127
- }
128
- case "url":
129
- currentRef[preSegment] = new URL(currentRef[preSegment]);
130
- break;
131
- case "undefined":
132
- currentRef[preSegment] = void 0;
133
- break;
134
- case "map":
135
- currentRef[preSegment] = new Map(currentRef[preSegment]);
136
- break;
137
- case "set":
138
- currentRef[preSegment] = new Set(currentRef[preSegment]);
139
- break;
140
- /* v8 ignore next 3 */
141
- default: {
142
- const _expected = type;
143
- }
144
- }
145
- }
146
- return ref.data;
147
- }
148
-
149
- // src/fetch/orpc-payload-codec.ts
150
- var ORPCPayloadCodec = class {
151
- encode(payload, method = "POST") {
152
- const { data, meta } = serialize(payload);
153
- if (method === "GET") {
154
- const query = new URLSearchParams({
155
- data: JSON.stringify(data),
156
- meta: JSON.stringify(meta)
157
- });
158
- return { query };
159
- }
160
- const { maps, values } = findDeepMatches((v) => v instanceof Blob, data);
161
- if (values.length > 0) {
162
- const form = new FormData();
163
- if (data !== void 0) {
164
- form.append("data", JSON.stringify(data));
165
- }
166
- form.append("meta", JSON.stringify(meta));
167
- form.append("maps", JSON.stringify(maps));
168
- for (const i in values) {
169
- const value = values[i];
170
- form.append(i, value);
171
- }
172
- return { body: form };
173
- }
174
- return {
175
- body: JSON.stringify({ data, meta }),
176
- headers: new Headers({
177
- "content-type": "application/json"
178
- })
179
- };
180
- }
181
- async decode(re) {
182
- try {
183
- if ("method" in re && re.method === "GET") {
184
- const url = new URL(re.url);
185
- const query = url.searchParams;
186
- const data = JSON.parse(query.getAll("data").at(-1));
187
- const meta = JSON.parse(query.getAll("meta").at(-1));
188
- return deserialize({
189
- data,
190
- meta
191
- });
192
- }
193
- if (re.headers.get("content-type")?.startsWith("multipart/form-data")) {
194
- const form = await re.formData();
195
- const rawData = form.get("data");
196
- const rawMeta = form.get("meta");
197
- const rawMaps = form.get("maps");
198
- let data = JSON.parse(rawData);
199
- const meta = JSON.parse(rawMeta);
200
- const maps = JSON.parse(rawMaps);
201
- for (const i in maps) {
202
- data = set(data, maps[i], form.get(i));
203
- }
204
- return deserialize({
205
- data,
206
- meta
207
- });
208
- }
209
- const json = await re.json();
210
- return deserialize(json);
211
- } catch (e) {
212
- throw new ORPCError({
213
- code: "BAD_REQUEST",
214
- message: "Cannot parse request/response. Please check the request/response body and Content-Type header.",
215
- cause: e
216
- });
217
- }
218
- }
219
- };
220
-
221
- // src/fetch/orpc-procedure-matcher.ts
222
- import { trim } from "@orpc/shared";
223
- var ORPCProcedureMatcher = class {
224
- constructor(router) {
225
- this.router = router;
226
- }
227
- async match(pathname) {
228
- const path = trim(pathname, "/").split("/").map(decodeURIComponent);
229
- const match = getRouterChild(this.router, ...path);
230
- const { default: maybeProcedure } = await unlazy(match);
231
- if (!isProcedure(maybeProcedure)) {
232
- return void 0;
233
- }
234
- return {
235
- procedure: maybeProcedure,
236
- path
237
- };
238
- }
239
- };
240
-
241
- // src/fetch/orpc-handler.ts
242
- var ORPCHandler = class {
243
- constructor(router, options) {
244
- this.router = router;
245
- this.options = options;
246
- this.procedureMatcher = options?.procedureMatcher ?? new ORPCProcedureMatcher(router);
247
- this.payloadCodec = options?.payloadCodec ?? new ORPCPayloadCodec();
248
- }
249
- procedureMatcher;
250
- payloadCodec;
251
- condition(request) {
252
- return Boolean(request.headers.get(ORPC_HANDLER_HEADER)?.includes(ORPC_HANDLER_VALUE));
253
- }
254
- async fetch(request, ...[options]) {
255
- const context = options?.context;
256
- const execute = async () => {
257
- const url = new URL(request.url);
258
- const pathname = `/${trim2(url.pathname.replace(options?.prefix ?? "", ""), "/")}`;
259
- const match = await this.procedureMatcher.match(pathname);
260
- if (!match) {
261
- throw new ORPCError2({ code: "NOT_FOUND", message: "Not found" });
262
- }
263
- const input = await this.payloadCodec.decode(request);
264
- const client = createProcedureClient({
265
- context,
266
- procedure: match.procedure,
267
- path: match.path
268
- });
269
- const output = await client(input, { signal: options?.signal });
270
- const { body, headers } = this.payloadCodec.encode(output);
271
- return new Response(body, { headers });
272
- };
273
- try {
274
- return await executeWithHooks({
275
- context,
276
- execute,
277
- input: request,
278
- hooks: this.options,
279
- meta: {
280
- signal: options?.signal
281
- }
282
- });
283
- } catch (e) {
284
- const error = e instanceof ORPCError2 ? e : new ORPCError2({
285
- code: "INTERNAL_SERVER_ERROR",
286
- message: "Internal server error",
287
- cause: e
288
- });
289
- const { body, headers } = this.payloadCodec.encode(error.toJSON());
290
- return new Response(body, {
291
- headers,
292
- status: error.status
293
- });
294
- }
295
- }
296
- };
2
+ RPCHandler,
3
+ fetchReToStandardBody,
4
+ fetchRequestToStandardRequest,
5
+ standardBodyToFetchBody,
6
+ standardResponseToFetchResponse
7
+ } from "./chunk-EYGVJA7A.js";
8
+ import "./chunk-CVIWJKJC.js";
9
+ import "./chunk-NOA3GBJQ.js";
10
+ import "./chunk-OXB4YX67.js";
297
11
  export {
298
- CompositeHandler,
299
- ORPCHandler,
300
- ORPCPayloadCodec,
301
- ORPCProcedureMatcher
12
+ RPCHandler,
13
+ fetchReToStandardBody,
14
+ fetchRequestToStandardRequest,
15
+ standardBodyToFetchBody,
16
+ standardResponseToFetchResponse
302
17
  };
303
18
  //# sourceMappingURL=fetch.js.map
package/dist/hono.js ADDED
@@ -0,0 +1,42 @@
1
+ import {
2
+ RPCHandler,
3
+ fetchReToStandardBody,
4
+ fetchRequestToStandardRequest,
5
+ standardBodyToFetchBody,
6
+ standardResponseToFetchResponse
7
+ } from "./chunk-EYGVJA7A.js";
8
+ import "./chunk-CVIWJKJC.js";
9
+ import "./chunk-NOA3GBJQ.js";
10
+ import "./chunk-OXB4YX67.js";
11
+
12
+ // src/adapters/hono/middleware.ts
13
+ import { value } from "@orpc/shared";
14
+ function createMiddleware(handler, ...[options]) {
15
+ return async (c, next) => {
16
+ const bodyProps = /* @__PURE__ */ new Set(["arrayBuffer", "blob", "formData", "json", "text"]);
17
+ const request = c.req.method === "GET" || c.req.method === "HEAD" ? c.req.raw : new Proxy(c.req.raw, {
18
+ // https://github.com/honojs/middleware/blob/main/packages/trpc-server/src/index.ts#L39
19
+ get(target, prop) {
20
+ if (bodyProps.has(prop)) {
21
+ return () => c.req[prop]();
22
+ }
23
+ return Reflect.get(target, prop, target);
24
+ }
25
+ });
26
+ const context = await value(options?.context ?? {}, c);
27
+ const { matched, response } = await handler.handle(request, { ...options, context });
28
+ if (matched) {
29
+ return c.body(response.body, response);
30
+ }
31
+ await next();
32
+ };
33
+ }
34
+ export {
35
+ RPCHandler,
36
+ createMiddleware,
37
+ fetchReToStandardBody,
38
+ fetchRequestToStandardRequest,
39
+ standardBodyToFetchBody,
40
+ standardResponseToFetchResponse
41
+ };
42
+ //# sourceMappingURL=hono.js.map