typed-openapi 0.1.5 → 0.3.0

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.
@@ -373,6 +373,14 @@ var generateEndpointSchemaList = (ctx) => {
373
373
  ${parameters.query ? `query: ${parameterObjectToString(parameters.query)},` : ""}
374
374
  ${parameters.path ? `path: ${parameterObjectToString(parameters.path)},` : ""}
375
375
  ${parameters.header ? `header: ${parameterObjectToString(parameters.header)},` : ""}
376
+ ${parameters.body ? `body: ${parameterObjectToString(
377
+ ctx.runtime === "none" ? parameters.body.recompute((box) => {
378
+ if (Box.isReference(box) && !box.params.generics) {
379
+ box.value = `Schemas.${box.value}`;
380
+ }
381
+ return box;
382
+ }) : parameters.body
383
+ )},` : ""}
376
384
  }` : "parameters: never,"}
377
385
  response: ${ctx.runtime === "none" ? endpoint.response.recompute((box) => {
378
386
  if (Box.isReference(box) && !box.params.generics) {
@@ -723,7 +731,7 @@ var mapOpenApiEndpoints = (doc) => {
723
731
  }
724
732
  };
725
733
  const lists = { query: [], path: [], header: [] };
726
- const paramObjects = (operation.parameters ?? []).reduce(
734
+ const paramObjects = [...pathItemObj.parameters ?? [], ...operation.parameters ?? []].reduce(
727
735
  (acc, paramOrRef) => {
728
736
  const param = refs.unwrap(paramOrRef);
729
737
  const schema = openApiSchemaToTs({ schema: refs.unwrap(param.schema ?? {}), ctx });
@@ -753,6 +761,7 @@ var mapOpenApiEndpoints = (doc) => {
753
761
  return acc;
754
762
  }, {});
755
763
  if (operation.requestBody) {
764
+ endpoint.meta.hasParameters = true;
756
765
  const requestBody = refs.unwrap(operation.requestBody ?? {});
757
766
  const content2 = requestBody.content;
758
767
  const matchingMediaType = Object.keys(content2).find(isAllowedParamMediaTypes);
@@ -779,15 +788,14 @@ var mapOpenApiEndpoints = (doc) => {
779
788
  endpoint.parameters = Object.keys(params).length ? params : void 0;
780
789
  }
781
790
  let responseObject;
782
- if (operation.responses.default) {
791
+ Object.entries(operation.responses).map(([status, responseOrRef]) => {
792
+ const statusCode = Number(status);
793
+ if (statusCode >= 200 && statusCode < 300) {
794
+ responseObject = refs.unwrap(responseOrRef);
795
+ }
796
+ });
797
+ if (!responseObject && operation.responses.default) {
783
798
  responseObject = refs.unwrap(operation.responses.default);
784
- } else {
785
- Object.entries(operation.responses).map(([status, responseOrRef]) => {
786
- const statusCode = Number(status);
787
- if (statusCode >= 200 && statusCode < 300) {
788
- responseObject = refs.unwrap(responseOrRef);
789
- }
790
- });
791
799
  }
792
800
  const content = responseObject?.content;
793
801
  if (content) {
package/dist/cli.cjs CHANGED
@@ -31,7 +31,7 @@ var import_promises = require("fs/promises");
31
31
 
32
32
  // package.json
33
33
  var name = "typed-openapi";
34
- var version = "0.1.5";
34
+ var version = "0.3.0";
35
35
 
36
36
  // src/generator.ts
37
37
  var import_server2 = require("pastable/server");
@@ -408,6 +408,14 @@ var generateEndpointSchemaList = (ctx) => {
408
408
  ${parameters.query ? `query: ${parameterObjectToString(parameters.query)},` : ""}
409
409
  ${parameters.path ? `path: ${parameterObjectToString(parameters.path)},` : ""}
410
410
  ${parameters.header ? `header: ${parameterObjectToString(parameters.header)},` : ""}
411
+ ${parameters.body ? `body: ${parameterObjectToString(
412
+ ctx.runtime === "none" ? parameters.body.recompute((box) => {
413
+ if (Box.isReference(box) && !box.params.generics) {
414
+ box.value = `Schemas.${box.value}`;
415
+ }
416
+ return box;
417
+ }) : parameters.body
418
+ )},` : ""}
411
419
  }` : "parameters: never,"}
412
420
  response: ${ctx.runtime === "none" ? endpoint.response.recompute((box) => {
413
421
  if (Box.isReference(box) && !box.params.generics) {
@@ -760,7 +768,7 @@ var mapOpenApiEndpoints = (doc) => {
760
768
  }
761
769
  };
762
770
  const lists = { query: [], path: [], header: [] };
763
- const paramObjects = (operation.parameters ?? []).reduce(
771
+ const paramObjects = [...pathItemObj.parameters ?? [], ...operation.parameters ?? []].reduce(
764
772
  (acc, paramOrRef) => {
765
773
  const param = refs.unwrap(paramOrRef);
766
774
  const schema = openApiSchemaToTs({ schema: refs.unwrap(param.schema ?? {}), ctx });
@@ -790,6 +798,7 @@ var mapOpenApiEndpoints = (doc) => {
790
798
  return acc;
791
799
  }, {});
792
800
  if (operation.requestBody) {
801
+ endpoint.meta.hasParameters = true;
793
802
  const requestBody = refs.unwrap(operation.requestBody ?? {});
794
803
  const content2 = requestBody.content;
795
804
  const matchingMediaType = Object.keys(content2).find(isAllowedParamMediaTypes);
@@ -816,15 +825,14 @@ var mapOpenApiEndpoints = (doc) => {
816
825
  endpoint.parameters = Object.keys(params).length ? params : void 0;
817
826
  }
818
827
  let responseObject;
819
- if (operation.responses.default) {
828
+ Object.entries(operation.responses).map(([status, responseOrRef]) => {
829
+ const statusCode = Number(status);
830
+ if (statusCode >= 200 && statusCode < 300) {
831
+ responseObject = refs.unwrap(responseOrRef);
832
+ }
833
+ });
834
+ if (!responseObject && operation.responses.default) {
820
835
  responseObject = refs.unwrap(operation.responses.default);
821
- } else {
822
- Object.entries(operation.responses).map(([status, responseOrRef]) => {
823
- const statusCode = Number(status);
824
- if (statusCode >= 200 && statusCode < 300) {
825
- responseObject = refs.unwrap(responseOrRef);
826
- }
827
- });
828
836
  }
829
837
  const content = responseObject?.content;
830
838
  if (content) {
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  allowedRuntimes,
3
3
  generateFile,
4
4
  mapOpenApiEndpoints
5
- } from "./chunk-RMN2CYTB.js";
5
+ } from "./chunk-6BNKDC6H.js";
6
6
 
7
7
  // src/cli.ts
8
8
  import SwaggerParser from "@apidevtools/swagger-parser";
@@ -13,7 +13,7 @@ import { writeFile } from "fs/promises";
13
13
 
14
14
  // package.json
15
15
  var name = "typed-openapi";
16
- var version = "0.1.5";
16
+ var version = "0.3.0";
17
17
 
18
18
  // src/cli.ts
19
19
  var cwd = process.cwd();
package/dist/index.cjs CHANGED
@@ -416,6 +416,14 @@ var generateEndpointSchemaList = (ctx) => {
416
416
  ${parameters.query ? `query: ${parameterObjectToString(parameters.query)},` : ""}
417
417
  ${parameters.path ? `path: ${parameterObjectToString(parameters.path)},` : ""}
418
418
  ${parameters.header ? `header: ${parameterObjectToString(parameters.header)},` : ""}
419
+ ${parameters.body ? `body: ${parameterObjectToString(
420
+ ctx.runtime === "none" ? parameters.body.recompute((box) => {
421
+ if (Box.isReference(box) && !box.params.generics) {
422
+ box.value = `Schemas.${box.value}`;
423
+ }
424
+ return box;
425
+ }) : parameters.body
426
+ )},` : ""}
419
427
  }` : "parameters: never,"}
420
428
  response: ${ctx.runtime === "none" ? endpoint.response.recompute((box) => {
421
429
  if (Box.isReference(box) && !box.params.generics) {
@@ -768,7 +776,7 @@ var mapOpenApiEndpoints = (doc) => {
768
776
  }
769
777
  };
770
778
  const lists = { query: [], path: [], header: [] };
771
- const paramObjects = (operation.parameters ?? []).reduce(
779
+ const paramObjects = [...pathItemObj.parameters ?? [], ...operation.parameters ?? []].reduce(
772
780
  (acc, paramOrRef) => {
773
781
  const param = refs.unwrap(paramOrRef);
774
782
  const schema = openApiSchemaToTs({ schema: refs.unwrap(param.schema ?? {}), ctx });
@@ -798,6 +806,7 @@ var mapOpenApiEndpoints = (doc) => {
798
806
  return acc;
799
807
  }, {});
800
808
  if (operation.requestBody) {
809
+ endpoint.meta.hasParameters = true;
801
810
  const requestBody = refs.unwrap(operation.requestBody ?? {});
802
811
  const content2 = requestBody.content;
803
812
  const matchingMediaType = Object.keys(content2).find(isAllowedParamMediaTypes);
@@ -824,15 +833,14 @@ var mapOpenApiEndpoints = (doc) => {
824
833
  endpoint.parameters = Object.keys(params).length ? params : void 0;
825
834
  }
826
835
  let responseObject;
827
- if (operation.responses.default) {
836
+ Object.entries(operation.responses).map(([status, responseOrRef]) => {
837
+ const statusCode = Number(status);
838
+ if (statusCode >= 200 && statusCode < 300) {
839
+ responseObject = refs.unwrap(responseOrRef);
840
+ }
841
+ });
842
+ if (!responseObject && operation.responses.default) {
828
843
  responseObject = refs.unwrap(operation.responses.default);
829
- } else {
830
- Object.entries(operation.responses).map(([status, responseOrRef]) => {
831
- const statusCode = Number(status);
832
- if (statusCode >= 200 && statusCode < 300) {
833
- responseObject = refs.unwrap(responseOrRef);
834
- }
835
- });
836
844
  }
837
845
  const content = responseObject?.content;
838
846
  if (content) {
package/dist/index.d.cts CHANGED
@@ -208,7 +208,7 @@ declare const mapOpenApiEndpoints: (doc: OpenAPIObject) => {
208
208
  type MutationMethod = "post" | "put" | "patch" | "delete";
209
209
  type Method = "get" | "head" | "options" | MutationMethod;
210
210
  type EndpointParameters = {
211
- body?: Box;
211
+ body?: Box<BoxRef>;
212
212
  query?: Box<BoxRef> | Record<string, AnyBox>;
213
213
  header?: Box<BoxRef> | Record<string, AnyBox>;
214
214
  path?: Box<BoxRef> | Record<string, AnyBox>;
package/dist/index.d.ts CHANGED
@@ -208,7 +208,7 @@ declare const mapOpenApiEndpoints: (doc: OpenAPIObject) => {
208
208
  type MutationMethod = "post" | "put" | "patch" | "delete";
209
209
  type Method = "get" | "head" | "options" | MutationMethod;
210
210
  type EndpointParameters = {
211
- body?: Box;
211
+ body?: Box<BoxRef>;
212
212
  query?: Box<BoxRef> | Record<string, AnyBox>;
213
213
  header?: Box<BoxRef> | Record<string, AnyBox>;
214
214
  path?: Box<BoxRef> | Record<string, AnyBox>;
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  openApiSchemaToTs,
8
8
  tsFactory,
9
9
  unwrap
10
- } from "./chunk-RMN2CYTB.js";
10
+ } from "./chunk-6BNKDC6H.js";
11
11
  export {
12
12
  createBoxFactory,
13
13
  createFactory,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "typed-openapi",
3
3
  "type": "module",
4
- "version": "0.1.5",
4
+ "version": "0.3.0",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
7
7
  "bin": {
package/src/generator.ts CHANGED
@@ -2,7 +2,7 @@ import { capitalize, groupBy } from "pastable/server";
2
2
  import { Box } from "./box";
3
3
  import { prettify } from "./format";
4
4
  import { mapOpenApiEndpoints } from "./map-openapi-endpoints";
5
- import { AnyBox, BoxRef } from "./types";
5
+ import { AnyBox, AnyBoxDef } from "./types";
6
6
  import * as Codegen from "@sinclair/typebox-codegen";
7
7
  import { match } from "ts-pattern";
8
8
  import { type } from "arktype";
@@ -117,7 +117,7 @@ const generateSchemaList = ({ refs, runtime }: GeneratorContext) => {
117
117
  );
118
118
  };
119
119
 
120
- const parameterObjectToString = (parameters: Box<BoxRef> | Record<string, AnyBox>) => {
120
+ const parameterObjectToString = (parameters: Box<AnyBoxDef> | Record<string, AnyBox>) => {
121
121
  if (parameters instanceof Box) return parameters.value;
122
122
 
123
123
  let str = "{";
@@ -143,6 +143,20 @@ const generateEndpointSchemaList = (ctx: GeneratorContext) => {
143
143
  ${parameters.query ? `query: ${parameterObjectToString(parameters.query)},` : ""}
144
144
  ${parameters.path ? `path: ${parameterObjectToString(parameters.path)},` : ""}
145
145
  ${parameters.header ? `header: ${parameterObjectToString(parameters.header)},` : ""}
146
+ ${
147
+ parameters.body
148
+ ? `body: ${parameterObjectToString(
149
+ ctx.runtime === "none"
150
+ ? parameters.body.recompute((box) => {
151
+ if (Box.isReference(box) && !box.params.generics) {
152
+ box.value = `Schemas.${box.value}`;
153
+ }
154
+ return box;
155
+ })
156
+ : parameters.body,
157
+ )},`
158
+ : ""
159
+ }
146
160
  }`
147
161
  : "parameters: never,"
148
162
  }
@@ -35,7 +35,7 @@ export const mapOpenApiEndpoints = (doc: OpenAPIObject) => {
35
35
 
36
36
  // Build a list of parameters by type + fill an object with all of them
37
37
  const lists = { query: [] as ParameterObject[], path: [] as ParameterObject[], header: [] as ParameterObject[] };
38
- const paramObjects = (operation.parameters ?? []).reduce(
38
+ const paramObjects = [...(pathItemObj.parameters ?? []), ...(operation.parameters ?? [])].reduce(
39
39
  (acc, paramOrRef) => {
40
40
  const param = refs.unwrap(paramOrRef);
41
41
  const schema = openApiSchemaToTs({ schema: refs.unwrap(param.schema ?? {}), ctx });
@@ -72,6 +72,7 @@ export const mapOpenApiEndpoints = (doc: OpenAPIObject) => {
72
72
 
73
73
  // Body
74
74
  if (operation.requestBody) {
75
+ endpoint.meta.hasParameters = true;
75
76
  const requestBody = refs.unwrap(operation.requestBody ?? {});
76
77
  const content = requestBody.content;
77
78
  const matchingMediaType = Object.keys(content).find(isAllowedParamMediaTypes);
@@ -102,17 +103,16 @@ export const mapOpenApiEndpoints = (doc: OpenAPIObject) => {
102
103
  endpoint.parameters = Object.keys(params).length ? (params as any as EndpointParameters) : undefined;
103
104
  }
104
105
 
105
- let responseObject;
106
- // Match the default response or first 2xx-3xx response found
107
- if (operation.responses.default) {
106
+ // Match the first 2xx-3xx response found, or fallback to default one otherwise
107
+ let responseObject: ResponseObject | undefined;
108
+ Object.entries(operation.responses).map(([status, responseOrRef]) => {
109
+ const statusCode = Number(status);
110
+ if (statusCode >= 200 && statusCode < 300) {
111
+ responseObject = refs.unwrap<ResponseObject>(responseOrRef);
112
+ }
113
+ });
114
+ if (!responseObject && operation.responses.default) {
108
115
  responseObject = refs.unwrap(operation.responses.default);
109
- } else {
110
- Object.entries(operation.responses).map(([status, responseOrRef]) => {
111
- const statusCode = Number(status);
112
- if (statusCode >= 200 && statusCode < 300) {
113
- responseObject = refs.unwrap<ResponseObject>(responseOrRef);
114
- }
115
- });
116
116
  }
117
117
 
118
118
  const content = responseObject?.content;
@@ -154,7 +154,7 @@ type MutationMethod = "post" | "put" | "patch" | "delete";
154
154
  type Method = "get" | "head" | "options" | MutationMethod;
155
155
 
156
156
  export type EndpointParameters = {
157
- body?: Box;
157
+ body?: Box<BoxRef>;
158
158
  query?: Box<BoxRef> | Record<string, AnyBox>;
159
159
  header?: Box<BoxRef> | Record<string, AnyBox>;
160
160
  path?: Box<BoxRef> | Record<string, AnyBox>;