@orpc/openapi 1.14.6 → 2.0.0-beta.10

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 (48) hide show
  1. package/README.md +78 -110
  2. package/dist/adapters/fetch/index.d.mts +20 -16
  3. package/dist/adapters/fetch/index.d.ts +20 -16
  4. package/dist/adapters/fetch/index.mjs +24 -8
  5. package/dist/adapters/node/index.d.mts +8 -13
  6. package/dist/adapters/node/index.d.ts +8 -13
  7. package/dist/adapters/node/index.mjs +10 -7
  8. package/dist/adapters/standard/index.d.mts +46 -16
  9. package/dist/adapters/standard/index.d.ts +46 -16
  10. package/dist/adapters/standard/index.mjs +9 -6
  11. package/dist/extensions/route.d.mts +43 -0
  12. package/dist/extensions/route.d.ts +43 -0
  13. package/dist/extensions/route.mjs +14 -0
  14. package/dist/helpers/index.d.mts +51 -0
  15. package/dist/helpers/index.d.ts +51 -0
  16. package/dist/helpers/index.mjs +39 -0
  17. package/dist/index.d.mts +111 -108
  18. package/dist/index.d.ts +111 -108
  19. package/dist/index.mjs +922 -33
  20. package/dist/plugins/index.d.mts +55 -51
  21. package/dist/plugins/index.d.ts +55 -51
  22. package/dist/plugins/index.mjs +147 -142
  23. package/dist/shared/openapi.7vgmPxca.d.ts +82 -0
  24. package/dist/shared/openapi.B2SK0ZAr.mjs +359 -0
  25. package/dist/shared/openapi.B9PQzqBn.mjs +49 -0
  26. package/dist/shared/openapi.BQzzr4-4.d.ts +299 -0
  27. package/dist/shared/openapi.BcEtAxQj.d.mts +299 -0
  28. package/dist/shared/openapi.Bt87OzTt.mjs +131 -0
  29. package/dist/shared/openapi.C7m7NAmH.d.mts +142 -0
  30. package/dist/shared/openapi.C7m7NAmH.d.ts +142 -0
  31. package/dist/shared/openapi.CTlpLuKN.mjs +318 -0
  32. package/dist/shared/openapi.CX6Ri5dP.d.mts +82 -0
  33. package/dist/shared/openapi.CYgMBSUF.d.mts +18 -0
  34. package/dist/shared/openapi.CYgMBSUF.d.ts +18 -0
  35. package/dist/shared/openapi.DmAa7YPO.mjs +275 -0
  36. package/package.json +30 -24
  37. package/dist/adapters/aws-lambda/index.d.mts +0 -20
  38. package/dist/adapters/aws-lambda/index.d.ts +0 -20
  39. package/dist/adapters/aws-lambda/index.mjs +0 -18
  40. package/dist/adapters/fastify/index.d.mts +0 -23
  41. package/dist/adapters/fastify/index.d.ts +0 -23
  42. package/dist/adapters/fastify/index.mjs +0 -18
  43. package/dist/shared/openapi.BB-W-NKv.mjs +0 -204
  44. package/dist/shared/openapi.BGy4N6eR.d.mts +0 -120
  45. package/dist/shared/openapi.BGy4N6eR.d.ts +0 -120
  46. package/dist/shared/openapi.BwdtJjDu.mjs +0 -878
  47. package/dist/shared/openapi.DwaweYRb.d.mts +0 -54
  48. package/dist/shared/openapi.DwaweYRb.d.ts +0 -54
@@ -0,0 +1,275 @@
1
+ import { wrapEventIteratorPreservingMeta, toORPCError, isORPCErrorJson, createORPCErrorFromJson } from '@orpc/client';
2
+ import { isPlainObject, isAsyncIteratorObject } from '@orpc/shared';
3
+ import { ErrorEvent } from '@standardserver/core';
4
+ import { B as BracketNotationSerializer } from './openapi.Bt87OzTt.mjs';
5
+
6
+ const DEFAULT_OPENAPI_METHOD = "POST";
7
+ const DEFAULT_OPENAPI_SUCCESS_DESCRIPTION = "OK";
8
+ const DEFAULT_OPENAPI_INPUT_STRUCTURE = "compact";
9
+ const DEFAULT_OPENAPI_OUTPUT_STRUCTURE = "compact";
10
+
11
+ const DEFAULT_OPEN_API_JSON_SERIALIZER_HANDLERS = {
12
+ undefined: {
13
+ condition(data) {
14
+ return data === void 0;
15
+ },
16
+ serialize() {
17
+ return null;
18
+ },
19
+ isTerminal: true
20
+ },
21
+ bigint: {
22
+ condition(data) {
23
+ return typeof data === "bigint";
24
+ },
25
+ serialize(data) {
26
+ return data.toString();
27
+ },
28
+ isTerminal: true
29
+ },
30
+ date: {
31
+ condition(data) {
32
+ return data instanceof Date;
33
+ },
34
+ serialize(data) {
35
+ if (Number.isNaN(data.getTime())) {
36
+ return null;
37
+ }
38
+ return data.toISOString();
39
+ },
40
+ isTerminal: true
41
+ },
42
+ nan: {
43
+ condition(data) {
44
+ return typeof data === "number" && Number.isNaN(data);
45
+ },
46
+ serialize() {
47
+ return null;
48
+ },
49
+ isTerminal: true
50
+ },
51
+ url: {
52
+ condition(data) {
53
+ return data instanceof URL;
54
+ },
55
+ serialize(data) {
56
+ return data.toString();
57
+ },
58
+ isTerminal: true
59
+ },
60
+ regexp: {
61
+ condition(data) {
62
+ return data instanceof RegExp;
63
+ },
64
+ serialize(data) {
65
+ return data.toString();
66
+ },
67
+ isTerminal: true
68
+ },
69
+ set: {
70
+ condition(data) {
71
+ return data instanceof Set;
72
+ },
73
+ serialize(data) {
74
+ return Array.from(data);
75
+ }
76
+ },
77
+ map: {
78
+ condition(data) {
79
+ return data instanceof Map;
80
+ },
81
+ serialize(data) {
82
+ return Array.from(data.entries());
83
+ }
84
+ }
85
+ };
86
+ class OpenAPIJsonSerializer {
87
+ handlers;
88
+ omitUndefinedProperties;
89
+ constructor(options = {}) {
90
+ this.handlers = {
91
+ ...DEFAULT_OPEN_API_JSON_SERIALIZER_HANDLERS,
92
+ ...options.handlers
93
+ };
94
+ this.omitUndefinedProperties = options.omitUndefinedProperties !== false;
95
+ }
96
+ serialize(data) {
97
+ const [json, maps, blobs] = this.serializeValue(data, [], [], []);
98
+ return { json, maps, blobs };
99
+ }
100
+ serializeValue(data, segments, maps, blobs) {
101
+ for (const key in this.handlers) {
102
+ const handler = this.handlers[key];
103
+ if (handler && handler.condition(data)) {
104
+ const serialized = handler.serialize(data);
105
+ if (handler.isTerminal) {
106
+ return [serialized, maps, blobs];
107
+ }
108
+ const result = this.serializeValue(serialized, segments, maps, blobs);
109
+ return result;
110
+ }
111
+ }
112
+ if (data instanceof Blob) {
113
+ maps.push(segments);
114
+ blobs.push(data);
115
+ return [data, maps, blobs];
116
+ }
117
+ if (Array.isArray(data)) {
118
+ const json = data.map((v, i) => {
119
+ return this.serializeValue(v, [...segments, i], maps, blobs)[0];
120
+ });
121
+ return [json, maps, blobs];
122
+ }
123
+ if (isPlainObject(data)) {
124
+ const json = {};
125
+ for (const k in data) {
126
+ const v = data[k];
127
+ if (k === "toJSON" && typeof v === "function") {
128
+ continue;
129
+ }
130
+ if (v === void 0 && this.omitUndefinedProperties) {
131
+ continue;
132
+ }
133
+ json[k] = this.serializeValue(v, [...segments, k], maps, blobs)[0];
134
+ }
135
+ return [json, maps, blobs];
136
+ }
137
+ return [data, maps, blobs];
138
+ }
139
+ deserialize(serialized) {
140
+ const ref = { data: serialized.json };
141
+ if (serialized.blobs?.length) {
142
+ serialized.maps.forEach((segments, i) => {
143
+ let currentRef = ref;
144
+ let preSegment = "data";
145
+ segments.forEach((segment) => {
146
+ currentRef = currentRef[preSegment];
147
+ preSegment = segment;
148
+ if (!Object.hasOwn(currentRef, preSegment)) {
149
+ throw new Error(`Security error: Invalid serialized data. Segment "${preSegment}" does not exist.`);
150
+ }
151
+ });
152
+ currentRef[preSegment] = serialized.blobs[i];
153
+ });
154
+ }
155
+ return ref.data;
156
+ }
157
+ }
158
+
159
+ class OpenAPISerializer {
160
+ jsonSerializer;
161
+ bracketNotation;
162
+ defaultSerializeOptions;
163
+ constructor({ bracketNotation, serialize, ...options } = {}) {
164
+ this.jsonSerializer = new OpenAPIJsonSerializer(options);
165
+ this.bracketNotation = new BracketNotationSerializer(bracketNotation);
166
+ this.defaultSerializeOptions = serialize;
167
+ }
168
+ serialize(data, options = {}) {
169
+ const useFormDataForBlobFields = options.useFormDataForBlobFields ?? this.defaultSerializeOptions?.useFormDataForBlobFields ?? true;
170
+ const asFormData = options.asFormData ?? this.defaultSerializeOptions?.asFormData ?? false;
171
+ if (!options.asFormData) {
172
+ if (data === void 0 || data instanceof ReadableStream || data instanceof Blob) {
173
+ return data;
174
+ }
175
+ if (isAsyncIteratorObject(data)) {
176
+ return wrapEventIteratorPreservingMeta(data, {
177
+ mapResult: (result) => {
178
+ if (result.value === void 0) {
179
+ return result;
180
+ }
181
+ return { done: result.done, value: this.serializeValue(result.value, { asFormData: false, useFormDataForBlobFields: false }) };
182
+ },
183
+ mapError: (e) => {
184
+ return new ErrorEvent({
185
+ data: this.serializeValue(toORPCError(e).toJSON(), { asFormData: false, useFormDataForBlobFields: false }),
186
+ cause: e
187
+ });
188
+ }
189
+ });
190
+ }
191
+ }
192
+ return this.serializeValue(data, { useFormDataForBlobFields, asFormData });
193
+ }
194
+ serializeValue(value, options) {
195
+ const { json, blobs } = this.jsonSerializer.serialize(value);
196
+ if (!options.asFormData && (json instanceof Blob || json === void 0 || !blobs?.length || !options.useFormDataForBlobFields)) {
197
+ return json;
198
+ }
199
+ const form = new FormData();
200
+ for (const [path, value2] of this.bracketNotation.serialize(json)) {
201
+ if (value2 instanceof Blob) {
202
+ form.append(path, value2);
203
+ } else if (value2 !== void 0 && value2 !== null) {
204
+ form.append(path, String(value2));
205
+ }
206
+ }
207
+ return form;
208
+ }
209
+ deserialize(data) {
210
+ if (data === void 0 || data instanceof ReadableStream || data instanceof Blob) {
211
+ return data;
212
+ }
213
+ if (isAsyncIteratorObject(data)) {
214
+ return wrapEventIteratorPreservingMeta(data, {
215
+ mapResult: (result) => {
216
+ if (result.value === void 0) {
217
+ return result;
218
+ }
219
+ return { done: result.done, value: this.jsonSerializer.deserialize({ json: result.value }) };
220
+ },
221
+ mapError: (e) => {
222
+ if (e instanceof ErrorEvent) {
223
+ const deserialized = this.jsonSerializer.deserialize({ json: e.data });
224
+ if (isORPCErrorJson(deserialized)) {
225
+ return createORPCErrorFromJson(deserialized, { cause: e });
226
+ }
227
+ }
228
+ return e;
229
+ }
230
+ });
231
+ }
232
+ if (data instanceof URLSearchParams || data instanceof FormData) {
233
+ data = this.bracketNotation.deserialize(Array.from(data.entries()));
234
+ }
235
+ return this.jsonSerializer.deserialize({ json: data });
236
+ }
237
+ }
238
+
239
+ const PARAMETER_NAME_REGEX = /^[\w-]+$/;
240
+ function getDynamicPathParams(path) {
241
+ if (!path.includes("{")) {
242
+ return void 0;
243
+ }
244
+ const len = path.length;
245
+ let params;
246
+ let index = 1;
247
+ while (index < len) {
248
+ const segmentStart = index;
249
+ const slashPos = path.indexOf("/", index);
250
+ const segmentEnd = slashPos === -1 ? len : slashPos;
251
+ if (segmentEnd > segmentStart && path.charCodeAt(segmentStart) === 123 && path.charCodeAt(segmentEnd - 1) === 125) {
252
+ let parameterStart = segmentStart + 1;
253
+ let allowsSlash = false;
254
+ const operator = path.charCodeAt(parameterStart);
255
+ if (operator === 43) {
256
+ allowsSlash = true;
257
+ parameterStart++;
258
+ }
259
+ const parameterName = path.slice(parameterStart, segmentEnd - 1);
260
+ if (PARAMETER_NAME_REGEX.test(parameterName)) {
261
+ params ??= [];
262
+ params.push({
263
+ segment: path.slice(segmentStart, segmentEnd),
264
+ startIndex: segmentStart,
265
+ parameterName,
266
+ allowsSlash
267
+ });
268
+ }
269
+ }
270
+ index = segmentEnd + 1;
271
+ }
272
+ return params;
273
+ }
274
+
275
+ export { DEFAULT_OPENAPI_METHOD as D, OpenAPISerializer as O, DEFAULT_OPENAPI_INPUT_STRUCTURE as a, DEFAULT_OPENAPI_OUTPUT_STRUCTURE as b, DEFAULT_OPENAPI_SUCCESS_DESCRIPTION as c, OpenAPIJsonSerializer as d, getDynamicPathParams as g };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@orpc/openapi",
3
3
  "type": "module",
4
- "version": "1.14.6",
4
+ "version": "2.0.0-beta.10",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orpc.dev",
7
7
  "repository": {
@@ -10,15 +10,24 @@
10
10
  "directory": "packages/openapi"
11
11
  },
12
12
  "keywords": [
13
- "orpc"
13
+ "orpc",
14
+ "openapi"
15
+ ],
16
+ "sideEffects": [
17
+ "./dist/extensions/route.mjs"
14
18
  ],
15
- "sideEffects": false,
16
19
  "exports": {
20
+ "./package.json": "./package.json",
17
21
  ".": {
18
22
  "types": "./dist/index.d.mts",
19
23
  "import": "./dist/index.mjs",
20
24
  "default": "./dist/index.mjs"
21
25
  },
26
+ "./helpers": {
27
+ "types": "./dist/helpers/index.d.mts",
28
+ "import": "./dist/helpers/index.mjs",
29
+ "default": "./dist/helpers/index.mjs"
30
+ },
22
31
  "./plugins": {
23
32
  "types": "./dist/plugins/index.d.mts",
24
33
  "import": "./dist/plugins/index.mjs",
@@ -39,38 +48,35 @@
39
48
  "import": "./dist/adapters/node/index.mjs",
40
49
  "default": "./dist/adapters/node/index.mjs"
41
50
  },
42
- "./fastify": {
43
- "types": "./dist/adapters/fastify/index.d.mts",
44
- "import": "./dist/adapters/fastify/index.mjs",
45
- "default": "./dist/adapters/fastify/index.mjs"
46
- },
47
- "./aws-lambda": {
48
- "types": "./dist/adapters/aws-lambda/index.d.mts",
49
- "import": "./dist/adapters/aws-lambda/index.mjs",
50
- "default": "./dist/adapters/aws-lambda/index.mjs"
51
+ "./extensions/route": {
52
+ "types": "./dist/extensions/route.d.mts",
53
+ "import": "./dist/extensions/route.mjs",
54
+ "default": "./dist/extensions/route.mjs"
51
55
  }
52
56
  },
53
57
  "files": [
54
58
  "dist"
55
59
  ],
56
60
  "dependencies": {
57
- "json-schema-typed": "^8.0.2",
58
- "rou3": "^0.7.12",
59
- "@orpc/contract": "1.14.6",
60
- "@orpc/client": "1.14.6",
61
- "@orpc/server": "1.14.6",
62
- "@orpc/shared": "1.14.6",
63
- "@orpc/interop": "1.14.6",
64
- "@orpc/standard-server": "1.14.6",
65
- "@orpc/openapi-client": "1.14.6"
61
+ "@hey-api/spec-types": "0.0.0-next-20260408030107",
62
+ "@scalar/api-reference": "^1.57.2",
63
+ "@standardserver/core": "^0.0.25",
64
+ "@standardserver/fetch": "^0.0.25",
65
+ "@types/swagger-ui": "^5.32.0",
66
+ "rou3": "^0.8.1",
67
+ "swagger-ui": "^5.32.6",
68
+ "@orpc/client": "2.0.0-beta.10",
69
+ "@orpc/json-schema": "2.0.0-beta.10",
70
+ "@orpc/contract": "2.0.0-beta.10",
71
+ "@orpc/server": "2.0.0-beta.10",
72
+ "@orpc/shared": "2.0.0-beta.10"
66
73
  },
67
74
  "devDependencies": {
68
- "fastify": "^5.8.3",
69
- "zod": "^4.3.6"
75
+ "fastify": "^5.8.5",
76
+ "zod": "^4.4.3"
70
77
  },
71
78
  "scripts": {
72
79
  "build": "unbuild",
73
- "build:watch": "pnpm run build --watch",
74
80
  "type:check": "tsc -b"
75
81
  }
76
82
  }
@@ -1,20 +0,0 @@
1
- import { Context, Router } from '@orpc/server';
2
- import { AwsLambdaHandler, AwsLambdaHandlerOptions } from '@orpc/server/aws-lambda';
3
- import { b as StandardOpenAPIHandlerOptions } from '../../shared/openapi.DwaweYRb.mjs';
4
- import '@orpc/openapi-client/standard';
5
- import '@orpc/server/standard';
6
- import '@orpc/client';
7
- import '@orpc/standard-server';
8
- import '@orpc/shared';
9
-
10
- /**
11
- * OpenAPI Handler for AWS Lambda.
12
- *
13
- * @see {@link https://orpc.dev/docs/openapi/openapi-handler OpenAPI Handler Docs}
14
- * @see {@link https://orpc.dev/docs/adapters/http HTTP Adapter Docs}
15
- */
16
- declare class OpenAPIHandler<T extends Context> extends AwsLambdaHandler<T> {
17
- constructor(router: Router<any, T>, options?: NoInfer<StandardOpenAPIHandlerOptions<T> & AwsLambdaHandlerOptions>);
18
- }
19
-
20
- export { OpenAPIHandler };
@@ -1,20 +0,0 @@
1
- import { Context, Router } from '@orpc/server';
2
- import { AwsLambdaHandler, AwsLambdaHandlerOptions } from '@orpc/server/aws-lambda';
3
- import { b as StandardOpenAPIHandlerOptions } from '../../shared/openapi.DwaweYRb.js';
4
- import '@orpc/openapi-client/standard';
5
- import '@orpc/server/standard';
6
- import '@orpc/client';
7
- import '@orpc/standard-server';
8
- import '@orpc/shared';
9
-
10
- /**
11
- * OpenAPI Handler for AWS Lambda.
12
- *
13
- * @see {@link https://orpc.dev/docs/openapi/openapi-handler OpenAPI Handler Docs}
14
- * @see {@link https://orpc.dev/docs/adapters/http HTTP Adapter Docs}
15
- */
16
- declare class OpenAPIHandler<T extends Context> extends AwsLambdaHandler<T> {
17
- constructor(router: Router<any, T>, options?: NoInfer<StandardOpenAPIHandlerOptions<T> & AwsLambdaHandlerOptions>);
18
- }
19
-
20
- export { OpenAPIHandler };
@@ -1,18 +0,0 @@
1
- import { AwsLambdaHandler } from '@orpc/server/aws-lambda';
2
- import { a as StandardOpenAPIHandler } from '../../shared/openapi.BB-W-NKv.mjs';
3
- import '@orpc/openapi-client/standard';
4
- import '@orpc/server/standard';
5
- import '@orpc/client';
6
- import '@orpc/contract';
7
- import '@orpc/shared';
8
- import '@orpc/client/standard';
9
- import '@orpc/server';
10
- import 'rou3';
11
-
12
- class OpenAPIHandler extends AwsLambdaHandler {
13
- constructor(router, options = {}) {
14
- super(new StandardOpenAPIHandler(router, options), options);
15
- }
16
- }
17
-
18
- export { OpenAPIHandler };
@@ -1,23 +0,0 @@
1
- import { Context, Router } from '@orpc/server';
2
- import { FastifyHandlerOptions, FastifyHandler } from '@orpc/server/fastify';
3
- import { b as StandardOpenAPIHandlerOptions } from '../../shared/openapi.DwaweYRb.mjs';
4
- import '@orpc/openapi-client/standard';
5
- import '@orpc/server/standard';
6
- import '@orpc/client';
7
- import '@orpc/standard-server';
8
- import '@orpc/shared';
9
-
10
- interface OpenAPIHandlerOptions<T extends Context> extends FastifyHandlerOptions<T>, StandardOpenAPIHandlerOptions<T> {
11
- }
12
- /**
13
- * OpenAPI Handler for Fastify Server
14
- *
15
- * @see {@link https://orpc.dev/docs/openapi/openapi-handler OpenAPI Handler Docs}
16
- * @see {@link https://orpc.dev/docs/adapters/http HTTP Adapter Docs}
17
- */
18
- declare class OpenAPIHandler<T extends Context> extends FastifyHandler<T> {
19
- constructor(router: Router<any, T>, options?: NoInfer<OpenAPIHandlerOptions<T>>);
20
- }
21
-
22
- export { OpenAPIHandler };
23
- export type { OpenAPIHandlerOptions };
@@ -1,23 +0,0 @@
1
- import { Context, Router } from '@orpc/server';
2
- import { FastifyHandlerOptions, FastifyHandler } from '@orpc/server/fastify';
3
- import { b as StandardOpenAPIHandlerOptions } from '../../shared/openapi.DwaweYRb.js';
4
- import '@orpc/openapi-client/standard';
5
- import '@orpc/server/standard';
6
- import '@orpc/client';
7
- import '@orpc/standard-server';
8
- import '@orpc/shared';
9
-
10
- interface OpenAPIHandlerOptions<T extends Context> extends FastifyHandlerOptions<T>, StandardOpenAPIHandlerOptions<T> {
11
- }
12
- /**
13
- * OpenAPI Handler for Fastify Server
14
- *
15
- * @see {@link https://orpc.dev/docs/openapi/openapi-handler OpenAPI Handler Docs}
16
- * @see {@link https://orpc.dev/docs/adapters/http HTTP Adapter Docs}
17
- */
18
- declare class OpenAPIHandler<T extends Context> extends FastifyHandler<T> {
19
- constructor(router: Router<any, T>, options?: NoInfer<OpenAPIHandlerOptions<T>>);
20
- }
21
-
22
- export { OpenAPIHandler };
23
- export type { OpenAPIHandlerOptions };
@@ -1,18 +0,0 @@
1
- import { FastifyHandler } from '@orpc/server/fastify';
2
- import { a as StandardOpenAPIHandler } from '../../shared/openapi.BB-W-NKv.mjs';
3
- import '@orpc/openapi-client/standard';
4
- import '@orpc/server/standard';
5
- import '@orpc/client';
6
- import '@orpc/contract';
7
- import '@orpc/shared';
8
- import '@orpc/client/standard';
9
- import '@orpc/server';
10
- import 'rou3';
11
-
12
- class OpenAPIHandler extends FastifyHandler {
13
- constructor(router, options = {}) {
14
- super(new StandardOpenAPIHandler(router, options), options);
15
- }
16
- }
17
-
18
- export { OpenAPIHandler };