@orpc/server 0.0.0-next.c12be86 → 0.0.0-next.c4a591c

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