@orpc/openapi 0.0.0-next.aa72097 → 0.0.0-next.ac2a918
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/README.md +91 -0
- package/dist/chunk-LTTK3H5J.js +157 -0
- package/dist/chunk-PW7RAFQQ.js +32 -0
- package/dist/chunk-XGHV4TH3.js +13 -0
- package/dist/fetch.js +5 -30
- package/dist/hono.js +5 -30
- package/dist/index.js +260 -55
- package/dist/next.js +9 -0
- package/dist/node.js +18 -34
- package/dist/src/adapters/fetch/index.d.ts +0 -8
- package/dist/src/adapters/fetch/openapi-handler.d.ts +8 -29
- package/dist/src/adapters/next/index.d.ts +2 -0
- package/dist/src/adapters/node/index.d.ts +0 -3
- package/dist/src/adapters/node/openapi-handler.d.ts +8 -8
- package/dist/src/adapters/standard/index.d.ts +4 -0
- package/dist/src/adapters/standard/openapi-codec.d.ts +13 -0
- package/dist/src/adapters/standard/openapi-handler.d.ts +5 -0
- package/dist/src/adapters/standard/openapi-matcher.d.ts +10 -0
- package/dist/src/index.d.ts +5 -1
- package/dist/src/openapi-generator.d.ts +11 -4
- package/dist/src/openapi-input-structure-parser.d.ts +2 -2
- package/dist/src/openapi-operation-extender.d.ts +7 -0
- package/dist/src/openapi-output-structure-parser.d.ts +2 -2
- package/dist/src/schema-converter.d.ts +2 -2
- package/dist/src/schema.d.ts +1 -1
- package/dist/src/utils.d.ts +2 -16
- package/dist/standard.js +10 -0
- package/package.json +19 -12
- package/dist/chunk-KNYXLM77.js +0 -107
- package/dist/chunk-XYIZDXKB.js +0 -652
- package/dist/chunk-YOKECDND.js +0 -25
- package/dist/src/adapters/fetch/bracket-notation.d.ts +0 -84
- package/dist/src/adapters/fetch/input-structure-compact.d.ts +0 -6
- package/dist/src/adapters/fetch/input-structure-detailed.d.ts +0 -11
- package/dist/src/adapters/fetch/openapi-handler-server.d.ts +0 -7
- package/dist/src/adapters/fetch/openapi-handler-serverless.d.ts +0 -7
- package/dist/src/adapters/fetch/openapi-payload-codec.d.ts +0 -15
- package/dist/src/adapters/fetch/openapi-procedure-matcher.d.ts +0 -19
- package/dist/src/adapters/fetch/schema-coercer.d.ts +0 -10
- package/dist/src/adapters/node/openapi-handler-server.d.ts +0 -7
- package/dist/src/adapters/node/openapi-handler-serverless.d.ts +0 -7
- package/dist/src/adapters/node/types.d.ts +0 -2
- package/dist/src/json-serializer.d.ts +0 -5
package/dist/index.js
CHANGED
|
@@ -1,9 +1,53 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
standardizeHTTPPath,
|
|
3
|
+
toOpenAPI31RoutePattern
|
|
4
|
+
} from "./chunk-XGHV4TH3.js";
|
|
5
|
+
|
|
6
|
+
// src/openapi-operation-extender.ts
|
|
7
|
+
import { isProcedure } from "@orpc/server";
|
|
8
|
+
var OPERATION_EXTENDER_SYMBOL = Symbol("ORPC_OPERATION_EXTENDER");
|
|
9
|
+
function setOperationExtender(o, extend) {
|
|
10
|
+
return new Proxy(o, {
|
|
11
|
+
get(target, prop, receiver) {
|
|
12
|
+
if (prop === OPERATION_EXTENDER_SYMBOL) {
|
|
13
|
+
return extend;
|
|
14
|
+
}
|
|
15
|
+
return Reflect.get(target, prop, receiver);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function getOperationExtender(o) {
|
|
20
|
+
return o[OPERATION_EXTENDER_SYMBOL];
|
|
21
|
+
}
|
|
22
|
+
function extendOperation(operation, procedure) {
|
|
23
|
+
const operationExtenders = [];
|
|
24
|
+
for (const errorItem of Object.values(procedure["~orpc"].errorMap)) {
|
|
25
|
+
const maybeExtender = getOperationExtender(errorItem);
|
|
26
|
+
if (maybeExtender) {
|
|
27
|
+
operationExtenders.push(maybeExtender);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (isProcedure(procedure)) {
|
|
31
|
+
for (const middleware of procedure["~orpc"].middlewares) {
|
|
32
|
+
const maybeExtender = getOperationExtender(middleware);
|
|
33
|
+
if (maybeExtender) {
|
|
34
|
+
operationExtenders.push(maybeExtender);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
let currentOperation = operation;
|
|
39
|
+
for (const extender of operationExtenders) {
|
|
40
|
+
if (typeof extender === "function") {
|
|
41
|
+
currentOperation = extender(currentOperation, procedure);
|
|
42
|
+
} else {
|
|
43
|
+
currentOperation = {
|
|
44
|
+
...currentOperation,
|
|
45
|
+
...extender
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return currentOperation;
|
|
50
|
+
}
|
|
7
51
|
|
|
8
52
|
// src/openapi.ts
|
|
9
53
|
import { OpenApiBuilder } from "openapi3-ts/oas31";
|
|
@@ -36,14 +80,18 @@ var OpenAPIContentBuilder = class {
|
|
|
36
80
|
};
|
|
37
81
|
|
|
38
82
|
// src/openapi-generator.ts
|
|
39
|
-
import {
|
|
83
|
+
import { fallbackORPCErrorStatus } from "@orpc/client";
|
|
84
|
+
import { OpenAPIJsonSerializer } from "@orpc/client/openapi";
|
|
85
|
+
import { fallbackContractConfig as fallbackContractConfig2, getEventIteratorSchemaDetails } from "@orpc/contract";
|
|
86
|
+
import { eachAllContractProcedure } from "@orpc/server";
|
|
87
|
+
import { group } from "@orpc/shared";
|
|
40
88
|
|
|
41
89
|
// src/openapi-error.ts
|
|
42
90
|
var OpenAPIError = class extends Error {
|
|
43
91
|
};
|
|
44
92
|
|
|
45
93
|
// src/openapi-input-structure-parser.ts
|
|
46
|
-
import {
|
|
94
|
+
import { fallbackContractConfig } from "@orpc/contract";
|
|
47
95
|
var OpenAPIInputStructureParser = class {
|
|
48
96
|
constructor(schemaConverter, schemaUtils, pathParser) {
|
|
49
97
|
this.schemaConverter = schemaConverter;
|
|
@@ -51,8 +99,8 @@ var OpenAPIInputStructureParser = class {
|
|
|
51
99
|
this.pathParser = pathParser;
|
|
52
100
|
}
|
|
53
101
|
parse(contract, structure) {
|
|
54
|
-
const inputSchema = this.schemaConverter.convert(contract["~orpc"].
|
|
55
|
-
const method =
|
|
102
|
+
const inputSchema = this.schemaConverter.convert(contract["~orpc"].inputSchema, { strategy: "input" });
|
|
103
|
+
const method = fallbackContractConfig("defaultMethod", contract["~orpc"].route?.method);
|
|
56
104
|
const httpPath = contract["~orpc"].route?.path;
|
|
57
105
|
if (this.schemaUtils.isAnySchema(inputSchema)) {
|
|
58
106
|
return {
|
|
@@ -144,7 +192,7 @@ var OpenAPIOutputStructureParser = class {
|
|
|
144
192
|
this.schemaUtils = schemaUtils;
|
|
145
193
|
}
|
|
146
194
|
parse(contract, structure) {
|
|
147
|
-
const outputSchema = this.schemaConverter.convert(contract["~orpc"].
|
|
195
|
+
const outputSchema = this.schemaConverter.convert(contract["~orpc"].outputSchema, { strategy: "output" });
|
|
148
196
|
if (this.schemaUtils.isAnySchema(outputSchema)) {
|
|
149
197
|
return {
|
|
150
198
|
headersSchema: void 0,
|
|
@@ -183,14 +231,14 @@ var OpenAPIOutputStructureParser = class {
|
|
|
183
231
|
};
|
|
184
232
|
|
|
185
233
|
// src/openapi-parameters-builder.ts
|
|
186
|
-
import { get,
|
|
234
|
+
import { get, isObject, omit } from "@orpc/shared";
|
|
187
235
|
var OpenAPIParametersBuilder = class {
|
|
188
236
|
build(paramIn, jsonSchema, options) {
|
|
189
237
|
const parameters = [];
|
|
190
238
|
for (const name in jsonSchema.properties) {
|
|
191
239
|
const schema = jsonSchema.properties[name];
|
|
192
240
|
const paramExamples = jsonSchema.examples?.filter((example) => {
|
|
193
|
-
return
|
|
241
|
+
return isObject(example) && name in example;
|
|
194
242
|
}).map((example) => {
|
|
195
243
|
return example[name];
|
|
196
244
|
});
|
|
@@ -251,7 +299,7 @@ var CompositeSchemaConverter = class {
|
|
|
251
299
|
};
|
|
252
300
|
|
|
253
301
|
// src/schema-utils.ts
|
|
254
|
-
import {
|
|
302
|
+
import { isObject as isObject2 } from "@orpc/shared";
|
|
255
303
|
|
|
256
304
|
// src/schema.ts
|
|
257
305
|
import * as JSONSchema from "json-schema-typed/draft-2020-12";
|
|
@@ -287,20 +335,20 @@ var NON_LOGIC_KEYWORDS = [
|
|
|
287
335
|
// src/schema-utils.ts
|
|
288
336
|
var SchemaUtils = class {
|
|
289
337
|
isFileSchema(schema) {
|
|
290
|
-
return
|
|
338
|
+
return isObject2(schema) && schema.type === "string" && typeof schema.contentMediaType === "string";
|
|
291
339
|
}
|
|
292
340
|
isObjectSchema(schema) {
|
|
293
|
-
return
|
|
341
|
+
return isObject2(schema) && schema.type === "object";
|
|
294
342
|
}
|
|
295
343
|
isAnySchema(schema) {
|
|
296
|
-
return schema === true || Object.keys(schema).length === 0;
|
|
344
|
+
return schema === true || Object.keys(schema).filter((key) => !NON_LOGIC_KEYWORDS.includes(key)).length === 0;
|
|
297
345
|
}
|
|
298
346
|
isUndefinableSchema(schema) {
|
|
299
347
|
const [matches] = this.filterSchemaBranches(schema, (schema2) => {
|
|
300
348
|
if (typeof schema2 === "boolean") {
|
|
301
349
|
return schema2;
|
|
302
350
|
}
|
|
303
|
-
return Object.keys(schema2).length === 0;
|
|
351
|
+
return Object.keys(schema2).filter((key) => !NON_LOGIC_KEYWORDS.includes(key)).length === 0;
|
|
304
352
|
});
|
|
305
353
|
return matches.length > 0;
|
|
306
354
|
}
|
|
@@ -313,7 +361,7 @@ var SchemaUtils = class {
|
|
|
313
361
|
}, {});
|
|
314
362
|
matched.required = schema.required?.filter((key) => separatedProperties.includes(key));
|
|
315
363
|
matched.examples = schema.examples?.map((example) => {
|
|
316
|
-
if (!
|
|
364
|
+
if (!isObject2(example)) {
|
|
317
365
|
return example;
|
|
318
366
|
}
|
|
319
367
|
return Object.entries(example).reduce((acc, [key, value]) => {
|
|
@@ -329,7 +377,7 @@ var SchemaUtils = class {
|
|
|
329
377
|
}, {});
|
|
330
378
|
rest.required = schema.required?.filter((key) => !separatedProperties.includes(key));
|
|
331
379
|
rest.examples = schema.examples?.map((example) => {
|
|
332
|
-
if (!
|
|
380
|
+
if (!isObject2(example)) {
|
|
333
381
|
return example;
|
|
334
382
|
}
|
|
335
383
|
return Object.entries(example).reduce((acc, [key, value]) => {
|
|
@@ -384,11 +432,12 @@ var OpenAPIGenerator = class {
|
|
|
384
432
|
errorHandlerStrategy;
|
|
385
433
|
ignoreUndefinedPathProcedures;
|
|
386
434
|
considerMissingTagDefinitionAsError;
|
|
435
|
+
strictErrorResponses;
|
|
387
436
|
constructor(options) {
|
|
388
437
|
this.parametersBuilder = options?.parametersBuilder ?? new OpenAPIParametersBuilder();
|
|
389
438
|
this.schemaConverter = new CompositeSchemaConverter(options?.schemaConverters ?? []);
|
|
390
439
|
this.schemaUtils = options?.schemaUtils ?? new SchemaUtils();
|
|
391
|
-
this.jsonSerializer = options?.jsonSerializer ?? new
|
|
440
|
+
this.jsonSerializer = options?.jsonSerializer ?? new OpenAPIJsonSerializer();
|
|
392
441
|
this.contentBuilder = options?.contentBuilder ?? new OpenAPIContentBuilder(this.schemaUtils);
|
|
393
442
|
this.pathParser = new OpenAPIPathParser();
|
|
394
443
|
this.inputStructureParser = options?.inputStructureParser ?? new OpenAPIInputStructureParser(this.schemaConverter, this.schemaUtils, this.pathParser);
|
|
@@ -396,6 +445,7 @@ var OpenAPIGenerator = class {
|
|
|
396
445
|
this.errorHandlerStrategy = options?.errorHandlerStrategy ?? "throw";
|
|
397
446
|
this.ignoreUndefinedPathProcedures = options?.ignoreUndefinedPathProcedures ?? false;
|
|
398
447
|
this.considerMissingTagDefinitionAsError = options?.considerMissingTagDefinitionAsError ?? false;
|
|
448
|
+
this.strictErrorResponses = options?.strictErrorResponses ?? true;
|
|
399
449
|
}
|
|
400
450
|
async generate(router, doc) {
|
|
401
451
|
const builder = new OpenApiBuilder({
|
|
@@ -403,37 +453,186 @@ var OpenAPIGenerator = class {
|
|
|
403
453
|
openapi: "3.1.1"
|
|
404
454
|
});
|
|
405
455
|
const rootTags = doc.tags?.map((tag) => tag.name) ?? [];
|
|
406
|
-
await
|
|
456
|
+
await eachAllContractProcedure({
|
|
457
|
+
path: [],
|
|
458
|
+
router
|
|
459
|
+
}, ({ contract, path }) => {
|
|
407
460
|
try {
|
|
408
461
|
const def = contract["~orpc"];
|
|
409
462
|
if (this.ignoreUndefinedPathProcedures && def.route?.path === void 0) {
|
|
410
463
|
return;
|
|
411
464
|
}
|
|
412
|
-
const method =
|
|
413
|
-
const httpPath = def.route?.path ?
|
|
414
|
-
const
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
465
|
+
const method = fallbackContractConfig2("defaultMethod", def.route?.method);
|
|
466
|
+
const httpPath = def.route?.path ? toOpenAPI31RoutePattern(def.route?.path) : `/${path.map(encodeURIComponent).join("/")}`;
|
|
467
|
+
const { parameters, requestBody } = (() => {
|
|
468
|
+
const eventIteratorSchemaDetails = getEventIteratorSchemaDetails(def.inputSchema);
|
|
469
|
+
if (eventIteratorSchemaDetails) {
|
|
470
|
+
const requestBody3 = {
|
|
471
|
+
required: true,
|
|
472
|
+
content: {
|
|
473
|
+
"text/event-stream": {
|
|
474
|
+
schema: {
|
|
475
|
+
oneOf: [
|
|
476
|
+
{
|
|
477
|
+
type: "object",
|
|
478
|
+
properties: {
|
|
479
|
+
event: { type: "string", const: "message" },
|
|
480
|
+
data: this.schemaConverter.convert(eventIteratorSchemaDetails.yields, { strategy: "input" }),
|
|
481
|
+
id: { type: "string" },
|
|
482
|
+
retry: { type: "number" }
|
|
483
|
+
},
|
|
484
|
+
required: ["event", "data"]
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
type: "object",
|
|
488
|
+
properties: {
|
|
489
|
+
event: { type: "string", const: "done" },
|
|
490
|
+
data: this.schemaConverter.convert(eventIteratorSchemaDetails.returns, { strategy: "input" }),
|
|
491
|
+
id: { type: "string" },
|
|
492
|
+
retry: { type: "number" }
|
|
493
|
+
},
|
|
494
|
+
required: ["event", "data"]
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
type: "object",
|
|
498
|
+
properties: {
|
|
499
|
+
event: { type: "string", const: "error" },
|
|
500
|
+
data: {},
|
|
501
|
+
id: { type: "string" },
|
|
502
|
+
retry: { type: "number" }
|
|
503
|
+
},
|
|
504
|
+
required: ["event", "data"]
|
|
505
|
+
}
|
|
506
|
+
]
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
};
|
|
511
|
+
return { requestBody: requestBody3, parameters: [] };
|
|
512
|
+
}
|
|
513
|
+
const inputStructure = fallbackContractConfig2("defaultInputStructure", def.route?.inputStructure);
|
|
514
|
+
const { paramsSchema, querySchema, headersSchema, bodySchema } = this.inputStructureParser.parse(contract, inputStructure);
|
|
515
|
+
const params = paramsSchema ? this.parametersBuilder.build("path", paramsSchema, {
|
|
516
|
+
required: true
|
|
517
|
+
}) : [];
|
|
518
|
+
const query = querySchema ? this.parametersBuilder.build("query", querySchema) : [];
|
|
519
|
+
const headers = headersSchema ? this.parametersBuilder.build("header", headersSchema) : [];
|
|
520
|
+
const parameters2 = [...params, ...query, ...headers];
|
|
521
|
+
const requestBody2 = bodySchema !== void 0 ? {
|
|
522
|
+
required: this.schemaUtils.isUndefinableSchema(bodySchema),
|
|
523
|
+
content: this.contentBuilder.build(bodySchema)
|
|
524
|
+
} : void 0;
|
|
525
|
+
return { parameters: parameters2, requestBody: requestBody2 };
|
|
526
|
+
})();
|
|
527
|
+
const { responses } = (() => {
|
|
528
|
+
const eventIteratorSchemaDetails = getEventIteratorSchemaDetails(def.outputSchema);
|
|
529
|
+
if (eventIteratorSchemaDetails) {
|
|
530
|
+
const responses3 = {};
|
|
531
|
+
responses3[fallbackContractConfig2("defaultSuccessStatus", def.route?.successStatus)] = {
|
|
532
|
+
description: fallbackContractConfig2("defaultSuccessDescription", def.route?.successDescription),
|
|
533
|
+
content: {
|
|
534
|
+
"text/event-stream": {
|
|
535
|
+
schema: {
|
|
536
|
+
oneOf: [
|
|
537
|
+
{
|
|
538
|
+
type: "object",
|
|
539
|
+
properties: {
|
|
540
|
+
event: { type: "string", const: "message" },
|
|
541
|
+
data: this.schemaConverter.convert(eventIteratorSchemaDetails.yields, { strategy: "input" }),
|
|
542
|
+
id: { type: "string" },
|
|
543
|
+
retry: { type: "number" }
|
|
544
|
+
},
|
|
545
|
+
required: ["event", "data"]
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
type: "object",
|
|
549
|
+
properties: {
|
|
550
|
+
event: { type: "string", const: "done" },
|
|
551
|
+
data: this.schemaConverter.convert(eventIteratorSchemaDetails.returns, { strategy: "input" }),
|
|
552
|
+
id: { type: "string" },
|
|
553
|
+
retry: { type: "number" }
|
|
554
|
+
},
|
|
555
|
+
required: ["event", "data"]
|
|
556
|
+
},
|
|
557
|
+
{
|
|
558
|
+
type: "object",
|
|
559
|
+
properties: {
|
|
560
|
+
event: { type: "string", const: "error" },
|
|
561
|
+
data: {},
|
|
562
|
+
id: { type: "string" },
|
|
563
|
+
retry: { type: "number" }
|
|
564
|
+
},
|
|
565
|
+
required: ["event", "data"]
|
|
566
|
+
}
|
|
567
|
+
]
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
};
|
|
572
|
+
return { responses: responses3 };
|
|
573
|
+
}
|
|
574
|
+
const outputStructure = fallbackContractConfig2("defaultOutputStructure", def.route?.outputStructure);
|
|
575
|
+
const { headersSchema: resHeadersSchema, bodySchema: resBodySchema } = this.outputStructureParser.parse(contract, outputStructure);
|
|
576
|
+
const responses2 = {};
|
|
577
|
+
responses2[fallbackContractConfig2("defaultSuccessStatus", def.route?.successStatus)] = {
|
|
578
|
+
description: fallbackContractConfig2("defaultSuccessDescription", def.route?.successDescription),
|
|
579
|
+
content: resBodySchema !== void 0 ? this.contentBuilder.build(resBodySchema) : void 0,
|
|
580
|
+
headers: resHeadersSchema !== void 0 ? this.parametersBuilder.buildHeadersObject(resHeadersSchema) : void 0
|
|
581
|
+
};
|
|
582
|
+
return { responses: responses2 };
|
|
583
|
+
})();
|
|
584
|
+
const errors = group(Object.entries(def.errorMap ?? {}).filter(([_, config]) => config).map(([code, config]) => ({
|
|
585
|
+
...config,
|
|
586
|
+
code,
|
|
587
|
+
status: fallbackORPCErrorStatus(code, config?.status)
|
|
588
|
+
})), (error) => error.status);
|
|
589
|
+
for (const status in errors) {
|
|
590
|
+
const configs = errors[status];
|
|
591
|
+
if (!configs || configs.length === 0) {
|
|
592
|
+
continue;
|
|
593
|
+
}
|
|
594
|
+
const schemas = configs.map(({ data, code, message }) => {
|
|
595
|
+
const json = {
|
|
596
|
+
type: "object",
|
|
597
|
+
properties: {
|
|
598
|
+
defined: { const: true },
|
|
599
|
+
code: { const: code },
|
|
600
|
+
status: { const: Number(status) },
|
|
601
|
+
message: { type: "string", default: message },
|
|
602
|
+
data: {}
|
|
603
|
+
},
|
|
604
|
+
required: ["defined", "code", "status", "message"]
|
|
605
|
+
};
|
|
606
|
+
if (data) {
|
|
607
|
+
const dataJson = this.schemaConverter.convert(data, { strategy: "output" });
|
|
608
|
+
json.properties.data = dataJson;
|
|
609
|
+
if (!this.schemaUtils.isUndefinableSchema(dataJson)) {
|
|
610
|
+
json.required.push("data");
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
return json;
|
|
614
|
+
});
|
|
615
|
+
if (this.strictErrorResponses) {
|
|
616
|
+
schemas.push({
|
|
617
|
+
type: "object",
|
|
618
|
+
properties: {
|
|
619
|
+
defined: { const: false },
|
|
620
|
+
code: { type: "string" },
|
|
621
|
+
status: { type: "number" },
|
|
622
|
+
message: { type: "string" },
|
|
623
|
+
data: {}
|
|
624
|
+
},
|
|
625
|
+
required: ["defined", "code", "status", "message"]
|
|
626
|
+
});
|
|
627
|
+
}
|
|
628
|
+
const contentSchema = schemas.length === 1 ? schemas[0] : {
|
|
629
|
+
oneOf: schemas
|
|
630
|
+
};
|
|
631
|
+
responses[status] = {
|
|
632
|
+
description: status,
|
|
633
|
+
content: this.contentBuilder.build(contentSchema)
|
|
634
|
+
};
|
|
635
|
+
}
|
|
437
636
|
if (this.considerMissingTagDefinitionAsError && def.route?.tags) {
|
|
438
637
|
const missingTag = def.route?.tags.find((tag) => !rootTags.includes(tag));
|
|
439
638
|
if (missingTag !== void 0) {
|
|
@@ -450,12 +649,11 @@ var OpenAPIGenerator = class {
|
|
|
450
649
|
operationId: path.join("."),
|
|
451
650
|
parameters: parameters.length ? parameters : void 0,
|
|
452
651
|
requestBody,
|
|
453
|
-
responses
|
|
454
|
-
[fallbackToGlobalConfig2("defaultSuccessStatus", def.route?.successStatus)]: successResponse
|
|
455
|
-
}
|
|
652
|
+
responses
|
|
456
653
|
};
|
|
654
|
+
const extendedOperation = extendOperation(operation, contract);
|
|
457
655
|
builder.addPath(httpPath, {
|
|
458
|
-
[method.toLocaleLowerCase()]:
|
|
656
|
+
[method.toLocaleLowerCase()]: extendedOperation
|
|
459
657
|
});
|
|
460
658
|
} catch (e) {
|
|
461
659
|
if (e instanceof OpenAPIError) {
|
|
@@ -474,14 +672,18 @@ var OpenAPIGenerator = class {
|
|
|
474
672
|
}
|
|
475
673
|
}
|
|
476
674
|
});
|
|
477
|
-
return this.jsonSerializer.serialize(builder.getSpec());
|
|
675
|
+
return this.jsonSerializer.serialize(builder.getSpec())[0];
|
|
478
676
|
}
|
|
479
677
|
};
|
|
678
|
+
|
|
679
|
+
// src/index.ts
|
|
680
|
+
var oo = {
|
|
681
|
+
spec: setOperationExtender
|
|
682
|
+
};
|
|
480
683
|
export {
|
|
481
684
|
CompositeSchemaConverter,
|
|
482
685
|
JSONSchema,
|
|
483
686
|
Format as JSONSchemaFormat,
|
|
484
|
-
JSONSerializer,
|
|
485
687
|
NON_LOGIC_KEYWORDS,
|
|
486
688
|
OpenAPIContentBuilder,
|
|
487
689
|
OpenAPIGenerator,
|
|
@@ -489,8 +691,11 @@ export {
|
|
|
489
691
|
OpenAPIPathParser,
|
|
490
692
|
OpenApiBuilder,
|
|
491
693
|
SchemaUtils,
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
694
|
+
extendOperation,
|
|
695
|
+
getOperationExtender,
|
|
696
|
+
oo,
|
|
697
|
+
setOperationExtender,
|
|
698
|
+
standardizeHTTPPath,
|
|
699
|
+
toOpenAPI31RoutePattern
|
|
495
700
|
};
|
|
496
701
|
//# sourceMappingURL=index.js.map
|
package/dist/next.js
ADDED
package/dist/node.js
CHANGED
|
@@ -1,46 +1,30 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
OpenAPICodec,
|
|
3
|
+
OpenAPIMatcher
|
|
4
|
+
} from "./chunk-LTTK3H5J.js";
|
|
5
|
+
import "./chunk-XGHV4TH3.js";
|
|
5
6
|
|
|
6
7
|
// src/adapters/node/openapi-handler.ts
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
import { StandardHandler } from "@orpc/server/standard";
|
|
9
|
+
import { sendStandardResponse, toStandardRequest } from "@orpc/standard-server-node";
|
|
10
|
+
var OpenAPIHandler = class {
|
|
11
|
+
standardHandler;
|
|
12
|
+
constructor(router, options) {
|
|
13
|
+
const matcher = options?.matcher ?? new OpenAPIMatcher();
|
|
14
|
+
const codec = options?.codec ?? new OpenAPICodec();
|
|
15
|
+
this.standardHandler = new StandardHandler(router, matcher, codec, { ...options });
|
|
12
16
|
}
|
|
13
|
-
async handle(req, res, ...
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
if (result.matched === false) {
|
|
17
|
+
async handle(req, res, ...rest) {
|
|
18
|
+
const standardRequest = toStandardRequest(req, res);
|
|
19
|
+
const result = await this.standardHandler.handle(standardRequest, ...rest);
|
|
20
|
+
if (!result.matched) {
|
|
18
21
|
return { matched: false };
|
|
19
22
|
}
|
|
20
|
-
await
|
|
21
|
-
await sendResponse(res, result.response);
|
|
23
|
+
await sendStandardResponse(res, result.response);
|
|
22
24
|
return { matched: true };
|
|
23
25
|
}
|
|
24
26
|
};
|
|
25
|
-
|
|
26
|
-
// src/adapters/node/openapi-handler-server.ts
|
|
27
|
-
import { TrieRouter } from "hono/router/trie-router";
|
|
28
|
-
var OpenAPIServerHandler = class extends OpenAPIHandler2 {
|
|
29
|
-
constructor(router, options) {
|
|
30
|
-
super(new TrieRouter(), router, options);
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
// src/adapters/node/openapi-handler-serverless.ts
|
|
35
|
-
import { LinearRouter } from "hono/router/linear-router";
|
|
36
|
-
var OpenAPIServerlessHandler = class extends OpenAPIHandler2 {
|
|
37
|
-
constructor(router, options) {
|
|
38
|
-
super(new LinearRouter(), router, options);
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
27
|
export {
|
|
42
|
-
|
|
43
|
-
OpenAPIServerHandler,
|
|
44
|
-
OpenAPIServerlessHandler
|
|
28
|
+
OpenAPIHandler
|
|
45
29
|
};
|
|
46
30
|
//# sourceMappingURL=node.js.map
|
|
@@ -1,10 +1,2 @@
|
|
|
1
|
-
export * from './bracket-notation';
|
|
2
|
-
export * from './input-structure-compact';
|
|
3
|
-
export * from './input-structure-detailed';
|
|
4
1
|
export * from './openapi-handler';
|
|
5
|
-
export * from './openapi-handler-server';
|
|
6
|
-
export * from './openapi-handler-serverless';
|
|
7
|
-
export * from './openapi-payload-codec';
|
|
8
|
-
export * from './openapi-procedure-matcher';
|
|
9
|
-
export * from './schema-coercer';
|
|
10
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,32 +1,11 @@
|
|
|
1
|
-
import type { Context, Router
|
|
2
|
-
import type { FetchHandler,
|
|
3
|
-
import type {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { type PublicInputStructureDetailed } from './input-structure-detailed';
|
|
7
|
-
import { type PublicOpenAPIPayloadCodec } from './openapi-payload-codec';
|
|
8
|
-
import { type Hono, type PublicOpenAPIProcedureMatcher } from './openapi-procedure-matcher';
|
|
9
|
-
import { type SchemaCoercer } from './schema-coercer';
|
|
10
|
-
export type OpenAPIHandlerOptions<T extends Context> = Hooks<Request, FetchHandleResult, T, WithSignal> & {
|
|
11
|
-
jsonSerializer?: PublicJSONSerializer;
|
|
12
|
-
procedureMatcher?: PublicOpenAPIProcedureMatcher;
|
|
13
|
-
payloadCodec?: PublicOpenAPIPayloadCodec;
|
|
14
|
-
inputBuilderSimple?: PublicInputStructureCompact;
|
|
15
|
-
inputBuilderFull?: PublicInputStructureDetailed;
|
|
16
|
-
schemaCoercers?: SchemaCoercer[];
|
|
17
|
-
};
|
|
1
|
+
import type { Context, Router } from '@orpc/server';
|
|
2
|
+
import type { FetchHandler, FetchHandleResult } from '@orpc/server/fetch';
|
|
3
|
+
import type { StandardHandleOptions } from '@orpc/server/standard';
|
|
4
|
+
import type { MaybeOptionalOptions } from '@orpc/shared';
|
|
5
|
+
import type { OpenAPIHandlerOptions } from '../standard';
|
|
18
6
|
export declare class OpenAPIHandler<T extends Context> implements FetchHandler<T> {
|
|
19
|
-
private readonly
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
private readonly inputStructureCompact;
|
|
23
|
-
private readonly inputStructureDetailed;
|
|
24
|
-
private readonly compositeSchemaCoercer;
|
|
25
|
-
constructor(hono: Hono, router: Router<T, any>, options?: NoInfer<OpenAPIHandlerOptions<T>> | undefined);
|
|
26
|
-
handle(request: Request, ...[options]: FetchHandleRest<T>): Promise<FetchHandleResult>;
|
|
27
|
-
private decodeInput;
|
|
28
|
-
private encodeOutput;
|
|
29
|
-
private assertDetailedOutput;
|
|
30
|
-
private convertToORPCError;
|
|
7
|
+
private readonly standardHandler;
|
|
8
|
+
constructor(router: Router<T, any>, options?: NoInfer<OpenAPIHandlerOptions<T>>);
|
|
9
|
+
handle(request: Request, ...rest: MaybeOptionalOptions<StandardHandleOptions<T>>): Promise<FetchHandleResult>;
|
|
31
10
|
}
|
|
32
11
|
//# sourceMappingURL=openapi-handler.d.ts.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { Context, Router } from '@orpc/server';
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import
|
|
6
|
-
export declare class OpenAPIHandler<T extends Context> implements
|
|
7
|
-
private readonly
|
|
8
|
-
constructor(
|
|
9
|
-
handle(req:
|
|
2
|
+
import type { NodeHttpHandler, NodeHttpHandleResult, NodeHttpRequest, NodeHttpResponse } from '@orpc/server/node';
|
|
3
|
+
import type { StandardHandleOptions } from '@orpc/server/standard';
|
|
4
|
+
import type { MaybeOptionalOptions } from '@orpc/shared';
|
|
5
|
+
import type { OpenAPIHandlerOptions } from '../standard';
|
|
6
|
+
export declare class OpenAPIHandler<T extends Context> implements NodeHttpHandler<T> {
|
|
7
|
+
private readonly standardHandler;
|
|
8
|
+
constructor(router: Router<T, any>, options?: NoInfer<OpenAPIHandlerOptions<T>>);
|
|
9
|
+
handle(req: NodeHttpRequest, res: NodeHttpResponse, ...rest: MaybeOptionalOptions<StandardHandleOptions<T>>): Promise<NodeHttpHandleResult>;
|
|
10
10
|
}
|
|
11
11
|
//# sourceMappingURL=openapi-handler.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ORPCError } from '@orpc/client';
|
|
2
|
+
import type { AnyProcedure } from '@orpc/server';
|
|
3
|
+
import type { StandardCodec, StandardParams } from '@orpc/server/standard';
|
|
4
|
+
import type { StandardRequest, StandardResponse } from '@orpc/standard-server';
|
|
5
|
+
import { OpenAPISerializer } from '@orpc/client/openapi';
|
|
6
|
+
export declare class OpenAPICodec implements StandardCodec {
|
|
7
|
+
private readonly serializer;
|
|
8
|
+
constructor(serializer?: OpenAPISerializer);
|
|
9
|
+
decode(request: StandardRequest, params: StandardParams | undefined, procedure: AnyProcedure): Promise<unknown>;
|
|
10
|
+
encode(output: unknown, procedure: AnyProcedure): StandardResponse;
|
|
11
|
+
encodeError(error: ORPCError<any, any>): StandardResponse;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=openapi-codec.d.ts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AnyRouter } from '@orpc/server';
|
|
2
|
+
import type { StandardMatcher, StandardMatchResult } from '@orpc/server/standard';
|
|
3
|
+
import { type HTTPPath } from '@orpc/contract';
|
|
4
|
+
export declare class OpenAPIMatcher implements StandardMatcher {
|
|
5
|
+
private readonly tree;
|
|
6
|
+
private pendingRouters;
|
|
7
|
+
init(router: AnyRouter, path?: string[]): void;
|
|
8
|
+
match(method: string, pathname: HTTPPath): Promise<StandardMatchResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=openapi-matcher.d.ts.map
|