@sdk-it/typescript 0.14.0 → 0.14.3
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 +37 -3
- package/dist/index.js +66 -32
- package/dist/index.js.map +3 -3
- package/dist/lib/emitters/interface.d.ts +0 -1
- package/dist/lib/emitters/interface.d.ts.map +1 -1
- package/dist/lib/generate.d.ts.map +1 -1
- package/dist/lib/generator.d.ts.map +1 -1
- package/dist/lib/utils.d.ts +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -37,14 +37,14 @@ await generate(spec, {
|
|
|
37
37
|
import { generate } from '@sdk-it/typescript';
|
|
38
38
|
|
|
39
39
|
// Fetch remote OpenAPI specification
|
|
40
|
-
const spec = await fetch('https://
|
|
41
|
-
|
|
40
|
+
const spec = await fetch('https://api.openstatus.dev/v1/openapi').then((res) =>
|
|
41
|
+
res.json(),
|
|
42
42
|
);
|
|
43
43
|
|
|
44
44
|
// Generate client SDK
|
|
45
45
|
await generate(spec, {
|
|
46
46
|
output: './client',
|
|
47
|
-
name: '
|
|
47
|
+
name: 'OpenStatus',
|
|
48
48
|
});
|
|
49
49
|
```
|
|
50
50
|
|
|
@@ -67,3 +67,37 @@ await generate(spec, {
|
|
|
67
67
|
},
|
|
68
68
|
});
|
|
69
69
|
```
|
|
70
|
+
|
|
71
|
+
### Run the script
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# using recent versions of node
|
|
75
|
+
node --experimental-strip-types ./openapi.ts
|
|
76
|
+
|
|
77
|
+
# using node < 22
|
|
78
|
+
npx tsx ./openapi.ts
|
|
79
|
+
|
|
80
|
+
# using bun
|
|
81
|
+
bun ./openapi.ts
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- Use the generated SDK
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { OpenStatus } from './client';
|
|
88
|
+
|
|
89
|
+
const client = new Client({
|
|
90
|
+
baseUrl: 'https://api.openstatus.dev/v1/',
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const [result, error] = await client.request('GET /status_report', {});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Using with Your Favorite Frameworks
|
|
97
|
+
|
|
98
|
+
The SDK works great on its own, but you might want to native integration with your frameworks:
|
|
99
|
+
|
|
100
|
+
- [React Query](../../docs/react-query.md)
|
|
101
|
+
- [Angular](../../docs/angular.md)
|
|
102
|
+
|
|
103
|
+
Let us know what are you using, and we will help you integrate it.
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { getFolderExports, methods, writeFiles } from "@sdk-it/core";
|
|
|
6
6
|
// packages/typescript/src/lib/generator.ts
|
|
7
7
|
import { get as get2, merge } from "lodash-es";
|
|
8
8
|
import { camelcase as camelcase2, pascalcase, spinalcase as spinalcase2 } from "stringcase";
|
|
9
|
+
import { removeDuplicates as removeDuplicates3 } from "@sdk-it/core";
|
|
9
10
|
|
|
10
11
|
// packages/typescript/src/lib/utils.ts
|
|
11
12
|
import { get } from "lodash-es";
|
|
@@ -276,7 +277,7 @@ function generateSDK(spec) {
|
|
|
276
277
|
|
|
277
278
|
// packages/typescript/src/lib/utils.ts
|
|
278
279
|
function isRef(obj) {
|
|
279
|
-
return "$ref" in obj;
|
|
280
|
+
return obj && "$ref" in obj;
|
|
280
281
|
}
|
|
281
282
|
function cleanRef(ref) {
|
|
282
283
|
return ref.replace(/^#\//, "");
|
|
@@ -294,12 +295,15 @@ function followRef(spec, ref) {
|
|
|
294
295
|
}
|
|
295
296
|
return entry;
|
|
296
297
|
}
|
|
297
|
-
function securityToOptions(security2,
|
|
298
|
-
|
|
298
|
+
function securityToOptions(security2, securitySchemes, staticIn) {
|
|
299
|
+
securitySchemes ??= {};
|
|
299
300
|
const options = {};
|
|
300
301
|
for (const it of security2) {
|
|
301
302
|
const [name] = Object.keys(it);
|
|
302
|
-
|
|
303
|
+
if (!name) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const schema = securitySchemes[name];
|
|
303
307
|
if (isRef(schema)) {
|
|
304
308
|
throw new Error(`Ref security schemas are not supported`);
|
|
305
309
|
}
|
|
@@ -682,7 +686,7 @@ var ZodDeserialzer = class {
|
|
|
682
686
|
normal(type, schema, required = false, nullable = false) {
|
|
683
687
|
switch (type) {
|
|
684
688
|
case "string":
|
|
685
|
-
return `${this.string(schema)}${this.#suffixes(schema.default, required, nullable)}`;
|
|
689
|
+
return `${this.string(schema)}${this.#suffixes(JSON.stringify(schema.default), required, nullable)}`;
|
|
686
690
|
case "number":
|
|
687
691
|
case "integer": {
|
|
688
692
|
const { base, defaultValue } = this.number(schema);
|
|
@@ -691,7 +695,7 @@ var ZodDeserialzer = class {
|
|
|
691
695
|
case "boolean":
|
|
692
696
|
return `z.boolean()${this.#suffixes(schema.default, required, nullable)}`;
|
|
693
697
|
case "object":
|
|
694
|
-
return this.object(schema,
|
|
698
|
+
return this.object(schema, true);
|
|
695
699
|
case "array":
|
|
696
700
|
return this.array(schema, required);
|
|
697
701
|
case "null":
|
|
@@ -742,13 +746,13 @@ var ZodDeserialzer = class {
|
|
|
742
746
|
}
|
|
743
747
|
oneOf(schemas, required) {
|
|
744
748
|
const oneOfSchemas = schemas.map((sub) => {
|
|
745
|
-
if (
|
|
749
|
+
if (isRef(sub)) {
|
|
746
750
|
const { model } = parseRef(sub.$ref);
|
|
747
751
|
if (this.circularRefTracker.has(model)) {
|
|
748
752
|
return model;
|
|
749
753
|
}
|
|
750
754
|
}
|
|
751
|
-
return this.handle(sub,
|
|
755
|
+
return this.handle(sub, true);
|
|
752
756
|
});
|
|
753
757
|
if (oneOfSchemas.length === 1) {
|
|
754
758
|
return oneOfSchemas[0];
|
|
@@ -853,7 +857,7 @@ var ZodDeserialzer = class {
|
|
|
853
857
|
if (schema.anyOf && Array.isArray(schema.anyOf)) {
|
|
854
858
|
return this.anyOf(schema.anyOf ?? [], required);
|
|
855
859
|
}
|
|
856
|
-
if (schema.oneOf && Array.isArray(schema.oneOf)) {
|
|
860
|
+
if (schema.oneOf && Array.isArray(schema.oneOf) && schema.oneOf.length) {
|
|
857
861
|
return this.oneOf(schema.oneOf ?? [], required);
|
|
858
862
|
}
|
|
859
863
|
if (schema.enum && Array.isArray(schema.enum)) {
|
|
@@ -869,7 +873,7 @@ var ZodDeserialzer = class {
|
|
|
869
873
|
if (types.length > 1) {
|
|
870
874
|
const realTypes = types.filter((t) => t !== "null");
|
|
871
875
|
if (realTypes.length === 1 && types.includes("null")) {
|
|
872
|
-
return this.normal(realTypes[0], schema,
|
|
876
|
+
return this.normal(realTypes[0], schema, required, true);
|
|
873
877
|
}
|
|
874
878
|
const subSchemas = types.map((t) => this.normal(t, schema, false));
|
|
875
879
|
return `z.union([${subSchemas.join(", ")}])${appendOptional2(required)}`;
|
|
@@ -881,11 +885,11 @@ function appendOptional2(isRequired) {
|
|
|
881
885
|
return isRequired ? "" : ".optional()";
|
|
882
886
|
}
|
|
883
887
|
function appendDefault(defaultValue) {
|
|
884
|
-
return defaultValue !== void 0 ? `.default(${
|
|
888
|
+
return defaultValue !== void 0 ? `.default(${defaultValue})` : "";
|
|
885
889
|
}
|
|
886
890
|
|
|
887
891
|
// packages/typescript/src/lib/generator.ts
|
|
888
|
-
var
|
|
892
|
+
var statusCdeToMessageMap = {
|
|
889
893
|
"400": "BadRequest",
|
|
890
894
|
"401": "Unauthorized",
|
|
891
895
|
"402": "PaymentRequired",
|
|
@@ -930,7 +934,8 @@ function generateCode(config) {
|
|
|
930
934
|
});
|
|
931
935
|
const groups = {};
|
|
932
936
|
const outputs = {};
|
|
933
|
-
for (const [path,
|
|
937
|
+
for (const [path, pathItem] of Object.entries(config.spec.paths ?? {})) {
|
|
938
|
+
const { parameters = [], ...methods2 } = pathItem;
|
|
934
939
|
for (const [method, operation] of Object.entries(methods2)) {
|
|
935
940
|
const formatOperationId = config.operationId ?? defaults.operationId;
|
|
936
941
|
const operationName = formatOperationId(operation, path, method);
|
|
@@ -939,7 +944,7 @@ function generateCode(config) {
|
|
|
939
944
|
groups[groupName] ??= [];
|
|
940
945
|
const inputs = {};
|
|
941
946
|
const additionalProperties = [];
|
|
942
|
-
for (const param of operation.parameters ?? []) {
|
|
947
|
+
for (const param of [...parameters, ...operation.parameters ?? []]) {
|
|
943
948
|
if (isRef(param)) {
|
|
944
949
|
throw new Error(`Found reference in parameter ${param.$ref}`);
|
|
945
950
|
}
|
|
@@ -953,8 +958,8 @@ function generateCode(config) {
|
|
|
953
958
|
additionalProperties.push(param);
|
|
954
959
|
}
|
|
955
960
|
const security2 = operation.security ?? [];
|
|
956
|
-
const
|
|
957
|
-
const securityOptions = securityToOptions(security2,
|
|
961
|
+
const securitySchemes = config.spec.components?.securitySchemes ?? {};
|
|
962
|
+
const securityOptions = securityToOptions(security2, securitySchemes);
|
|
958
963
|
Object.assign(inputs, securityOptions);
|
|
959
964
|
additionalProperties.push(
|
|
960
965
|
...Object.entries(securityOptions).map(
|
|
@@ -1029,6 +1034,8 @@ function generateCode(config) {
|
|
|
1029
1034
|
let foundResponse = false;
|
|
1030
1035
|
const output = [`import z from 'zod';`];
|
|
1031
1036
|
let parser = "buffered";
|
|
1037
|
+
const responses = [];
|
|
1038
|
+
const responsesImports = {};
|
|
1032
1039
|
for (const status in operation.responses) {
|
|
1033
1040
|
const response = isRef(
|
|
1034
1041
|
operation.responses[status]
|
|
@@ -1038,7 +1045,7 @@ function generateCode(config) {
|
|
|
1038
1045
|
) : operation.responses[status];
|
|
1039
1046
|
const statusCode = +status;
|
|
1040
1047
|
if (statusCode >= 400) {
|
|
1041
|
-
errors.push(
|
|
1048
|
+
errors.push(statusCdeToMessageMap[status] ?? "ProblematicResponse");
|
|
1042
1049
|
}
|
|
1043
1050
|
if (statusCode >= 200 && statusCode < 300) {
|
|
1044
1051
|
foundResponse = true;
|
|
@@ -1047,30 +1054,41 @@ function generateCode(config) {
|
|
|
1047
1054
|
if ((response.headers ?? {})["Transfer-Encoding"]) {
|
|
1048
1055
|
parser = "chunked";
|
|
1049
1056
|
}
|
|
1050
|
-
const imports = [];
|
|
1051
1057
|
const typeScriptDeserialzer = new TypeScriptDeserialzer(
|
|
1052
1058
|
config.spec,
|
|
1053
1059
|
(schemaName, zod) => {
|
|
1054
1060
|
commonSchemas[schemaName] = zod;
|
|
1055
|
-
|
|
1061
|
+
responsesImports[schemaName] = {
|
|
1056
1062
|
defaultImport: void 0,
|
|
1057
1063
|
isTypeOnly: true,
|
|
1058
1064
|
moduleSpecifier: `../models/${config.makeImport(schemaName)}`,
|
|
1059
1065
|
namedImports: [{ isTypeOnly: true, name: schemaName }],
|
|
1060
1066
|
namespaceImport: void 0
|
|
1061
|
-
}
|
|
1067
|
+
};
|
|
1062
1068
|
}
|
|
1063
1069
|
);
|
|
1064
1070
|
const responseSchema = isJson ? typeScriptDeserialzer.handle(
|
|
1065
1071
|
responseContent["application/json"].schema,
|
|
1066
1072
|
true
|
|
1067
|
-
) : "ReadableStream";
|
|
1068
|
-
|
|
1069
|
-
output.push(
|
|
1070
|
-
`export type ${pascalcase(operationName + " output")} = ${responseSchema}`
|
|
1071
|
-
);
|
|
1073
|
+
) : statusCode === 204 ? "void" : "ReadableStream";
|
|
1074
|
+
responses.push(responseSchema);
|
|
1072
1075
|
}
|
|
1073
1076
|
}
|
|
1077
|
+
if (responses.length > 1) {
|
|
1078
|
+
output.push(
|
|
1079
|
+
`export type ${pascalcase(operationName + " output")} = ${removeDuplicates3(
|
|
1080
|
+
responses,
|
|
1081
|
+
(it) => it
|
|
1082
|
+
).join(" | ")};`
|
|
1083
|
+
);
|
|
1084
|
+
} else {
|
|
1085
|
+
output.push(
|
|
1086
|
+
`export type ${pascalcase(operationName + " output")} = ${responses[0]};`
|
|
1087
|
+
);
|
|
1088
|
+
}
|
|
1089
|
+
output.push(
|
|
1090
|
+
...useImports(output.join(""), Object.values(responsesImports))
|
|
1091
|
+
);
|
|
1074
1092
|
if (!foundResponse) {
|
|
1075
1093
|
output.push(
|
|
1076
1094
|
`export type ${pascalcase(operationName + " output")} = void`
|
|
@@ -1107,12 +1125,27 @@ function toProps(spec, schemaOrRef, aggregator = []) {
|
|
|
1107
1125
|
aggregator.push(name);
|
|
1108
1126
|
}
|
|
1109
1127
|
return void 0;
|
|
1128
|
+
} else if ((schemaOrRef.type === "array" || schemaOrRef.type?.includes("array")) && schemaOrRef.items) {
|
|
1129
|
+
toProps(spec, schemaOrRef.items, aggregator);
|
|
1130
|
+
return void 0;
|
|
1110
1131
|
} else if (schemaOrRef.allOf) {
|
|
1111
1132
|
for (const it of schemaOrRef.allOf) {
|
|
1112
1133
|
toProps(spec, it, aggregator);
|
|
1113
1134
|
}
|
|
1114
1135
|
return void 0;
|
|
1136
|
+
} else if (schemaOrRef.oneOf) {
|
|
1137
|
+
for (const it of schemaOrRef.oneOf) {
|
|
1138
|
+
toProps(spec, it, aggregator);
|
|
1139
|
+
}
|
|
1140
|
+
return void 0;
|
|
1141
|
+
} else if (schemaOrRef.anyOf) {
|
|
1142
|
+
for (const it of schemaOrRef.anyOf) {
|
|
1143
|
+
toProps(spec, it, aggregator);
|
|
1144
|
+
}
|
|
1145
|
+
return void 0;
|
|
1115
1146
|
}
|
|
1147
|
+
console.warn("Unknown schema in body", schemaOrRef);
|
|
1148
|
+
return void 0;
|
|
1116
1149
|
}
|
|
1117
1150
|
function bodyInputs(config, ctSchema) {
|
|
1118
1151
|
const props = [];
|
|
@@ -1139,7 +1172,7 @@ var parse_response_default = 'import { parse } from "fast-content-type-parse";\n
|
|
|
1139
1172
|
var parser_default = "import { z } from 'zod';\n\nexport type ParseError<T extends z.ZodType<any, any, any>> = {\n kind: 'parse';\n} & z.inferFlattenedErrors<T>;\n\nexport function parse<T extends z.ZodType>(\n schema: T,\n input: unknown,\n) {\n const result = schema.safeParse(input);\n if (!result.success) {\n const errors = result.error.flatten((issue) => issue);\n return [null, errors];\n }\n return [result.data as z.infer<T>, null];\n}\n";
|
|
1140
1173
|
|
|
1141
1174
|
// packages/typescript/src/lib/http/request.txt
|
|
1142
|
-
var request_default = "export type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\nexport type ContentType = 'xml' | 'json' | 'urlencoded' | 'multipart';\nexport type Endpoint =\n | `${ContentType} ${Method} ${string}`\n | `${Method} ${string}`;\n\nexport type BodyInit =\n | ArrayBuffer\n | Blob\n | FormData\n | URLSearchParams\n | null\n | string;\n\nexport function createUrl(path: string, query: URLSearchParams) {\n const url = new URL(path, `local://`);\n url.search = query.toString();\n return url;\n}\n\nfunction template(\n templateString: string,\n templateVariables: Record<string, any>,\n): string {\n const nargs = /{([0-9a-zA-Z_]+)}/g;\n return templateString.replace(nargs, (match, key: string, index: number) => {\n // Handle escaped double braces\n if (\n templateString[index - 1] === '{' &&\n templateString[index + match.length] === '}'\n ) {\n return key;\n }\n\n const result = key in templateVariables ? templateVariables[key] : null;\n return result === null || result === undefined ? '' : String(result);\n });\n}\n\ntype Input = Record<string, any>;\ntype Props = {\n inputHeaders: string[];\n inputQuery: string[];\n inputBody: string[];\n inputParams: string[];\n};\n\nabstract class Serializer {\n protected input: Input;\n protected props: Props;\n\n constructor(\n input: Input,\n props: Props,\n ) {\n this.input = input;\n this.props = props;\n }\n\n abstract getBody(): BodyInit | null;\n abstract getHeaders(): Record<string, string>;\n serialize(): Serialized {\n const headers = new Headers({});\n for (const header of this.props.inputHeaders) {\n headers.set(header, this.input[header]);\n }\n\n const query = new URLSearchParams();\n for (const key of this.props.inputQuery) {\n const value = this.input[key];\n if (value !== undefined) {\n query.set(key, String(value));\n }\n }\n\n const params = this.props.inputParams.reduce<Record<string, any>>(\n (acc, key) => {\n acc[key] = this.input[key];\n return acc;\n },\n {},\n );\n\n return {\n body: this.getBody(),\n query,\n params,\n headers: this.getHeaders(),\n };\n }\n}\n\ninterface Serialized {\n body: BodyInit | null;\n query: URLSearchParams;\n params: Record<string, any>;\n headers: Record<string, string>;\n}\n\nclass JsonSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body: Record<string, any> = {};\n for (const prop of this.props.inputBody) {\n body[prop] = this.input[prop];\n }\n return JSON.stringify(body);\n }\n getHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n }\n}\n\nclass UrlencodedSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new URLSearchParams();\n for (const prop of this.props.inputBody) {\n body.set(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass NoBodySerializer extends Serializer {\n getBody(): BodyInit | null {\n return null;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass FormDataSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new FormData();\n for (const prop of this.props.inputBody) {\n body.append(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nexport function json(input: Input, props: Props) {\n return new JsonSerializer(input, props).serialize();\n}\nexport function urlencoded(input: Input, props: Props) {\n return new UrlencodedSerializer(input, props).serialize();\n}\nexport function nobody(input: Input, props: Props) {\n return new NoBodySerializer(input, props).serialize();\n}\nexport function formdata(input: Input, props: Props) {\n return new FormDataSerializer(input, props).serialize();\n}\n\nexport function toRequest<T extends Endpoint>(\n endpoint: T,\n input: Serialized,\n): Request {\n const [method, path] = endpoint.split(' ');\n const pathVariable = template(path, input.params);\n\n const url = createUrl(pathVariable, input.query);\n return new Request(url, {\n method: method,\n headers: input.headers,\n body: method === 'GET' ? undefined : input.body,\n });\n}\n";
|
|
1175
|
+
var request_default = "export type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\nexport type ContentType = 'xml' | 'json' | 'urlencoded' | 'multipart' | 'formdata';\nexport type Endpoint =\n | `${ContentType} ${Method} ${string}`\n | `${Method} ${string}`;\n\nexport type BodyInit =\n | ArrayBuffer\n | Blob\n | FormData\n | URLSearchParams\n | null\n | string;\n\nexport function createUrl(path: string, query: URLSearchParams) {\n const url = new URL(path, `local://`);\n url.search = query.toString();\n return url;\n}\n\nfunction template(\n templateString: string,\n templateVariables: Record<string, any>,\n): string {\n const nargs = /{([0-9a-zA-Z_]+)}/g;\n return templateString.replace(nargs, (match, key: string, index: number) => {\n // Handle escaped double braces\n if (\n templateString[index - 1] === '{' &&\n templateString[index + match.length] === '}'\n ) {\n return key;\n }\n\n const result = key in templateVariables ? templateVariables[key] : null;\n return result === null || result === undefined ? '' : String(result);\n });\n}\n\ntype Input = Record<string, any>;\ntype Props = {\n inputHeaders: string[];\n inputQuery: string[];\n inputBody: string[];\n inputParams: string[];\n};\n\nabstract class Serializer {\n protected input: Input;\n protected props: Props;\n\n constructor(\n input: Input,\n props: Props,\n ) {\n this.input = input;\n this.props = props;\n }\n\n abstract getBody(): BodyInit | null;\n abstract getHeaders(): Record<string, string>;\n serialize(): Serialized {\n const headers = new Headers({});\n for (const header of this.props.inputHeaders) {\n headers.set(header, this.input[header]);\n }\n\n const query = new URLSearchParams();\n for (const key of this.props.inputQuery) {\n const value = this.input[key];\n if (value !== undefined) {\n query.set(key, String(value));\n }\n }\n\n const params = this.props.inputParams.reduce<Record<string, any>>(\n (acc, key) => {\n acc[key] = this.input[key];\n return acc;\n },\n {},\n );\n\n return {\n body: this.getBody(),\n query,\n params,\n headers: this.getHeaders(),\n };\n }\n}\n\ninterface Serialized {\n body: BodyInit | null;\n query: URLSearchParams;\n params: Record<string, any>;\n headers: Record<string, string>;\n}\n\nclass JsonSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body: Record<string, any> = {};\n for (const prop of this.props.inputBody) {\n body[prop] = this.input[prop];\n }\n return JSON.stringify(body);\n }\n getHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n }\n}\n\nclass UrlencodedSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new URLSearchParams();\n for (const prop of this.props.inputBody) {\n body.set(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass NoBodySerializer extends Serializer {\n getBody(): BodyInit | null {\n return null;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass FormDataSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new FormData();\n for (const prop of this.props.inputBody) {\n body.append(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nexport function json(input: Input, props: Props) {\n return new JsonSerializer(input, props).serialize();\n}\nexport function urlencoded(input: Input, props: Props) {\n return new UrlencodedSerializer(input, props).serialize();\n}\nexport function nobody(input: Input, props: Props) {\n return new NoBodySerializer(input, props).serialize();\n}\nexport function formdata(input: Input, props: Props) {\n return new FormDataSerializer(input, props).serialize();\n}\n\nexport function toRequest<T extends Endpoint>(\n endpoint: T,\n input: Serialized,\n): Request {\n const [method, path] = endpoint.split(' ');\n const pathVariable = template(path, input.params);\n\n const url = createUrl(pathVariable, input.query);\n return new Request(url, {\n method: method,\n headers: input.headers,\n body: method === 'GET' ? undefined : input.body,\n });\n}\n";
|
|
1143
1176
|
|
|
1144
1177
|
// packages/typescript/src/lib/http/response.txt
|
|
1145
1178
|
var response_default = "export interface ApiResponse<Status extends number, Body extends unknown> {\n kind: 'response';\n status: Status;\n body: Body;\n}\n\n// 4xx Client Errors\nexport type BadRequest = ApiResponse<400, { message: string }>;\nexport type Unauthorized = ApiResponse<401, { message: string }>;\nexport type PaymentRequired = ApiResponse<402, { message: string }>;\nexport type Forbidden = ApiResponse<403, { message: string }>;\nexport type NotFound = ApiResponse<404, { message: string }>;\nexport type MethodNotAllowed = ApiResponse<405, { message: string }>;\nexport type NotAcceptable = ApiResponse<406, { message: string }>;\nexport type Conflict = ApiResponse<409, { message: string }>;\nexport type Gone = ApiResponse<410, { message: string }>;\nexport type UnprocessableEntity = ApiResponse<422, { message: string; errors?: Record<string, string[]> }>;\nexport type TooManyRequests = ApiResponse<429, { message: string; retryAfter?: string }>;\nexport type PayloadTooLarge = ApiResponse<413, { message: string; }>;\nexport type UnsupportedMediaType = ApiResponse<415, { message: string; }>;\n\n// 5xx Server Errors\nexport type InternalServerError = ApiResponse<500, { message: string }>;\nexport type NotImplemented = ApiResponse<501, { message: string }>;\nexport type BadGateway = ApiResponse<502, { message: string }>;\nexport type ServiceUnavailable = ApiResponse<503, { message: string; retryAfter?: string }>;\nexport type GatewayTimeout = ApiResponse<504, { message: string }>;\n\nexport type ClientError =\n | BadRequest\n | Unauthorized\n | PaymentRequired\n | Forbidden\n | NotFound\n | MethodNotAllowed\n | NotAcceptable\n | Conflict\n | Gone\n | UnprocessableEntity\n | TooManyRequests;\n\nexport type ServerError =\n | InternalServerError\n | NotImplemented\n | BadGateway\n | ServiceUnavailable\n | GatewayTimeout;\n\nexport type ProblematicResponse = ClientError | ServerError;\n";
|
|
@@ -1151,9 +1184,9 @@ var send_request_default = "\nexport interface RequestSchema {\n schema: z.ZodT
|
|
|
1151
1184
|
function security(spec) {
|
|
1152
1185
|
const security2 = spec.security || [];
|
|
1153
1186
|
const components = spec.components || {};
|
|
1154
|
-
const
|
|
1187
|
+
const securitySchemes = components.securitySchemes || {};
|
|
1155
1188
|
const paths = Object.values(spec.paths ?? {});
|
|
1156
|
-
const options = securityToOptions(security2,
|
|
1189
|
+
const options = securityToOptions(security2, securitySchemes);
|
|
1157
1190
|
for (const it of paths) {
|
|
1158
1191
|
for (const method of methods) {
|
|
1159
1192
|
const operation = it[method];
|
|
@@ -1162,7 +1195,7 @@ function security(spec) {
|
|
|
1162
1195
|
}
|
|
1163
1196
|
Object.assign(
|
|
1164
1197
|
options,
|
|
1165
|
-
securityToOptions(operation.security || [],
|
|
1198
|
+
securityToOptions(operation.security || [], securitySchemes, "input")
|
|
1166
1199
|
);
|
|
1167
1200
|
}
|
|
1168
1201
|
}
|
|
@@ -1226,7 +1259,6 @@ ${send_request_default}`,
|
|
|
1226
1259
|
)
|
|
1227
1260
|
});
|
|
1228
1261
|
const folders = [
|
|
1229
|
-
getFolderExports(output, settings.useTsExtension),
|
|
1230
1262
|
getFolderExports(join(output, "outputs"), settings.useTsExtension),
|
|
1231
1263
|
getFolderExports(
|
|
1232
1264
|
join(output, "inputs"),
|
|
@@ -1241,14 +1273,16 @@ ${send_request_default}`,
|
|
|
1241
1273
|
getFolderExports(join(output, "models"), settings.useTsExtension)
|
|
1242
1274
|
);
|
|
1243
1275
|
}
|
|
1244
|
-
const [
|
|
1276
|
+
const [outputIndex, inputsIndex, httpIndex, modelsIndex] = await Promise.all(folders);
|
|
1245
1277
|
await writeFiles(output, {
|
|
1246
|
-
"index.ts": index,
|
|
1247
1278
|
"outputs/index.ts": outputIndex,
|
|
1248
1279
|
"inputs/index.ts": inputsIndex || null,
|
|
1249
1280
|
"http/index.ts": httpIndex,
|
|
1250
1281
|
...modelsImports.length ? { "models/index.ts": modelsIndex } : {}
|
|
1251
1282
|
});
|
|
1283
|
+
await writeFiles(output, {
|
|
1284
|
+
"index.ts": await getFolderExports(output, settings.useTsExtension)
|
|
1285
|
+
});
|
|
1252
1286
|
if (settings.mode === "full") {
|
|
1253
1287
|
await writeFiles(settings.output, {
|
|
1254
1288
|
"package.json": {
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/lib/generate.ts", "../src/lib/generator.ts", "../src/lib/utils.ts", "../src/lib/sdk.ts", "../src/lib/client.ts", "../src/lib/emitters/interface.ts", "../src/lib/emitters/zod.ts", "../src/lib/http/interceptors.txt", "../src/lib/http/parse-response.txt", "../src/lib/http/parser.txt", "../src/lib/http/request.txt", "../src/lib/http/response.txt", "../src/lib/http/send-request.txt", "../src/lib/watcher.ts"],
|
|
4
|
-
"sourcesContent": ["import { join } from 'node:path';\nimport { npmRunPathEnv } from 'npm-run-path';\nimport type { OpenAPIObject } from 'openapi3-ts/oas31';\n\nimport { getFolderExports, methods, writeFiles } from '@sdk-it/core';\n\nimport { generateCode } from './generator.ts';\nimport interceptors from './http/interceptors.txt';\nimport parseResponse from './http/parse-response.txt';\nimport parserTxt from './http/parser.txt';\nimport requestTxt from './http/request.txt';\nimport responseTxt from './http/response.txt';\nimport sendRequest from './http/send-request.txt';\nimport { generateInputs, generateSDK } from './sdk.ts';\nimport { exclude, securityToOptions } from './utils.ts';\n\nfunction security(spec: OpenAPIObject) {\n const security = spec.security || [];\n const components = spec.components || {};\n const securitySchemas = components.securitySchemes || {};\n const paths = Object.values(spec.paths ?? {});\n\n const options = securityToOptions(security, securitySchemas);\n\n for (const it of paths) {\n for (const method of methods) {\n const operation = it[method];\n if (!operation) {\n continue;\n }\n Object.assign(\n options,\n securityToOptions(operation.security || [], securitySchemas, 'input'),\n );\n }\n }\n return options;\n}\n\nexport async function generate(\n spec: OpenAPIObject,\n settings: {\n output: string;\n useTsExtension?: boolean;\n name?: string;\n /**\n * full: generate a full project including package.json and tsconfig.json. useful for monorepo/workspaces\n * minimal: generate only the client sdk\n */\n mode?: 'full' | 'minimal';\n formatCode?: (options: {\n output: string;\n env: ReturnType<typeof npmRunPathEnv>;\n }) => void | Promise<void>;\n },\n) {\n settings.useTsExtension ??= true;\n const makeImport = (moduleSpecifier: string) => {\n return settings.useTsExtension ? `${moduleSpecifier}.ts` : moduleSpecifier;\n };\n const { commonSchemas, groups, outputs, commonZod } = generateCode({\n spec,\n style: 'github',\n target: 'javascript',\n makeImport,\n });\n const output =\n settings.mode === 'full' ? join(settings.output, 'src') : settings.output;\n\n const options = security(spec);\n\n const clientFiles = generateSDK({\n name: settings.name || 'Client',\n operations: groups,\n servers: spec.servers?.map((server) => server.url) || [],\n options: options,\n makeImport,\n });\n\n // const readme = generateReadme(spec, {\n // name: settings.name || 'Client',\n // });\n\n const inputFiles = generateInputs(groups, commonZod, makeImport);\n\n await writeFiles(output, {\n 'outputs/.gitkeep': '',\n 'inputs/.gitkeep': '',\n 'models/.getkeep': '',\n // 'README.md': readme,\n });\n\n await writeFiles(join(output, 'http'), {\n 'interceptors.ts': interceptors,\n 'parse-response.ts': parseResponse,\n 'send-request.ts': `import z from 'zod';\nimport type { Interceptor } from './${makeImport('interceptors')}';\nimport { handleError } from './${makeImport('parse-response')}';\nimport { parse } from './${makeImport('parser')}';\n${sendRequest}`,\n 'response.ts': responseTxt,\n 'parser.ts': parserTxt,\n 'request.ts': requestTxt,\n });\n\n await writeFiles(join(output, 'outputs'), outputs);\n const modelsImports = Object.entries(commonSchemas).map(([name]) => name);\n await writeFiles(output, {\n ...clientFiles,\n ...inputFiles,\n ...Object.fromEntries(\n Object.entries(commonSchemas).map(([name, schema]) => [\n `models/${name}.ts`,\n [\n `import { z } from 'zod';`,\n ...exclude(modelsImports, [name]).map(\n (it) => `import type { ${it} } from './${it}.ts';`,\n ),\n `export type ${name} = ${schema};`,\n ].join('\\n'),\n ]),\n ),\n });\n\n const folders = [\n getFolderExports(output, settings.useTsExtension),\n getFolderExports(join(output, 'outputs'), settings.useTsExtension),\n getFolderExports(\n join(output, 'inputs'),\n settings.useTsExtension,\n ['ts'],\n (dirent) => dirent.isDirectory() && dirent.name === 'schemas',\n ),\n getFolderExports(join(output, 'http'), settings.useTsExtension),\n ];\n if (modelsImports.length) {\n folders.push(\n getFolderExports(join(output, 'models'), settings.useTsExtension),\n );\n }\n const [index, outputIndex, inputsIndex, httpIndex, modelsIndex] =\n await Promise.all(folders);\n await writeFiles(output, {\n 'index.ts': index,\n 'outputs/index.ts': outputIndex,\n 'inputs/index.ts': inputsIndex || null,\n 'http/index.ts': httpIndex,\n ...(modelsImports.length ? { 'models/index.ts': modelsIndex } : {}),\n });\n if (settings.mode === 'full') {\n await writeFiles(settings.output, {\n 'package.json': {\n ignoreIfExists: true,\n content: JSON.stringify(\n {\n name: 'sdk',\n type: 'module',\n main: './src/index.ts',\n dependencies: {\n 'fast-content-type-parse': '^3.0.0',\n zod: '^3.24.2',\n },\n },\n null,\n 2,\n ),\n },\n 'tsconfig.json': {\n ignoreIfExists: true,\n content: JSON.stringify(\n {\n compilerOptions: {\n skipLibCheck: true,\n skipDefaultLibCheck: true,\n target: 'ESNext',\n module: 'ESNext',\n noEmit: true,\n strict: true,\n allowImportingTsExtensions: true,\n verbatimModuleSyntax: true,\n baseUrl: '.',\n moduleResolution: 'bundler',\n },\n include: ['**/*.ts'],\n },\n null,\n 2,\n ),\n },\n });\n }\n\n await settings.formatCode?.({\n output: output,\n env: npmRunPathEnv(),\n });\n}\n", "import { get, merge } from 'lodash-es';\nimport type {\n ContentObject,\n OpenAPIObject,\n OperationObject,\n ParameterLocation,\n ParameterObject,\n ReferenceObject,\n ResponseObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase, pascalcase, spinalcase } from 'stringcase';\n\nimport { TypeScriptDeserialzer } from './emitters/interface.ts';\nimport { ZodDeserialzer } from './emitters/zod.ts';\nimport {\n type Operation,\n type OperationInput,\n type Parser,\n type Spec,\n} from './sdk.ts';\nimport { followRef, isRef, securityToOptions, useImports } from './utils.ts';\n\nexport interface NamedImport {\n name: string;\n alias?: string;\n isTypeOnly: boolean;\n}\nexport interface Import {\n isTypeOnly: boolean;\n moduleSpecifier: string;\n defaultImport: string | undefined;\n namedImports: NamedImport[];\n namespaceImport: string | undefined;\n}\n\nconst responses: Record<string, string> = {\n '400': 'BadRequest',\n '401': 'Unauthorized',\n '402': 'PaymentRequired',\n '403': 'Forbidden',\n '404': 'NotFound',\n '405': 'MethodNotAllowed',\n '406': 'NotAcceptable',\n '409': 'Conflict',\n '413': 'PayloadTooLarge',\n '410': 'Gone',\n '422': 'UnprocessableEntity',\n '429': 'TooManyRequests',\n '500': 'InternalServerError',\n '501': 'NotImplemented',\n '502': 'BadGateway',\n '503': 'ServiceUnavailable',\n '504': 'GatewayTimeout',\n};\n\nexport interface GenerateSdkConfig {\n spec: OpenAPIObject;\n target?: 'javascript';\n /**\n * No support for jsdoc in vscode\n * @issue https://github.com/microsoft/TypeScript/issues/38106\n */\n style?: 'github';\n operationId?: (\n operation: OperationObject,\n path: string,\n method: string,\n ) => string;\n makeImport: (module: string) => string;\n}\n\nexport const defaults: Partial<GenerateSdkConfig> &\n Required<Pick<GenerateSdkConfig, 'operationId'>> = {\n target: 'javascript',\n style: 'github',\n operationId: (operation, path, method) => {\n if (operation.operationId) {\n return spinalcase(operation.operationId);\n }\n return camelcase(`${method} ${path.replace(/[\\\\/\\\\{\\\\}]/g, ' ').trim()}`);\n },\n};\n\nexport function generateCode(config: GenerateSdkConfig) {\n const commonSchemas: Record<string, string> = {};\n const commonZod = new Map<string, string>();\n const commonZodImports: Import[] = [];\n const zodDeserialzer = new ZodDeserialzer(config.spec, (model, schema) => {\n commonZod.set(model, schema);\n commonZodImports.push({\n defaultImport: undefined,\n isTypeOnly: true,\n moduleSpecifier: `./${config.makeImport(model)}`,\n namedImports: [{ isTypeOnly: true, name: model }],\n namespaceImport: undefined,\n });\n });\n\n const groups: Spec['operations'] = {};\n const outputs: Record<string, string> = {};\n\n for (const [path, methods] of Object.entries(config.spec.paths ?? {})) {\n for (const [method, operation] of Object.entries(methods) as [\n string,\n OperationObject,\n ][]) {\n const formatOperationId = config.operationId ?? defaults.operationId;\n const operationName = formatOperationId(operation, path, method);\n\n console.log(`Processing ${method} ${path}`);\n const [groupName] = Array.isArray(operation.tags)\n ? operation.tags\n : ['unknown'];\n groups[groupName] ??= [];\n const inputs: Operation['inputs'] = {};\n\n const additionalProperties: ParameterObject[] = [];\n for (const param of operation.parameters ?? []) {\n if (isRef(param)) {\n throw new Error(`Found reference in parameter ${param.$ref}`);\n }\n if (!param.schema) {\n throw new Error(`Schema not found for parameter ${param.name}`);\n }\n inputs[param.name] = {\n in: param.in,\n schema: '',\n };\n additionalProperties.push(param);\n }\n\n const security = operation.security ?? [];\n const securitySchemas = config.spec.components?.securitySchemes ?? {};\n\n const securityOptions = securityToOptions(security, securitySchemas);\n\n Object.assign(inputs, securityOptions);\n\n additionalProperties.push(\n ...Object.entries(securityOptions).map(\n ([name, value]) =>\n ({\n name: name,\n required: false,\n schema: {\n type: 'string',\n },\n in: value.in as ParameterLocation,\n }) satisfies ParameterObject,\n ),\n );\n\n const types: Record<string, string> = {};\n const shortContenTypeMap: Record<string, string> = {\n 'application/json': 'json',\n 'application/x-www-form-urlencoded': 'urlencoded',\n 'multipart/form-data': 'formdata',\n 'application/xml': 'xml',\n 'text/plain': 'text',\n };\n let outgoingContentType: string | undefined;\n if (operation.requestBody && Object.keys(operation.requestBody).length) {\n const content: ContentObject = isRef(operation.requestBody)\n ? get(followRef(config.spec, operation.requestBody.$ref), ['content'])\n : operation.requestBody.content;\n\n for (const type in content) {\n const ctSchema = isRef(content[type].schema)\n ? followRef(config.spec, content[type].schema.$ref)\n : content[type].schema;\n if (!ctSchema) {\n console.warn(`Schema not found for ${type}`);\n continue;\n }\n\n const schema = merge({}, ctSchema, {\n required: additionalProperties\n .filter((p) => p.required)\n .map((p) => p.name),\n properties: additionalProperties.reduce<Record<string, unknown>>(\n (acc, p) => ({\n ...acc,\n [p.name]: p.schema,\n }),\n {},\n ),\n });\n\n Object.assign(inputs, bodyInputs(config, ctSchema));\n types[shortContenTypeMap[type]] = zodDeserialzer.handle(schema, true);\n }\n\n if (content['application/json']) {\n outgoingContentType = 'json';\n } else if (content['application/x-www-form-urlencoded']) {\n outgoingContentType = 'urlencoded';\n } else if (content['multipart/form-data']) {\n outgoingContentType = 'formdata';\n } else {\n outgoingContentType = 'json';\n }\n } else {\n const properties = additionalProperties.reduce<Record<string, any>>(\n (acc, p) => ({\n ...acc,\n [p.name]: p.schema,\n }),\n {},\n );\n types[shortContenTypeMap['application/json']] = zodDeserialzer.handle(\n {\n type: 'object',\n required: additionalProperties\n .filter((p) => p.required)\n .map((p) => p.name),\n properties,\n },\n true,\n );\n }\n\n const errors: string[] = [];\n operation.responses ??= {};\n\n let foundResponse = false;\n const output = [`import z from 'zod';`];\n let parser: Parser = 'buffered';\n for (const status in operation.responses) {\n const response = isRef(\n operation.responses[status] as ResponseObject | ReferenceObject,\n )\n ? (followRef(\n config.spec,\n operation.responses[status].$ref,\n ) as ResponseObject)\n : (operation.responses[status] as ResponseObject);\n const statusCode = +status;\n if (statusCode >= 400) {\n errors.push(responses[status] ?? 'ProblematicResponse');\n }\n if (statusCode >= 200 && statusCode < 300) {\n foundResponse = true;\n const responseContent = get(response, ['content']);\n const isJson = responseContent && responseContent['application/json'];\n if ((response.headers ?? {})['Transfer-Encoding']) {\n parser = 'chunked';\n }\n // TODO: how the user is going to handle multiple response types\n const imports: Import[] = [];\n const typeScriptDeserialzer = new TypeScriptDeserialzer(\n config.spec,\n (schemaName, zod) => {\n commonSchemas[schemaName] = zod;\n imports.push({\n defaultImport: undefined,\n isTypeOnly: true,\n moduleSpecifier: `../models/${config.makeImport(schemaName)}`,\n namedImports: [{ isTypeOnly: true, name: schemaName }],\n namespaceImport: undefined,\n });\n },\n );\n const responseSchema = isJson\n ? typeScriptDeserialzer.handle(\n responseContent['application/json'].schema!,\n true,\n )\n : 'ReadableStream'; // non-json response treated as stream\n output.push(...useImports(responseSchema, imports));\n output.push(\n `export type ${pascalcase(operationName + ' output')} = ${responseSchema}`,\n );\n }\n }\n\n if (!foundResponse) {\n output.push(\n `export type ${pascalcase(operationName + ' output')} = void`,\n );\n }\n outputs[`${spinalcase(operationName)}.ts`] = output.join('\\n');\n groups[groupName].push({\n name: operationName,\n type: 'http',\n inputs,\n errors: errors.length ? errors : ['ServerError'],\n outgoingContentType,\n schemas: types,\n parser,\n formatOutput: () => ({\n import: pascalcase(operationName + ' output'),\n use: pascalcase(operationName + ' output'),\n }),\n trigger: {\n path,\n method,\n },\n });\n }\n }\n\n return { groups, commonSchemas, commonZod, outputs };\n}\n\n// TODO - USE CASES\n// 1. Some parameters conflicts with request body\n// 2. Generate 400 and 500 response variations // done\n// 3. Generate 200 response variations\n// 3. Doc Security\n// 4. Operation Security\n// 5. JsDocs\n// 5. test all different types of parameters\n// 6. cookies\n// 6. x-www-form-urlencoded // done\n// 7. multipart/form-data // done\n// 7. application/octet-stream // done\n// 7. chunked response // done\n\nfunction toProps(\n spec: OpenAPIObject,\n schemaOrRef: SchemaObject | ReferenceObject,\n aggregator: string[] = [],\n) {\n if (isRef(schemaOrRef)) {\n const schema = followRef(spec, schemaOrRef.$ref);\n return toProps(spec, schema, aggregator);\n } else if (schemaOrRef.type === 'object') {\n for (const [name] of Object.entries(schemaOrRef.properties ?? {})) {\n aggregator.push(name);\n }\n return void 0;\n } else if (schemaOrRef.allOf) {\n for (const it of schemaOrRef.allOf) {\n toProps(spec, it, aggregator);\n }\n return void 0;\n }\n}\n\nfunction bodyInputs(\n config: GenerateSdkConfig,\n ctSchema: SchemaObject | ReferenceObject,\n) {\n const props: string[] = [];\n toProps(config.spec, ctSchema, props);\n return props.reduce<Record<string, OperationInput>>(\n (acc, prop) => ({\n ...acc,\n [prop]: {\n in: 'body',\n schema: '',\n },\n }),\n {},\n );\n}\n", "import { get } from 'lodash-es';\nimport type {\n ComponentsObject,\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n SecurityRequirementObject,\n} from 'openapi3-ts/oas31';\n\nimport { removeDuplicates } from '@sdk-it/core';\n\nimport { type Options } from './sdk.ts';\n\nexport function isRef(obj: any): obj is ReferenceObject {\n return '$ref' in obj;\n}\n\nexport function cleanRef(ref: string) {\n return ref.replace(/^#\\//, '');\n}\n\nexport function parseRef(ref: string) {\n const parts = ref.split('/');\n const [model] = parts.splice(-1);\n return { model, path: parts.join('/') };\n}\nexport function followRef(spec: OpenAPIObject, ref: string): SchemaObject {\n const pathParts = cleanRef(ref).split('/');\n const entry = get(spec, pathParts) as SchemaObject | ReferenceObject;\n if (entry && '$ref' in entry) {\n return followRef(spec, entry.$ref);\n }\n return entry;\n}\nexport function securityToOptions(\n security: SecurityRequirementObject[],\n securitySchemas: ComponentsObject['securitySchemes'],\n staticIn?: string,\n) {\n securitySchemas ??= {};\n const options: Options = {};\n for (const it of security) {\n const [name] = Object.keys(it);\n const schema = securitySchemas[name];\n if (isRef(schema)) {\n throw new Error(`Ref security schemas are not supported`);\n }\n if (schema.type === 'http') {\n options['authorization'] = {\n in: staticIn ?? 'header',\n schema:\n 'z.string().optional().transform((val) => (val ? `Bearer ${val}` : undefined))',\n optionName: 'token',\n };\n continue;\n }\n if (schema.type === 'apiKey') {\n if (!schema.in) {\n throw new Error(`apiKey security schema must have an \"in\" field`);\n }\n if (!schema.name) {\n throw new Error(`apiKey security schema must have a \"name\" field`);\n }\n options[schema.name] = {\n in: staticIn ?? schema.in,\n schema: 'z.string().optional()',\n };\n continue;\n }\n }\n return options;\n}\n\nexport function mergeImports(imports: Import[]) {\n const merged: Record<string, Import> = {};\n\n for (const i of imports) {\n merged[i.moduleSpecifier] = merged[i.moduleSpecifier] ?? {\n moduleSpecifier: i.moduleSpecifier,\n defaultImport: i.defaultImport,\n namespaceImport: i.namespaceImport,\n namedImports: [],\n };\n if (i.namedImports) {\n merged[i.moduleSpecifier].namedImports.push(...i.namedImports);\n }\n }\n\n return Object.values(merged);\n}\nexport interface Import {\n isTypeOnly: boolean;\n moduleSpecifier: string;\n defaultImport: string | undefined;\n namedImports: NamedImport[];\n namespaceImport: string | undefined;\n}\nexport interface NamedImport {\n name: string;\n alias?: string;\n isTypeOnly: boolean;\n}\n\nexport function importsToString(...imports: Import[]) {\n return imports.map((it) => {\n if (it.defaultImport) {\n return `import ${it.defaultImport} from '${it.moduleSpecifier}'`;\n }\n if (it.namespaceImport) {\n return `import * as ${it.namespaceImport} from '${it.moduleSpecifier}'`;\n }\n if (it.namedImports) {\n return `import {${removeDuplicates(it.namedImports, (it) => it.name)\n .map((n) => `${n.isTypeOnly ? 'type' : ''} ${n.name}`)\n .join(', ')}} from '${it.moduleSpecifier}'`;\n }\n throw new Error(`Invalid import ${JSON.stringify(it)}`);\n });\n}\n\nexport function exclude<T>(list: T[], exclude: T[]): T[] {\n return list.filter((it) => !exclude.includes(it));\n}\n\nexport function useImports(content: string, imports: Import[]) {\n const output: string[] = [];\n for (const it of mergeImports(imports)) {\n const singleImport = it.defaultImport ?? it.namespaceImport;\n if (singleImport && content.includes(singleImport)) {\n output.push(importsToString(it).join('\\n'));\n } else if (it.namedImports.length) {\n for (const namedImport of it.namedImports) {\n if (content.includes(namedImport.name)) {\n output.push(importsToString(it).join('\\n'));\n }\n }\n }\n }\n return output;\n}\n\nexport type MakeImportFn = (moduleSpecifier: string) => string;\n", "import { camelcase, spinalcase } from 'stringcase';\n\nimport { removeDuplicates, toLitObject } from '@sdk-it/core';\n\nimport backend from './client.ts';\nimport type { MakeImportFn } from './utils.ts';\n\nexport type Parser = 'chunked' | 'buffered';\nclass SchemaEndpoint {\n #makeImport: MakeImportFn;\n #imports: string[] = [];\n constructor(makeImport: MakeImportFn) {\n this.#makeImport = makeImport;\n this.#imports = [\n `import z from 'zod';`,\n `import type { Endpoints } from '${this.#makeImport('./endpoints')}';`,\n `import { toRequest, json, urlencoded, nobody, formdata, createUrl } from '${this.#makeImport('./http/request')}';`,\n `import type { ParseError } from '${this.#makeImport('./http/parser')}';`,\n `import { chunked, buffered } from \"${this.#makeImport('./http/parse-response')}\";`,\n ];\n }\n\n #endpoints: string[] = [];\n\n addEndpoint(endpoint: string, operation: string) {\n this.#endpoints.push(` \"${endpoint}\": ${operation},`);\n }\n\n addImport(value: string) {\n this.#imports.push(value);\n }\n\n complete() {\n return `${this.#imports.join('\\n')}\\nexport default {\\n${this.#endpoints.join('\\n')}\\n}`;\n }\n}\nclass Emitter {\n #makeImport: MakeImportFn;\n protected imports: string[] = [];\n constructor(makeImport: MakeImportFn) {\n this.#makeImport = makeImport;\n this.imports = [\n `import type z from 'zod';`,\n `import type { ParseError } from '${this.#makeImport('./http/parser')}';`,\n ];\n }\n protected endpoints: string[] = [];\n addEndpoint(endpoint: string, operation: string) {\n this.endpoints.push(` \"${endpoint}\": ${operation};`);\n }\n addImport(value: string) {\n this.imports.push(value);\n }\n complete() {\n return `${this.imports.join('\\n')}\\nexport interface Endpoints {\\n${this.endpoints.join('\\n')}\\n}`;\n }\n}\n\nexport interface SdkConfig {\n /**\n * The name of the sdk client\n */\n name: string;\n packageName?: string;\n options?: Record<string, any>;\n emptyBodyAsNull?: boolean;\n stripBodyFromGetAndHead?: boolean;\n output: string;\n}\n\nexport type Options = Record<\n string,\n {\n in: string;\n schema: string;\n optionName?: string;\n }\n>;\nexport interface Spec {\n operations: Record<string, Operation[]>;\n name: string;\n options: Options;\n servers: string[];\n makeImport: MakeImportFn;\n}\n\nexport interface OperationInput {\n in: string;\n schema: string;\n}\nexport interface Operation {\n name: string;\n errors: string[];\n type: string;\n trigger: Record<string, any>;\n outgoingContentType?: string;\n parser: Parser;\n schemas: Record<string, string>;\n inputs: Record<string, OperationInput>;\n formatOutput: () => { import: string; use: string };\n}\n\nexport function generateInputs(\n operationsSet: Spec['operations'],\n commonZod: Map<string, string>,\n makeImport: MakeImportFn,\n) {\n const commonImports = commonZod.keys().toArray();\n const inputs: Record<string, string> = {};\n for (const [name, operations] of Object.entries(operationsSet)) {\n const output: string[] = [];\n const imports = new Set(['import { z } from \"zod\";']);\n\n for (const operation of operations) {\n const schemaName = camelcase(`${operation.name} schema`);\n\n const schema = `export const ${schemaName} = ${\n Object.keys(operation.schemas).length === 1\n ? Object.values(operation.schemas)[0]\n : toLitObject(operation.schemas)\n };`;\n\n const inputContent = schema;\n\n for (const schema of commonImports) {\n if (inputContent.includes(schema)) {\n imports.add(\n `import { ${schema} } from './schemas/${makeImport(spinalcase(schema))}';`,\n );\n }\n }\n output.push(inputContent);\n }\n inputs[`inputs/${spinalcase(name)}.ts`] =\n [...imports, ...output].join('\\n') + '\\n';\n }\n\n const schemas = commonZod\n .entries()\n .reduce<string[][]>((acc, [name, schema]) => {\n const output = [`import { z } from 'zod';`];\n const content = `export const ${name} = ${schema};`;\n for (const schema of commonImports) {\n const preciseMatch = new RegExp(`\\\\b${schema}\\\\b`);\n if (preciseMatch.test(content) && schema !== name) {\n output.push(\n `import { ${schema} } from './${makeImport(spinalcase(schema))}';`,\n );\n }\n }\n\n output.push(content);\n return [\n [`inputs/schemas/${spinalcase(name)}.ts`, output.join('\\n')],\n ...acc,\n ];\n }, []);\n\n return {\n ...Object.fromEntries(schemas),\n ...inputs,\n };\n}\n\nexport function generateSDK(spec: Spec) {\n const emitter = new Emitter(spec.makeImport);\n const schemaEndpoint = new SchemaEndpoint(spec.makeImport);\n const errors: string[] = [];\n for (const [name, operations] of Object.entries(spec.operations)) {\n emitter.addImport(\n `import type * as ${camelcase(name)} from './inputs/${spec.makeImport(spinalcase(name))}';`,\n );\n schemaEndpoint.addImport(\n `import * as ${camelcase(name)} from './inputs/${spec.makeImport(spinalcase(name))}';`,\n );\n for (const operation of operations) {\n const schemaName = camelcase(`${operation.name} schema`);\n const schemaRef = `${camelcase(name)}.${schemaName}`;\n const output = operation.formatOutput();\n const inputHeaders: string[] = [];\n const inputQuery: string[] = [];\n const inputBody: string[] = [];\n const inputParams: string[] = [];\n for (const [name, prop] of Object.entries(operation.inputs)) {\n if (prop.in === 'headers' || prop.in === 'header') {\n inputHeaders.push(`\"${name}\"`);\n } else if (prop.in === 'query') {\n inputQuery.push(`\"${name}\"`);\n } else if (prop.in === 'body') {\n inputBody.push(`\"${name}\"`);\n } else if (prop.in === 'path') {\n inputParams.push(`\"${name}\"`);\n } else if (prop.in === 'internal') {\n // ignore internal sources\n continue;\n } else {\n throw new Error(\n `Unknown source ${prop.in} in ${name} ${JSON.stringify(\n prop,\n )} in ${operation.name}`,\n );\n }\n }\n emitter.addImport(\n `import type {${output.import}} from './outputs/${spec.makeImport(spinalcase(operation.name))}';`,\n );\n errors.push(...(operation.errors ?? []));\n\n const addTypeParser = Object.keys(operation.schemas).length > 1;\n for (const type in operation.schemas ?? {}) {\n let typePrefix = '';\n if (addTypeParser && type !== 'json') {\n typePrefix = `${type} `;\n }\n const input = `typeof ${schemaRef}${addTypeParser ? `.${type}` : ''}`;\n\n const endpoint = `${typePrefix}${operation.trigger.method.toUpperCase()} ${operation.trigger.path}`;\n emitter.addEndpoint(\n endpoint,\n `{input: z.infer<${input}>; output: ${output.use}; error: ${(operation.errors ?? ['ServerError']).concat(`ParseError<${input}>`).join('|')}}`,\n );\n schemaEndpoint.addEndpoint(\n endpoint,\n `{\n schema: ${schemaRef}${addTypeParser ? `.${type}` : ''},\n deserializer: ${operation.parser === 'chunked' ? 'chunked' : 'buffered'},\n toRequest(input: Endpoints['${endpoint}']['input']) {\n const endpoint = '${endpoint}';\n return toRequest(endpoint, ${operation.outgoingContentType || 'nobody'}(input, {\n inputHeaders: [${inputHeaders}],\n inputQuery: [${inputQuery}],\n inputBody: [${inputBody}],\n inputParams: [${inputParams}],\n }));\n },\n }`,\n );\n }\n }\n }\n\n emitter.addImport(\n `import type { ${removeDuplicates(errors, (it) => it).join(', ')} } from '${spec.makeImport('./http/response')}';`,\n );\n return {\n 'client.ts': backend(spec),\n 'schemas.ts': schemaEndpoint.complete(),\n 'endpoints.ts': emitter.complete(),\n };\n}\n", "import { toLitObject } from '@sdk-it/core';\n\nimport type { Spec } from './sdk.ts';\n\nexport default (spec: Spec) => {\n const optionsEntries = Object.entries(spec.options).map(\n ([key, value]) => [`'${key}'`, value] as const,\n );\n const defaultHeaders = `{${optionsEntries\n .filter(([, value]) => value.in === 'header')\n .map(\n ([key, value]) =>\n `${key}: this.options[${value.optionName ? `'${value.optionName}'` : key}]`,\n )\n .join(',\\n')}}`;\n const defaultInputs = `{${optionsEntries\n .filter(([, value]) => value.in === 'input')\n .map(\n ([key, value]) =>\n `${key}: this.options[${value.optionName ? `'${value.optionName}'` : key}]`,\n )\n .join(',\\n')}}`;\n const specOptions: Record<string, { schema: string }> = {\n ...Object.fromEntries(\n optionsEntries.map(([key, value]) => [value.optionName ?? key, value]),\n ),\n fetch: {\n schema: 'fetchType',\n },\n baseUrl: {\n schema: spec.servers.length\n ? `z.enum(servers).default(servers[0])`\n : 'z.string()',\n },\n };\n\n return `\nimport { fetchType, sendRequest } from './http/${spec.makeImport('send-request')}';\nimport z from 'zod';\nimport type { Endpoints } from './${spec.makeImport('endpoints')}';\nimport schemas from './${spec.makeImport('schemas')}';\nimport {\n createBaseUrlInterceptor,\n createHeadersInterceptor,\n} from './http/${spec.makeImport('interceptors')}';\n\n${spec.servers.length ? `export const servers = ${JSON.stringify(spec.servers, null, 2)} as const` : ''}\nconst optionsSchema = z.object(${toLitObject(specOptions, (x) => x.schema)});\n${spec.servers.length ? `export type Servers = typeof servers[number];` : ''}\n\ntype ${spec.name}Options = z.infer<typeof optionsSchema>;\n\nexport class ${spec.name} {\n public options: ${spec.name}Options\n constructor(options: ${spec.name}Options) {\n this.options = optionsSchema.parse(options);\n }\n\n async request<E extends keyof Endpoints>(\n endpoint: E,\n input: Endpoints[E]['input'],\n options?: { signal?: AbortSignal, headers?: HeadersInit },\n ): Promise<readonly [Endpoints[E]['output'], Endpoints[E]['error'] | null]> {\n const route = schemas[endpoint];\n return sendRequest(Object.assign(this.#defaultInputs, input), route, {\n fetch: this.options.fetch,\n interceptors: [\n createHeadersInterceptor(() => this.defaultHeaders, options?.headers ?? {}),\n createBaseUrlInterceptor(() => this.options.baseUrl),\n ],\n signal: options?.signal,\n });\n }\n\n get defaultHeaders() {\n return ${defaultHeaders}\n }\n\n get #defaultInputs() {\n return ${defaultInputs}\n }\n\n setOptions(options: Partial<${spec.name}Options>) {\n const validated = optionsSchema.partial().parse(options);\n\n for (const key of Object.keys(validated) as (keyof ${spec.name}Options)[]) {\n if (validated[key] !== undefined) {\n (this.options[key] as typeof validated[typeof key]) = validated[key]!;\n }\n }\n }\n}`;\n};\n", "import type {\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { cleanRef, followRef, isRef, parseRef } from '../utils.ts';\n\ntype OnRefCallback = (ref: string, interfaceContent: string) => void;\n\n/**\n * Convert an OpenAPI (JSON Schema style) object into TypeScript interfaces,\n * following the same pattern as ZodDeserialzer for easy interchangeability.\n */\nexport class TypeScriptDeserialzer {\n circularRefTracker = new Set<string>();\n #spec: OpenAPIObject;\n #onRef: OnRefCallback;\n\n constructor(spec: OpenAPIObject, onRef: OnRefCallback) {\n this.#spec = spec;\n this.#onRef = onRef;\n }\n #stringifyKey = (key: string): string => {\n // List of JavaScript keywords and special object properties that should be quoted\n const reservedWords = [\n 'constructor',\n 'prototype',\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'export',\n 'extends',\n 'false',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'new',\n 'null',\n 'return',\n 'super',\n 'switch',\n 'this',\n 'throw',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n ];\n\n // Check if key is a reserved word\n if (reservedWords.includes(key)) {\n return `'${key}'`;\n }\n\n // Check if key is empty or only whitespace\n if (key.trim() === '') {\n return `'${key}'`;\n }\n\n // Check if first character is valid for identifiers\n const firstChar = key.charAt(0);\n const validFirstChar =\n (firstChar >= 'a' && firstChar <= 'z') ||\n (firstChar >= 'A' && firstChar <= 'Z') ||\n firstChar === '_' ||\n firstChar === '$';\n\n if (!validFirstChar) {\n return `'${key.replace(/'/g, \"\\\\'\")}'`;\n }\n\n // Check if the rest of the characters are valid for identifiers\n for (let i = 1; i < key.length; i++) {\n const char = key.charAt(i);\n const validChar =\n (char >= 'a' && char <= 'z') ||\n (char >= 'A' && char <= 'Z') ||\n (char >= '0' && char <= '9') ||\n char === '_' ||\n char === '$';\n\n if (!validChar) {\n return `'${key.replace(/'/g, \"\\\\'\")}'`;\n }\n }\n\n return key;\n };\n #stringifyKeyV2 = (value: string): string => {\n return `'${value}'`;\n };\n\n /**\n * Handle objects (properties)\n */\n object(schema: SchemaObject, required = false): string {\n const properties = schema.properties || {};\n\n // Convert each property\n const propEntries = Object.entries(properties).map(([key, propSchema]) => {\n const isRequired = (schema.required ?? []).includes(key);\n const tsType = this.handle(propSchema, isRequired);\n // Add question mark for optional properties\n return `${this.#stringifyKeyV2(key)}: ${tsType}`;\n });\n\n // Handle additionalProperties\n if (schema.additionalProperties) {\n if (typeof schema.additionalProperties === 'object') {\n const indexType = this.handle(schema.additionalProperties, true);\n propEntries.push(`[key: string]: ${indexType}`);\n } else if (schema.additionalProperties === true) {\n propEntries.push('[key: string]: any');\n }\n }\n\n return `{ ${propEntries.join('; ')} }`;\n }\n\n /**\n * Handle arrays (items could be a single schema or a tuple)\n */\n array(schema: SchemaObject, required = false): string {\n const { items } = schema;\n if (!items) {\n // No items => any[]\n return 'any[]';\n }\n\n // If items is an array => tuple\n if (Array.isArray(items)) {\n const tupleItems = items.map((sub) => this.handle(sub, true));\n return `[${tupleItems.join(', ')}]`;\n }\n\n // If items is a single schema => standard array\n const itemsType = this.handle(items, true);\n return `${itemsType}[]`;\n }\n\n /**\n * Convert a basic type (string | number | boolean | object | array, etc.) to TypeScript\n */\n normal(type: string, schema: SchemaObject, required = false): string {\n switch (type) {\n case 'string':\n return this.string(schema, required);\n case 'number':\n case 'integer':\n return this.number(schema, required);\n case 'boolean':\n return appendOptional('boolean', required);\n case 'object':\n return this.object(schema, required);\n case 'array':\n return this.array(schema, required);\n case 'null':\n return 'null';\n default:\n // Unknown type -> fallback\n return appendOptional('any', required);\n }\n }\n\n ref($ref: string, required: boolean): string {\n const schemaName = cleanRef($ref).split('/').pop()!;\n\n if (this.circularRefTracker.has(schemaName)) {\n return schemaName;\n }\n\n this.circularRefTracker.add(schemaName);\n this.#onRef(schemaName, this.handle(followRef(this.#spec, $ref), true));\n this.circularRefTracker.delete(schemaName);\n\n return appendOptional(schemaName, required);\n }\n\n allOf(schemas: (SchemaObject | ReferenceObject)[]): string {\n // For TypeScript we use intersection types for allOf\n const allOfTypes = schemas.map((sub) => this.handle(sub, true));\n return allOfTypes.length > 1 ? `${allOfTypes.join(' & ')}` : allOfTypes[0];\n }\n\n anyOf(\n schemas: (SchemaObject | ReferenceObject)[],\n required: boolean,\n ): string {\n // For TypeScript we use union types for anyOf/oneOf\n const anyOfTypes = schemas.map((sub) => this.handle(sub, true));\n return appendOptional(\n anyOfTypes.length > 1 ? `${anyOfTypes.join(' | ')}` : anyOfTypes[0],\n required,\n );\n }\n\n oneOf(\n schemas: (SchemaObject | ReferenceObject)[],\n required: boolean,\n ): string {\n const oneOfTypes = schemas.map((sub) => {\n if (isRef(sub)) {\n const { model } = parseRef(sub.$ref);\n if (this.circularRefTracker.has(model)) {\n return model;\n }\n }\n return this.handle(sub, false);\n });\n return appendOptional(\n oneOfTypes.length > 1 ? `${oneOfTypes.join(' | ')}` : oneOfTypes[0],\n required,\n );\n }\n\n enum(values: any[], required: boolean): string {\n // For TypeScript enums as union of literals\n const enumValues = values\n .map((val) => (typeof val === 'string' ? `'${val}'` : `${val}`))\n .join(' | ');\n return appendOptional(enumValues, required);\n }\n\n /**\n * Handle string type with formats\n */\n string(schema: SchemaObject, required?: boolean): string {\n let type: string;\n\n switch (schema.format) {\n case 'date-time':\n case 'datetime':\n case 'date':\n type = 'Date';\n break;\n case 'binary':\n case 'byte':\n type = 'Blob';\n break;\n case 'int64':\n type = 'bigint';\n break;\n default:\n type = 'string';\n }\n\n return appendOptional(type, required);\n }\n\n /**\n * Handle number/integer types with formats\n */\n number(schema: SchemaObject, required?: boolean): string {\n const type = schema.format === 'int64' ? 'bigint' : 'number';\n return appendOptional(type, required);\n }\n\n handle(schema: SchemaObject | ReferenceObject, required: boolean): string {\n if (isRef(schema)) {\n return this.ref(schema.$ref, required);\n }\n\n // Handle allOf (intersection in TypeScript)\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.allOf(schema.allOf);\n }\n\n // anyOf (union in TypeScript)\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.anyOf(schema.anyOf, required);\n }\n\n // oneOf (union in TypeScript)\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return this.oneOf(schema.oneOf, required);\n }\n\n // enum\n if (schema.enum && Array.isArray(schema.enum)) {\n return this.enum(schema.enum, required);\n }\n\n // Handle types, in TypeScript we can have union types directly\n const types = Array.isArray(schema.type)\n ? schema.type\n : schema.type\n ? [schema.type]\n : [];\n\n // If no explicit \"type\", fallback to any\n if (!types.length) {\n // unless properties are defined then assume object\n if ('properties' in schema) {\n return this.object(schema, required);\n }\n return appendOptional('any', required);\n }\n\n // Handle union types (multiple types)\n if (types.length > 1) {\n const realTypes = types.filter((t) => t !== 'null');\n if (realTypes.length === 1 && types.includes('null')) {\n // Single real type + \"null\"\n const tsType = this.normal(realTypes[0], schema, false);\n return appendOptional(`${tsType} | null`, required);\n }\n\n // Multiple different types\n const typeResults = types.map((t) => this.normal(t, schema, false));\n return appendOptional(typeResults.join(' | '), required);\n }\n\n // Single type\n return this.normal(types[0], schema, required);\n }\n\n /**\n * Generate an interface declaration\n */\n generateInterface(\n name: string,\n schema: SchemaObject | ReferenceObject,\n ): string {\n const content = this.handle(schema, true);\n return `interface ${name} ${content}`;\n }\n}\n\n/**\n * Append \"| undefined\" if not required\n */\nfunction appendOptional(type: string, isRequired?: boolean): string {\n return isRequired ? type : `${type} | undefined`;\n}\n", "import type {\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { cleanRef, followRef, isRef, parseRef } from '../utils.ts';\n\ntype OnRefCallback = (ref: string, zod: string) => void;\n\n/**\n * Convert an OpenAPI (JSON Schema style) object into a Zod schema string,\n * adapted for OpenAPI 3.1 (fully aligned with JSON Schema 2020-12).\n */\nexport class ZodDeserialzer {\n circularRefTracker = new Set<string>();\n #spec: OpenAPIObject;\n #onRef?: OnRefCallback;\n\n constructor(spec: OpenAPIObject, onRef?: OnRefCallback) {\n this.#spec = spec;\n this.#onRef = onRef;\n }\n /**\n * Handle objects (properties, additionalProperties).\n */\n object(schema: SchemaObject, required = false): string {\n const properties = schema.properties || {};\n\n // Convert each property\n const propEntries = Object.entries(properties).map(([key, propSchema]) => {\n const isRequired = (schema.required ?? []).includes(key);\n const zodPart = this.handle(propSchema, isRequired);\n return `'${key}': ${zodPart}`;\n });\n\n // additionalProperties\n let additionalProps = '';\n if (schema.additionalProperties) {\n if (typeof schema.additionalProperties === 'object') {\n // e.g. z.record() if it\u2019s an object schema\n const addPropZod = this.handle(schema.additionalProperties, true);\n additionalProps = `.catchall(${addPropZod})`;\n } else if (schema.additionalProperties === true) {\n // free-form additional props\n additionalProps = `.catchall(z.unknown())`;\n }\n }\n\n const objectSchema = `z.object({${propEntries.join(', ')}})${additionalProps}`;\n return `${objectSchema}${appendOptional(required)}`;\n }\n\n /**\n * Handle arrays (items could be a single schema or a tuple (array of schemas)).\n * In JSON Schema 2020-12, `items` can be an array \u2192 tuple style.\n */\n array(schema: SchemaObject, required = false): string {\n const { items } = schema;\n if (!items) {\n // No items => z.array(z.unknown())\n return `z.array(z.unknown())${appendOptional(required)}`;\n }\n\n // If items is an array => tuple\n if (Array.isArray(items)) {\n // Build a Zod tuple\n const tupleItems = items.map((sub) => this.handle(sub, true));\n const base = `z.tuple([${tupleItems.join(', ')}])`;\n // // If we have additionalItems: false => that\u2019s a fixed length\n // // If additionalItems is a schema => rest(...)\n // if (schema.additionalItems) {\n // if (typeof schema.additionalItems === 'object') {\n // const restSchema = jsonSchemaToZod(spec, schema.additionalItems, true);\n // base += `.rest(${restSchema})`;\n // }\n // // If `additionalItems: false`, no rest is allowed => do nothing\n // }\n return `${base}${appendOptional(required)}`;\n }\n\n // If items is a single schema => standard z.array(...)\n const itemsSchema = this.handle(items, true);\n return `z.array(${itemsSchema})${appendOptional(required)}`;\n }\n // oneOf() {}\n // enum() {}\n\n #suffixes = (defaultValue: unknown, required: boolean, nullable: boolean) => {\n return `${nullable ? '.nullable()' : ''}${appendDefault(defaultValue)}${appendOptional(required)}`;\n };\n\n /**\n * Convert a basic type (string | number | boolean | object | array, etc.) to Zod.\n * We'll also handle .optional() if needed.\n */\n normal(\n type: string,\n schema: SchemaObject,\n required = false,\n nullable = false,\n ): string {\n switch (type) {\n case 'string':\n return `${this.string(schema)}${this.#suffixes(schema.default, required, nullable)}`;\n case 'number':\n case 'integer': {\n const { base, defaultValue } = this.number(schema);\n return `${base}${this.#suffixes(defaultValue, required, nullable)}`;\n }\n case 'boolean':\n return `z.boolean()${this.#suffixes(schema.default, required, nullable)}`;\n case 'object':\n return this.object(schema, required);\n case 'array':\n return this.array(schema, required);\n case 'null':\n // If \"type\": \"null\" alone, this is basically z.null()\n return `z.null()${appendOptional(required)}`;\n default:\n // Unknown type -> fallback\n return `z.unknown()${appendOptional(required)}`;\n }\n }\n\n ref($ref: string, required: boolean) {\n const schemaName = cleanRef($ref).split('/').pop()!;\n\n if (this.circularRefTracker.has(schemaName)) {\n return schemaName;\n }\n\n this.circularRefTracker.add(schemaName);\n this.#onRef?.(\n schemaName,\n this.handle(followRef(this.#spec, $ref), required),\n );\n this.circularRefTracker.delete(schemaName);\n\n return schemaName;\n }\n allOf(schemas: (SchemaObject | ReferenceObject)[]) {\n const allOfSchemas = schemas.map((sub) => this.handle(sub, true));\n if (allOfSchemas.length === 0) {\n return `z.unknown()`;\n }\n if (allOfSchemas.length === 1) {\n return allOfSchemas[0];\n }\n return this.#toIntersection(allOfSchemas);\n }\n\n #toIntersection(schemas: string[]): string {\n const [left, ...right] = schemas;\n if (!right.length) {\n return left;\n }\n return `z.intersection(${left}, ${this.#toIntersection(right)})`;\n }\n\n anyOf(schemas: (SchemaObject | ReferenceObject)[], required: boolean) {\n const anyOfSchemas = schemas.map((sub) => this.handle(sub, false));\n if (anyOfSchemas.length === 1) {\n return anyOfSchemas[0];\n }\n return anyOfSchemas.length > 1\n ? `z.union([${anyOfSchemas.join(', ')}])${appendOptional(required)}`\n : // Handle an invalid anyOf with one schema\n anyOfSchemas[0];\n }\n\n oneOf(schemas: (SchemaObject | ReferenceObject)[], required: boolean) {\n const oneOfSchemas = schemas.map((sub) => {\n if ('$ref' in sub) {\n const { model } = parseRef(sub.$ref);\n if (this.circularRefTracker.has(model)) {\n return model;\n }\n }\n return this.handle(sub, false);\n });\n if (oneOfSchemas.length === 1) {\n return oneOfSchemas[0];\n }\n return oneOfSchemas.length > 1\n ? `z.union([${oneOfSchemas.join(', ')}])${appendOptional(required)}`\n : // Handle an invalid oneOf with one schema\n oneOfSchemas[0];\n }\n\n enum(values: any[], required: boolean) {\n const enumVals = values.map((val) => JSON.stringify(val)).join(', ');\n return `z.enum([${enumVals}])${appendOptional(required)}`;\n }\n\n /**\n * Handle a `string` schema with possible format keywords (JSON Schema).\n */\n string(schema: SchemaObject): string {\n let base = 'z.string()';\n\n // 3.1 replaces `example` in the schema with `examples` (array).\n // We do not strictly need them for the Zod type, so they\u2019re optional\n // for validation. However, we could keep them as metadata if you want.\n\n switch (schema.format) {\n case 'date-time':\n case 'datetime':\n // parse to JS Date\n base = 'z.coerce.date()';\n break;\n case 'date':\n base =\n 'z.coerce.date() /* or z.string() if you want raw date strings */';\n break;\n case 'time':\n base =\n 'z.string() /* optionally add .regex(...) for HH:MM:SS format */';\n break;\n case 'email':\n base = 'z.string().email()';\n break;\n case 'uuid':\n base = 'z.string().uuid()';\n break;\n case 'url':\n case 'uri':\n base = 'z.string().url()';\n break;\n case 'ipv4':\n base = 'z.string().ip({version: \"v4\"})';\n break;\n case 'ipv6':\n base = 'z.string().ip({version: \"v6\"})';\n break;\n case 'phone':\n base = 'z.string() /* or add .regex(...) for phone formats */';\n break;\n case 'byte':\n case 'binary':\n base = 'z.instanceof(Blob) /* consider base64 check if needed */';\n break;\n case 'int64':\n // JS numbers can't reliably store int64, consider z.bigint() or keep as string\n base = 'z.string() /* or z.bigint() if your app can handle it */';\n break;\n default:\n // No special format\n break;\n }\n\n return base;\n }\n\n /**\n * Handle number/integer constraints from OpenAPI/JSON Schema.\n * In 3.1, exclusiveMinimum/Maximum hold the actual numeric threshold,\n * rather than a boolean toggling `minimum`/`maximum`.\n */\n number(schema: SchemaObject) {\n let defaultValue = schema.default;\n let base = 'z.number()';\n if (schema.format === 'int64') {\n base = 'z.bigint()';\n if (schema.default !== undefined) {\n defaultValue = `BigInt(${schema.default})`;\n }\n }\n\n if (schema.format === 'int32') {\n // 32-bit integer\n base += '.int()';\n }\n\n // If we see exclusiveMinimum as a number in 3.1:\n if (typeof schema.exclusiveMinimum === 'number') {\n // Zod doesn\u2019t have a direct \"exclusiveMinimum\" method, so we can do .gt()\n // If exclusiveMinimum=7 => .gt(7)\n base += `.gt(${schema.exclusiveMinimum})`;\n }\n // Similarly for exclusiveMaximum\n if (typeof schema.exclusiveMaximum === 'number') {\n // If exclusiveMaximum=10 => .lt(10)\n base += `.lt(${schema.exclusiveMaximum})`;\n }\n\n // If standard minimum/maximum\n if (typeof schema.minimum === 'number') {\n base +=\n schema.format === 'int64'\n ? `.min(BigInt(${schema.minimum}))`\n : `.min(${schema.minimum})`;\n }\n if (typeof schema.maximum === 'number') {\n base +=\n schema.format === 'int64'\n ? `.max(BigInt(${schema.maximum}))`\n : `.max(${schema.maximum})`;\n }\n\n // multipleOf\n if (typeof schema.multipleOf === 'number') {\n // There's no direct multipleOf in Zod. Some folks do a custom refine.\n // For example:\n base += `.refine((val) => Number.isInteger(val / ${schema.multipleOf}), \"Must be a multiple of ${schema.multipleOf}\")`;\n }\n\n return { base, defaultValue };\n }\n\n handle(schema: SchemaObject | ReferenceObject, required: boolean): string {\n if (isRef(schema)) {\n return this.ref(schema.$ref, required);\n }\n\n // Handle allOf \u2192 intersection\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.allOf(schema.allOf ?? []);\n }\n\n // anyOf \u2192 union\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.anyOf(schema.anyOf ?? [], required);\n }\n\n // oneOf \u2192 union\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return this.oneOf(schema.oneOf ?? [], required);\n }\n\n // enum\n if (schema.enum && Array.isArray(schema.enum)) {\n return this.enum(schema.enum, required);\n }\n\n // 3.1 can have type: string or type: string[] (e.g. [\"string\",\"null\"])\n // Let's parse that carefully.\n const types = Array.isArray(schema.type)\n ? schema.type\n : schema.type\n ? [schema.type]\n : [];\n\n // If no explicit \"type\", fallback to unknown\n if (!types.length) {\n return `z.unknown()${appendOptional(required)}`;\n }\n\n // If it's a union type (like [\"string\", \"null\"]), we'll build a Zod union\n // or apply .nullable() if it's just \"type + null\".\n\n // backward compatibility with openapi 3.0\n if ('nullable' in schema && schema.nullable) {\n types.push('null');\n }\n\n if (types.length > 1) {\n // If it\u2019s exactly one real type plus \"null\", we can do e.g. `z.string().nullable()`\n const realTypes = types.filter((t) => t !== 'null');\n if (realTypes.length === 1 && types.includes('null')) {\n // Single real type + \"null\"\n return this.normal(realTypes[0], schema, false, true);\n }\n // If multiple different types, build a union\n const subSchemas = types.map((t) => this.normal(t, schema, false));\n return `z.union([${subSchemas.join(', ')}])${appendOptional(required)}`;\n }\n return this.normal(types[0], schema, required, false);\n }\n}\n\n/**\n * Append .optional() if not required\n */\nfunction appendOptional(isRequired?: boolean) {\n return isRequired ? '' : '.optional()';\n}\nfunction appendDefault(defaultValue?: any) {\n return defaultValue !== undefined\n ? `.default(${JSON.stringify(defaultValue)})`\n : '';\n}\n\n// Todo: convert openapi 3.0 to 3.1 before proccesing\n", "export interface Interceptor {\n before?: (request: Request) => Promise<Request> | Request;\n after?: (response: Response) => Promise<Response> | Response;\n}\n\nexport const createHeadersInterceptor = (\n defaultHeaders: () => Record<string, string | undefined>,\n requestHeaders: HeadersInit,\n) => {\n return {\n before(request: Request) {\n // Priority Levels\n // 1. Headers Input\n // 2. Request Headers\n // 3. Default Headers\n const headers = defaultHeaders();\n\n for (const [key, value] of new Headers(requestHeaders)) {\n // Only set the header if it doesn't already exist and has a value\n // even though these headers are passed at operation level\n // still they are lower priority compared to the headers input\n if (value !== undefined && !request.headers.has(key)) {\n request.headers.set(key, value);\n }\n }\n\n for (const [key, value] of Object.entries(headers)) {\n // Only set the header if it doesn't already exist and has a value\n if (value !== undefined && !request.headers.has(key)) {\n request.headers.set(key, value);\n }\n }\n\n return request;\n },\n };\n};\n\nexport const createBaseUrlInterceptor = (getBaseUrl: () => string) => {\n return {\n before(request: Request) {\n const baseUrl = getBaseUrl();\n if (request.url.startsWith('local://')) {\n return new Request(request.url.replace('local://', baseUrl), request);\n }\n return request;\n },\n };\n};\n\nexport const logInterceptor = {\n before(request: Request) {\n console.log('Request', request);\n return request;\n },\n after(response: Response) {\n console.log('Response', response);\n return response;\n },\n};\n\n/**\n * Creates an interceptor that logs detailed information about requests and responses.\n * @param options Configuration options for the logger\n * @returns An interceptor object with before and after handlers\n */\nexport const createDetailedLogInterceptor = (options?: {\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n includeRequestBody?: boolean;\n includeResponseBody?: boolean;\n}) => {\n const logLevel = options?.logLevel || 'info';\n const includeRequestBody = options?.includeRequestBody || false;\n const includeResponseBody = options?.includeResponseBody || false;\n\n return {\n async before(request: Request) {\n const logData = {\n url: request.url,\n method: request.method,\n contentType: request.headers.get('Content-Type'),\n headers: Object.fromEntries([...request.headers.entries()]),\n };\n\n console[logLevel]('\uD83D\uDE80 Outgoing Request:', logData);\n\n if (includeRequestBody) {\n try {\n // Clone the request to avoid consuming the body stream\n const clonedRequest = request.clone();\n if (clonedRequest.headers.get('Content-Type')?.includes('application/json')) {\n const body = await clonedRequest.json().catch(() => null);\n console[logLevel]('Request Body:', body);\n } else {\n const body = await clonedRequest.text().catch(() => null);\n console[logLevel]('Request Body:', body);\n }\n } catch (error) {\n console.error('Could not log request body:', error);\n }\n }\n\n return request;\n },\n\n async after(response: Response) {\n const logData = {\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n headers: Object.fromEntries([...response.headers.entries()]),\n };\n\n console[logLevel]('\uD83D\uDCE5 Incoming Response:', logData);\n\n if (includeResponseBody && response.body) {\n try {\n // Clone the response to avoid consuming the body stream\n const clonedResponse = response.clone();\n if (clonedResponse.headers.get('Content-Type')?.includes('application/json')) {\n const body = await clonedResponse.json().catch(() => null);\n console[logLevel]('Response Body:', body);\n } else {\n const body = await clonedResponse.text().catch(() => null);\n if (body) {\n console[logLevel]('Response Body:', body.substring(0, 500) + (body.length > 500 ? '...' : ''));\n } else {\n console[logLevel]('No response body');\n }\n }\n } catch (error) {\n console.error('Could not log response body:', error);\n }\n }\n\n return response;\n },\n };\n};\n", "import { parse } from \"fast-content-type-parse\";\n\nexport async function handleError(response: Response) {\n\ttry {\n\t\tif (response.status >= 400 && response.status < 500) {\n\t\t\tconst body = (await response.json()) as Record<string, any>;\n\t\t\treturn {\n\t\t\t\tstatus: response.status,\n\t\t\t\tbody: body,\n\t\t\t};\n\t\t}\n\t\treturn new Error(\n\t\t\t`An error occurred while fetching the data. Status: ${response.status}`,\n\t\t);\n\t} catch (error) {\n\t\treturn error as any;\n\t}\n}\n\nasync function handleChunkedResponse(response: Response, contentType: string) {\n\tconst { type } = parse(contentType);\n\n\tswitch (type) {\n\t\tcase \"application/json\": {\n\t\t\tlet buffer = \"\";\n\t\t\tconst reader = response.body!.getReader();\n\t\t\tconst decoder = new TextDecoder();\n\t\t\twhile (true) {\n\t\t\t\tconst { value, done } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tbuffer += decoder.decode(value);\n\t\t\t}\n\t\t\treturn JSON.parse(buffer);\n\t\t}\n\t\tcase \"text/html\":\n\t\tcase \"text/plain\": {\n\t\t\tlet buffer = \"\";\n\t\t\tconst reader = response.body!.getReader();\n\t\t\tconst decoder = new TextDecoder();\n\t\t\twhile (true) {\n\t\t\t\tconst { value, done } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tbuffer += decoder.decode(value);\n\t\t\t}\n\t\t\treturn buffer;\n\t\t}\n\t\tdefault:\n\t\t\treturn response.body;\n\t}\n}\n\nexport function chunked(response: Response) {\n\treturn response.body;\n}\n\nexport async function buffered(response: Response) {\n\tconst contentType = response.headers.get(\"Content-Type\");\n\tif (!contentType) {\n\t\tthrow new Error(\"Content-Type header is missing\");\n\t}\n\n\tif (response.status === 204) {\n\t\treturn null;\n\t}\n\n\tconst { type } = parse(contentType);\n\tswitch (type) {\n\t\tcase \"application/json\":\n\t\t\treturn response.json();\n\t\tcase \"text/plain\":\n\t\t\treturn response.text();\n\t\tcase \"text/html\":\n\t\t\treturn response.text();\n\t\tcase \"text/xml\":\n\t\tcase \"application/xml\":\n\t\t\treturn response.text();\n\t\tcase \"application/x-www-form-urlencoded\": {\n\t\t\tconst text = await response.text();\n\t\t\treturn Object.fromEntries(new URLSearchParams(text));\n\t\t}\n\t\tcase \"multipart/form-data\":\n\t\t\treturn response.formData();\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported content type: ${contentType}`);\n\t}\n}\n", "import { z } from 'zod';\n\nexport type ParseError<T extends z.ZodType<any, any, any>> = {\n kind: 'parse';\n} & z.inferFlattenedErrors<T>;\n\nexport function parse<T extends z.ZodType>(\n schema: T,\n input: unknown,\n) {\n const result = schema.safeParse(input);\n if (!result.success) {\n const errors = result.error.flatten((issue) => issue);\n return [null, errors];\n }\n return [result.data as z.infer<T>, null];\n}\n", "export type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\nexport type ContentType = 'xml' | 'json' | 'urlencoded' | 'multipart';\nexport type Endpoint =\n | `${ContentType} ${Method} ${string}`\n | `${Method} ${string}`;\n\nexport type BodyInit =\n | ArrayBuffer\n | Blob\n | FormData\n | URLSearchParams\n | null\n | string;\n\nexport function createUrl(path: string, query: URLSearchParams) {\n const url = new URL(path, `local://`);\n url.search = query.toString();\n return url;\n}\n\nfunction template(\n templateString: string,\n templateVariables: Record<string, any>,\n): string {\n const nargs = /{([0-9a-zA-Z_]+)}/g;\n return templateString.replace(nargs, (match, key: string, index: number) => {\n // Handle escaped double braces\n if (\n templateString[index - 1] === '{' &&\n templateString[index + match.length] === '}'\n ) {\n return key;\n }\n\n const result = key in templateVariables ? templateVariables[key] : null;\n return result === null || result === undefined ? '' : String(result);\n });\n}\n\ntype Input = Record<string, any>;\ntype Props = {\n inputHeaders: string[];\n inputQuery: string[];\n inputBody: string[];\n inputParams: string[];\n};\n\nabstract class Serializer {\n protected input: Input;\n protected props: Props;\n\n constructor(\n input: Input,\n props: Props,\n ) {\n this.input = input;\n this.props = props;\n }\n\n abstract getBody(): BodyInit | null;\n abstract getHeaders(): Record<string, string>;\n serialize(): Serialized {\n const headers = new Headers({});\n for (const header of this.props.inputHeaders) {\n headers.set(header, this.input[header]);\n }\n\n const query = new URLSearchParams();\n for (const key of this.props.inputQuery) {\n const value = this.input[key];\n if (value !== undefined) {\n query.set(key, String(value));\n }\n }\n\n const params = this.props.inputParams.reduce<Record<string, any>>(\n (acc, key) => {\n acc[key] = this.input[key];\n return acc;\n },\n {},\n );\n\n return {\n body: this.getBody(),\n query,\n params,\n headers: this.getHeaders(),\n };\n }\n}\n\ninterface Serialized {\n body: BodyInit | null;\n query: URLSearchParams;\n params: Record<string, any>;\n headers: Record<string, string>;\n}\n\nclass JsonSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body: Record<string, any> = {};\n for (const prop of this.props.inputBody) {\n body[prop] = this.input[prop];\n }\n return JSON.stringify(body);\n }\n getHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n }\n}\n\nclass UrlencodedSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new URLSearchParams();\n for (const prop of this.props.inputBody) {\n body.set(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass NoBodySerializer extends Serializer {\n getBody(): BodyInit | null {\n return null;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass FormDataSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new FormData();\n for (const prop of this.props.inputBody) {\n body.append(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nexport function json(input: Input, props: Props) {\n return new JsonSerializer(input, props).serialize();\n}\nexport function urlencoded(input: Input, props: Props) {\n return new UrlencodedSerializer(input, props).serialize();\n}\nexport function nobody(input: Input, props: Props) {\n return new NoBodySerializer(input, props).serialize();\n}\nexport function formdata(input: Input, props: Props) {\n return new FormDataSerializer(input, props).serialize();\n}\n\nexport function toRequest<T extends Endpoint>(\n endpoint: T,\n input: Serialized,\n): Request {\n const [method, path] = endpoint.split(' ');\n const pathVariable = template(path, input.params);\n\n const url = createUrl(pathVariable, input.query);\n return new Request(url, {\n method: method,\n headers: input.headers,\n body: method === 'GET' ? undefined : input.body,\n });\n}\n", "export interface ApiResponse<Status extends number, Body extends unknown> {\n kind: 'response';\n status: Status;\n body: Body;\n}\n\n// 4xx Client Errors\nexport type BadRequest = ApiResponse<400, { message: string }>;\nexport type Unauthorized = ApiResponse<401, { message: string }>;\nexport type PaymentRequired = ApiResponse<402, { message: string }>;\nexport type Forbidden = ApiResponse<403, { message: string }>;\nexport type NotFound = ApiResponse<404, { message: string }>;\nexport type MethodNotAllowed = ApiResponse<405, { message: string }>;\nexport type NotAcceptable = ApiResponse<406, { message: string }>;\nexport type Conflict = ApiResponse<409, { message: string }>;\nexport type Gone = ApiResponse<410, { message: string }>;\nexport type UnprocessableEntity = ApiResponse<422, { message: string; errors?: Record<string, string[]> }>;\nexport type TooManyRequests = ApiResponse<429, { message: string; retryAfter?: string }>;\nexport type PayloadTooLarge = ApiResponse<413, { message: string; }>;\nexport type UnsupportedMediaType = ApiResponse<415, { message: string; }>;\n\n// 5xx Server Errors\nexport type InternalServerError = ApiResponse<500, { message: string }>;\nexport type NotImplemented = ApiResponse<501, { message: string }>;\nexport type BadGateway = ApiResponse<502, { message: string }>;\nexport type ServiceUnavailable = ApiResponse<503, { message: string; retryAfter?: string }>;\nexport type GatewayTimeout = ApiResponse<504, { message: string }>;\n\nexport type ClientError =\n | BadRequest\n | Unauthorized\n | PaymentRequired\n | Forbidden\n | NotFound\n | MethodNotAllowed\n | NotAcceptable\n | Conflict\n | Gone\n | UnprocessableEntity\n | TooManyRequests;\n\nexport type ServerError =\n | InternalServerError\n | NotImplemented\n | BadGateway\n | ServiceUnavailable\n | GatewayTimeout;\n\nexport type ProblematicResponse = ClientError | ServerError;\n", "\nexport interface RequestSchema {\n schema: z.ZodType;\n toRequest: (input: any) => Request;\n deserializer: (response: Response) => Promise<unknown> | unknown;\n}\n\nexport const fetchType = z\n .function()\n .args(z.instanceof(Request))\n .returns(z.promise(z.instanceof(Response)))\n .optional();\n\nexport async function sendRequest(\n input: unknown,\n route: RequestSchema,\n options: {\n fetch?: z.infer<typeof fetchType>;\n interceptors?: Interceptor[];\n signal?: AbortSignal;\n },\n) {\n const { interceptors = [] } = options;\n const [parsedInput, parseError] = parse(route.schema, input);\n if (parseError) {\n return [null as never, { ...parseError, kind: 'parse' } as never] as const;\n }\n\n let request = route.toRequest(parsedInput as never);\n for (const interceptor of interceptors) {\n if (interceptor.before) {\n request = await interceptor.before(request);\n }\n }\n\n let response = await (options.fetch ?? fetch)(request, { signal: options.signal });\n\n for (let i = interceptors.length - 1; i >= 0; i--) {\n const interceptor = interceptors[i];\n if (interceptor.after) {\n response = await interceptor.after(response.clone());\n }\n }\n\n if (response.ok) {\n const data = await route.deserializer(response);\n return [data as never, null] as const;\n }\n const error = await handleError(response);\n return [null as never, { ...error, kind: 'response' }] as const;\n}\n", "import { watch as nodeWatch } from 'node:fs/promises';\nimport { debounceTime, from } from 'rxjs';\n\nexport function watch(path: string) {\n return from(\n nodeWatch(path, {\n persistent: true,\n recursive: true,\n }),\n ).pipe(debounceTime(400));\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["get", "camelcase", "spinalcase", "removeDuplicates", "toLitObject", "toLitObject", "schema", "name", "security", "removeDuplicates", "it", "exclude", "appendOptional", "spinalcase", "camelcase", "methods", "security", "get", "security"]
|
|
4
|
+
"sourcesContent": ["import { join } from 'node:path';\nimport { npmRunPathEnv } from 'npm-run-path';\nimport type { OpenAPIObject } from 'openapi3-ts/oas31';\n\nimport { getFolderExports, methods, writeFiles } from '@sdk-it/core';\n\nimport { generateCode } from './generator.ts';\nimport interceptors from './http/interceptors.txt';\nimport parseResponse from './http/parse-response.txt';\nimport parserTxt from './http/parser.txt';\nimport requestTxt from './http/request.txt';\nimport responseTxt from './http/response.txt';\nimport sendRequest from './http/send-request.txt';\nimport { generateInputs, generateSDK } from './sdk.ts';\nimport { exclude, securityToOptions } from './utils.ts';\n\nfunction security(spec: OpenAPIObject) {\n const security = spec.security || [];\n const components = spec.components || {};\n const securitySchemes = components.securitySchemes || {};\n const paths = Object.values(spec.paths ?? {});\n\n const options = securityToOptions(security, securitySchemes);\n\n for (const it of paths) {\n for (const method of methods) {\n const operation = it[method];\n if (!operation) {\n continue;\n }\n Object.assign(\n options,\n securityToOptions(operation.security || [], securitySchemes, 'input'),\n );\n }\n }\n return options;\n}\n\nexport async function generate(\n spec: OpenAPIObject,\n settings: {\n output: string;\n useTsExtension?: boolean;\n name?: string;\n /**\n * full: generate a full project including package.json and tsconfig.json. useful for monorepo/workspaces\n * minimal: generate only the client sdk\n */\n mode?: 'full' | 'minimal';\n formatCode?: (options: {\n output: string;\n env: ReturnType<typeof npmRunPathEnv>;\n }) => void | Promise<void>;\n },\n) {\n settings.useTsExtension ??= true;\n const makeImport = (moduleSpecifier: string) => {\n return settings.useTsExtension ? `${moduleSpecifier}.ts` : moduleSpecifier;\n };\n const { commonSchemas, groups, outputs, commonZod } = generateCode({\n spec,\n style: 'github',\n target: 'javascript',\n makeImport,\n });\n const output =\n settings.mode === 'full' ? join(settings.output, 'src') : settings.output;\n\n const options = security(spec);\n\n const clientFiles = generateSDK({\n name: settings.name || 'Client',\n operations: groups,\n servers: spec.servers?.map((server) => server.url) || [],\n options: options,\n makeImport,\n });\n\n // const readme = generateReadme(spec, {\n // name: settings.name || 'Client',\n // });\n\n const inputFiles = generateInputs(groups, commonZod, makeImport);\n\n await writeFiles(output, {\n 'outputs/.gitkeep': '',\n 'inputs/.gitkeep': '',\n 'models/.getkeep': '',\n // 'README.md': readme,\n });\n\n await writeFiles(join(output, 'http'), {\n 'interceptors.ts': interceptors,\n 'parse-response.ts': parseResponse,\n 'send-request.ts': `import z from 'zod';\nimport type { Interceptor } from './${makeImport('interceptors')}';\nimport { handleError } from './${makeImport('parse-response')}';\nimport { parse } from './${makeImport('parser')}';\n${sendRequest}`,\n 'response.ts': responseTxt,\n 'parser.ts': parserTxt,\n 'request.ts': requestTxt,\n });\n\n await writeFiles(join(output, 'outputs'), outputs);\n const modelsImports = Object.entries(commonSchemas).map(([name]) => name);\n await writeFiles(output, {\n ...clientFiles,\n ...inputFiles,\n ...Object.fromEntries(\n Object.entries(commonSchemas).map(([name, schema]) => [\n `models/${name}.ts`,\n [\n `import { z } from 'zod';`,\n ...exclude(modelsImports, [name]).map(\n (it) => `import type { ${it} } from './${it}.ts';`,\n ),\n `export type ${name} = ${schema};`,\n ].join('\\n'),\n ]),\n ),\n });\n\n const folders = [\n getFolderExports(join(output, 'outputs'), settings.useTsExtension),\n getFolderExports(\n join(output, 'inputs'),\n settings.useTsExtension,\n ['ts'],\n (dirent) => dirent.isDirectory() && dirent.name === 'schemas',\n ),\n getFolderExports(join(output, 'http'), settings.useTsExtension),\n ];\n if (modelsImports.length) {\n folders.push(\n getFolderExports(join(output, 'models'), settings.useTsExtension),\n );\n }\n const [outputIndex, inputsIndex, httpIndex, modelsIndex] =\n await Promise.all(folders);\n await writeFiles(output, {\n 'outputs/index.ts': outputIndex,\n 'inputs/index.ts': inputsIndex || null,\n 'http/index.ts': httpIndex,\n ...(modelsImports.length ? { 'models/index.ts': modelsIndex } : {}),\n });\n await writeFiles(output, {\n 'index.ts': await getFolderExports(output, settings.useTsExtension),\n });\n if (settings.mode === 'full') {\n await writeFiles(settings.output, {\n 'package.json': {\n ignoreIfExists: true,\n content: JSON.stringify(\n {\n name: 'sdk',\n type: 'module',\n main: './src/index.ts',\n dependencies: {\n 'fast-content-type-parse': '^3.0.0',\n zod: '^3.24.2',\n },\n },\n null,\n 2,\n ),\n },\n 'tsconfig.json': {\n ignoreIfExists: true,\n content: JSON.stringify(\n {\n compilerOptions: {\n skipLibCheck: true,\n skipDefaultLibCheck: true,\n target: 'ESNext',\n module: 'ESNext',\n noEmit: true,\n strict: true,\n allowImportingTsExtensions: true,\n verbatimModuleSyntax: true,\n baseUrl: '.',\n moduleResolution: 'bundler',\n },\n include: ['**/*.ts'],\n },\n null,\n 2,\n ),\n },\n });\n }\n\n await settings.formatCode?.({\n output: output,\n env: npmRunPathEnv(),\n });\n}\n", "import { get, merge } from 'lodash-es';\nimport type {\n ContentObject,\n OpenAPIObject,\n OperationObject,\n ParameterLocation,\n ParameterObject,\n ReferenceObject,\n ResponseObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase, pascalcase, spinalcase } from 'stringcase';\n\nimport { removeDuplicates } from '@sdk-it/core';\n\nimport { TypeScriptDeserialzer } from './emitters/interface.ts';\nimport { ZodDeserialzer } from './emitters/zod.ts';\nimport {\n type Operation,\n type OperationInput,\n type Parser,\n type Spec,\n} from './sdk.ts';\nimport { followRef, isRef, securityToOptions, useImports } from './utils.ts';\n\nexport interface NamedImport {\n name: string;\n alias?: string;\n isTypeOnly: boolean;\n}\nexport interface Import {\n isTypeOnly: boolean;\n moduleSpecifier: string;\n defaultImport: string | undefined;\n namedImports: NamedImport[];\n namespaceImport: string | undefined;\n}\n\nconst statusCdeToMessageMap: Record<string, string> = {\n '400': 'BadRequest',\n '401': 'Unauthorized',\n '402': 'PaymentRequired',\n '403': 'Forbidden',\n '404': 'NotFound',\n '405': 'MethodNotAllowed',\n '406': 'NotAcceptable',\n '409': 'Conflict',\n '413': 'PayloadTooLarge',\n '410': 'Gone',\n '422': 'UnprocessableEntity',\n '429': 'TooManyRequests',\n '500': 'InternalServerError',\n '501': 'NotImplemented',\n '502': 'BadGateway',\n '503': 'ServiceUnavailable',\n '504': 'GatewayTimeout',\n};\n\nexport interface GenerateSdkConfig {\n spec: OpenAPIObject;\n target?: 'javascript';\n /**\n * No support for jsdoc in vscode\n * @issue https://github.com/microsoft/TypeScript/issues/38106\n */\n style?: 'github';\n operationId?: (\n operation: OperationObject,\n path: string,\n method: string,\n ) => string;\n makeImport: (module: string) => string;\n}\n\nexport const defaults: Partial<GenerateSdkConfig> &\n Required<Pick<GenerateSdkConfig, 'operationId'>> = {\n target: 'javascript',\n style: 'github',\n operationId: (operation, path, method) => {\n if (operation.operationId) {\n return spinalcase(operation.operationId);\n }\n return camelcase(`${method} ${path.replace(/[\\\\/\\\\{\\\\}]/g, ' ').trim()}`);\n },\n};\n\nexport function generateCode(config: GenerateSdkConfig) {\n const commonSchemas: Record<string, string> = {};\n const commonZod = new Map<string, string>();\n const commonZodImports: Import[] = [];\n const zodDeserialzer = new ZodDeserialzer(config.spec, (model, schema) => {\n commonZod.set(model, schema);\n commonZodImports.push({\n defaultImport: undefined,\n isTypeOnly: true,\n moduleSpecifier: `./${config.makeImport(model)}`,\n namedImports: [{ isTypeOnly: true, name: model }],\n namespaceImport: undefined,\n });\n });\n\n const groups: Spec['operations'] = {};\n const outputs: Record<string, string> = {};\n\n for (const [path, pathItem] of Object.entries(config.spec.paths ?? {})) {\n const { parameters = [], ...methods } = pathItem;\n\n for (const [method, operation] of Object.entries(methods) as [\n string,\n OperationObject,\n ][]) {\n const formatOperationId = config.operationId ?? defaults.operationId;\n const operationName = formatOperationId(operation, path, method);\n\n console.log(`Processing ${method} ${path}`);\n const [groupName] = Array.isArray(operation.tags)\n ? operation.tags\n : ['unknown'];\n groups[groupName] ??= [];\n const inputs: Operation['inputs'] = {};\n\n const additionalProperties: ParameterObject[] = [];\n for (const param of [...parameters, ...(operation.parameters ?? [])]) {\n if (isRef(param)) {\n throw new Error(`Found reference in parameter ${param.$ref}`);\n }\n if (!param.schema) {\n throw new Error(`Schema not found for parameter ${param.name}`);\n }\n inputs[param.name] = {\n in: param.in,\n schema: '',\n };\n additionalProperties.push(param);\n }\n\n const security = operation.security ?? [];\n const securitySchemes = config.spec.components?.securitySchemes ?? {};\n\n const securityOptions = securityToOptions(security, securitySchemes);\n\n Object.assign(inputs, securityOptions);\n\n additionalProperties.push(\n ...Object.entries(securityOptions).map(\n ([name, value]) =>\n ({\n name: name,\n required: false,\n schema: {\n type: 'string',\n },\n in: value.in as ParameterLocation,\n }) satisfies ParameterObject,\n ),\n );\n\n const types: Record<string, string> = {};\n const shortContenTypeMap: Record<string, string> = {\n 'application/json': 'json',\n 'application/x-www-form-urlencoded': 'urlencoded',\n 'multipart/form-data': 'formdata',\n 'application/xml': 'xml',\n 'text/plain': 'text',\n };\n let outgoingContentType: string | undefined;\n if (operation.requestBody && Object.keys(operation.requestBody).length) {\n const content: ContentObject = isRef(operation.requestBody)\n ? get(followRef(config.spec, operation.requestBody.$ref), ['content'])\n : operation.requestBody.content;\n\n for (const type in content) {\n const ctSchema = isRef(content[type].schema)\n ? followRef(config.spec, content[type].schema.$ref)\n : content[type].schema;\n if (!ctSchema) {\n console.warn(`Schema not found for ${type}`);\n continue;\n }\n\n const schema = merge({}, ctSchema, {\n required: additionalProperties\n .filter((p) => p.required)\n .map((p) => p.name),\n properties: additionalProperties.reduce<Record<string, unknown>>(\n (acc, p) => ({\n ...acc,\n [p.name]: p.schema,\n }),\n {},\n ),\n });\n\n Object.assign(inputs, bodyInputs(config, ctSchema));\n types[shortContenTypeMap[type]] = zodDeserialzer.handle(schema, true);\n }\n\n if (content['application/json']) {\n outgoingContentType = 'json';\n } else if (content['application/x-www-form-urlencoded']) {\n outgoingContentType = 'urlencoded';\n } else if (content['multipart/form-data']) {\n outgoingContentType = 'formdata';\n } else {\n outgoingContentType = 'json';\n }\n } else {\n const properties = additionalProperties.reduce<Record<string, any>>(\n (acc, p) => ({\n ...acc,\n [p.name]: p.schema,\n }),\n {},\n );\n types[shortContenTypeMap['application/json']] = zodDeserialzer.handle(\n {\n type: 'object',\n required: additionalProperties\n .filter((p) => p.required)\n .map((p) => p.name),\n properties,\n },\n true,\n );\n }\n\n const errors: string[] = [];\n operation.responses ??= {};\n\n let foundResponse = false;\n const output = [`import z from 'zod';`];\n let parser: Parser = 'buffered';\n const responses: string[] = [];\n const responsesImports: Record<string, Import> = {};\n for (const status in operation.responses) {\n const response = isRef(\n operation.responses[status] as ResponseObject | ReferenceObject,\n )\n ? (followRef(\n config.spec,\n operation.responses[status].$ref,\n ) as ResponseObject)\n : (operation.responses[status] as ResponseObject);\n const statusCode = +status;\n if (statusCode >= 400) {\n errors.push(statusCdeToMessageMap[status] ?? 'ProblematicResponse');\n }\n if (statusCode >= 200 && statusCode < 300) {\n foundResponse = true;\n const responseContent = get(response, ['content']);\n const isJson = responseContent && responseContent['application/json'];\n if ((response.headers ?? {})['Transfer-Encoding']) {\n parser = 'chunked';\n }\n // TODO: how the user is going to handle multiple response types\n const typeScriptDeserialzer = new TypeScriptDeserialzer(\n config.spec,\n (schemaName, zod) => {\n commonSchemas[schemaName] = zod;\n responsesImports[schemaName] = {\n defaultImport: undefined,\n isTypeOnly: true,\n moduleSpecifier: `../models/${config.makeImport(schemaName)}`,\n namedImports: [{ isTypeOnly: true, name: schemaName }],\n namespaceImport: undefined,\n };\n },\n );\n const responseSchema = isJson\n ? typeScriptDeserialzer.handle(\n responseContent['application/json'].schema!,\n true,\n )\n : statusCode === 204\n ? 'void'\n : 'ReadableStream'; // non-json response treated as stream\n\n responses.push(responseSchema);\n }\n }\n\n if (responses.length > 1) {\n // remove duplicates in case an operation has multiple responses with the same schema\n output.push(\n `export type ${pascalcase(operationName + ' output')} = ${removeDuplicates(\n responses,\n (it) => it,\n ).join(' | ')};`,\n );\n } else {\n output.push(\n `export type ${pascalcase(operationName + ' output')} = ${responses[0]};`,\n );\n }\n output.push(\n ...useImports(output.join(''), Object.values(responsesImports)),\n );\n\n if (!foundResponse) {\n output.push(\n `export type ${pascalcase(operationName + ' output')} = void`,\n );\n }\n outputs[`${spinalcase(operationName)}.ts`] = output.join('\\n');\n groups[groupName].push({\n name: operationName,\n type: 'http',\n inputs,\n errors: errors.length ? errors : ['ServerError'],\n outgoingContentType,\n schemas: types,\n parser,\n formatOutput: () => ({\n import: pascalcase(operationName + ' output'),\n use: pascalcase(operationName + ' output'),\n }),\n trigger: {\n path,\n method,\n },\n });\n }\n }\n\n return { groups, commonSchemas, commonZod, outputs };\n}\n\n// TODO - USE CASES\n// 1. Some parameters conflicts with request body\n// 2. Generate 400 and 500 response variations // done\n// 3. Generate 200 response variations\n// 3. Doc Security\n// 4. Operation Security\n// 5. JsDocs\n// 5. test all different types of parameters\n// 6. cookies\n// 6. x-www-form-urlencoded // done\n// 7. multipart/form-data // done\n// 7. application/octet-stream // done\n// 7. chunked response // done\n\nfunction toProps(\n spec: OpenAPIObject,\n schemaOrRef: SchemaObject | ReferenceObject,\n aggregator: string[] = [],\n) {\n if (isRef(schemaOrRef)) {\n const schema = followRef(spec, schemaOrRef.$ref);\n return toProps(spec, schema, aggregator);\n } else if (schemaOrRef.type === 'object') {\n for (const [name] of Object.entries(schemaOrRef.properties ?? {})) {\n aggregator.push(name);\n }\n return void 0;\n } else if (\n (schemaOrRef.type === 'array' || schemaOrRef.type?.includes('array')) &&\n schemaOrRef.items\n ) {\n toProps(spec, schemaOrRef.items, aggregator);\n return void 0;\n } else if (schemaOrRef.allOf) {\n for (const it of schemaOrRef.allOf) {\n toProps(spec, it, aggregator);\n }\n return void 0;\n } else if (schemaOrRef.oneOf) {\n for (const it of schemaOrRef.oneOf) {\n toProps(spec, it, aggregator);\n }\n return void 0;\n } else if (schemaOrRef.anyOf) {\n for (const it of schemaOrRef.anyOf) {\n toProps(spec, it, aggregator);\n }\n return void 0;\n }\n console.warn('Unknown schema in body', schemaOrRef);\n return void 0;\n}\n\nfunction bodyInputs(\n config: GenerateSdkConfig,\n ctSchema: SchemaObject | ReferenceObject,\n) {\n const props: string[] = [];\n toProps(config.spec, ctSchema, props);\n return props.reduce<Record<string, OperationInput>>(\n (acc, prop) => ({\n ...acc,\n [prop]: {\n in: 'body',\n schema: '',\n },\n }),\n {},\n );\n}\n", "import { get } from 'lodash-es';\nimport type {\n ComponentsObject,\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n SecurityRequirementObject,\n} from 'openapi3-ts/oas31';\n\nimport { removeDuplicates } from '@sdk-it/core';\n\nimport { type Options } from './sdk.ts';\n\nexport function isRef(obj: any): obj is ReferenceObject {\n return obj && '$ref' in obj;\n}\n\nexport function cleanRef(ref: string) {\n return ref.replace(/^#\\//, '');\n}\n\nexport function parseRef(ref: string) {\n const parts = ref.split('/');\n const [model] = parts.splice(-1);\n return { model, path: parts.join('/') };\n}\nexport function followRef(spec: OpenAPIObject, ref: string): SchemaObject {\n const pathParts = cleanRef(ref).split('/');\n const entry = get(spec, pathParts) as SchemaObject | ReferenceObject;\n if (entry && '$ref' in entry) {\n return followRef(spec, entry.$ref);\n }\n return entry;\n}\nexport function securityToOptions(\n security: SecurityRequirementObject[],\n securitySchemes: ComponentsObject['securitySchemes'],\n staticIn?: string,\n) {\n securitySchemes ??= {};\n const options: Options = {};\n for (const it of security) {\n const [name] = Object.keys(it);\n if (!name) {\n // this means the operation doesn't necessarily require security\n continue;\n }\n const schema = securitySchemes[name];\n if (isRef(schema)) {\n throw new Error(`Ref security schemas are not supported`);\n }\n if (schema.type === 'http') {\n options['authorization'] = {\n in: staticIn ?? 'header',\n schema:\n 'z.string().optional().transform((val) => (val ? `Bearer ${val}` : undefined))',\n optionName: 'token',\n };\n continue;\n }\n if (schema.type === 'apiKey') {\n if (!schema.in) {\n throw new Error(`apiKey security schema must have an \"in\" field`);\n }\n if (!schema.name) {\n throw new Error(`apiKey security schema must have a \"name\" field`);\n }\n options[schema.name] = {\n in: staticIn ?? schema.in,\n schema: 'z.string().optional()',\n };\n continue;\n }\n }\n return options;\n}\n\nexport function mergeImports(imports: Import[]) {\n const merged: Record<string, Import> = {};\n\n for (const i of imports) {\n merged[i.moduleSpecifier] = merged[i.moduleSpecifier] ?? {\n moduleSpecifier: i.moduleSpecifier,\n defaultImport: i.defaultImport,\n namespaceImport: i.namespaceImport,\n namedImports: [],\n };\n if (i.namedImports) {\n merged[i.moduleSpecifier].namedImports.push(...i.namedImports);\n }\n }\n\n return Object.values(merged);\n}\nexport interface Import {\n isTypeOnly: boolean;\n moduleSpecifier: string;\n defaultImport: string | undefined;\n namedImports: NamedImport[];\n namespaceImport: string | undefined;\n}\nexport interface NamedImport {\n name: string;\n alias?: string;\n isTypeOnly: boolean;\n}\n\nexport function importsToString(...imports: Import[]) {\n return imports.map((it) => {\n if (it.defaultImport) {\n return `import ${it.defaultImport} from '${it.moduleSpecifier}'`;\n }\n if (it.namespaceImport) {\n return `import * as ${it.namespaceImport} from '${it.moduleSpecifier}'`;\n }\n if (it.namedImports) {\n return `import {${removeDuplicates(it.namedImports, (it) => it.name)\n .map((n) => `${n.isTypeOnly ? 'type' : ''} ${n.name}`)\n .join(', ')}} from '${it.moduleSpecifier}'`;\n }\n throw new Error(`Invalid import ${JSON.stringify(it)}`);\n });\n}\n\nexport function exclude<T>(list: T[], exclude: T[]): T[] {\n return list.filter((it) => !exclude.includes(it));\n}\n\nexport function useImports(content: string, imports: Import[]) {\n const output: string[] = [];\n for (const it of mergeImports(imports)) {\n const singleImport = it.defaultImport ?? it.namespaceImport;\n if (singleImport && content.includes(singleImport)) {\n output.push(importsToString(it).join('\\n'));\n } else if (it.namedImports.length) {\n for (const namedImport of it.namedImports) {\n if (content.includes(namedImport.name)) {\n output.push(importsToString(it).join('\\n'));\n }\n }\n }\n }\n return output;\n}\n\nexport type MakeImportFn = (moduleSpecifier: string) => string;\n", "import { camelcase, spinalcase } from 'stringcase';\n\nimport { removeDuplicates, toLitObject } from '@sdk-it/core';\n\nimport backend from './client.ts';\nimport type { MakeImportFn } from './utils.ts';\n\nexport type Parser = 'chunked' | 'buffered';\nclass SchemaEndpoint {\n #makeImport: MakeImportFn;\n #imports: string[] = [];\n constructor(makeImport: MakeImportFn) {\n this.#makeImport = makeImport;\n this.#imports = [\n `import z from 'zod';`,\n `import type { Endpoints } from '${this.#makeImport('./endpoints')}';`,\n `import { toRequest, json, urlencoded, nobody, formdata, createUrl } from '${this.#makeImport('./http/request')}';`,\n `import type { ParseError } from '${this.#makeImport('./http/parser')}';`,\n `import { chunked, buffered } from \"${this.#makeImport('./http/parse-response')}\";`,\n ];\n }\n\n #endpoints: string[] = [];\n\n addEndpoint(endpoint: string, operation: string) {\n this.#endpoints.push(` \"${endpoint}\": ${operation},`);\n }\n\n addImport(value: string) {\n this.#imports.push(value);\n }\n\n complete() {\n return `${this.#imports.join('\\n')}\\nexport default {\\n${this.#endpoints.join('\\n')}\\n}`;\n }\n}\nclass Emitter {\n #makeImport: MakeImportFn;\n protected imports: string[] = [];\n constructor(makeImport: MakeImportFn) {\n this.#makeImport = makeImport;\n this.imports = [\n `import type z from 'zod';`,\n `import type { ParseError } from '${this.#makeImport('./http/parser')}';`,\n ];\n }\n protected endpoints: string[] = [];\n addEndpoint(endpoint: string, operation: string) {\n this.endpoints.push(` \"${endpoint}\": ${operation};`);\n }\n addImport(value: string) {\n this.imports.push(value);\n }\n complete() {\n return `${this.imports.join('\\n')}\\nexport interface Endpoints {\\n${this.endpoints.join('\\n')}\\n}`;\n }\n}\n\nexport interface SdkConfig {\n /**\n * The name of the sdk client\n */\n name: string;\n packageName?: string;\n options?: Record<string, any>;\n emptyBodyAsNull?: boolean;\n stripBodyFromGetAndHead?: boolean;\n output: string;\n}\n\nexport type Options = Record<\n string,\n {\n in: string;\n schema: string;\n optionName?: string;\n }\n>;\nexport interface Spec {\n operations: Record<string, Operation[]>;\n name: string;\n options: Options;\n servers: string[];\n makeImport: MakeImportFn;\n}\n\nexport interface OperationInput {\n in: string;\n schema: string;\n}\nexport interface Operation {\n name: string;\n errors: string[];\n type: string;\n trigger: Record<string, any>;\n outgoingContentType?: string;\n parser: Parser;\n schemas: Record<string, string>;\n inputs: Record<string, OperationInput>;\n formatOutput: () => { import: string; use: string };\n}\n\nexport function generateInputs(\n operationsSet: Spec['operations'],\n commonZod: Map<string, string>,\n makeImport: MakeImportFn,\n) {\n const commonImports = commonZod.keys().toArray();\n const inputs: Record<string, string> = {};\n for (const [name, operations] of Object.entries(operationsSet)) {\n const output: string[] = [];\n const imports = new Set(['import { z } from \"zod\";']);\n\n for (const operation of operations) {\n const schemaName = camelcase(`${operation.name} schema`);\n\n const schema = `export const ${schemaName} = ${\n Object.keys(operation.schemas).length === 1\n ? Object.values(operation.schemas)[0]\n : toLitObject(operation.schemas)\n };`;\n\n const inputContent = schema;\n\n for (const schema of commonImports) {\n if (inputContent.includes(schema)) {\n imports.add(\n `import { ${schema} } from './schemas/${makeImport(spinalcase(schema))}';`,\n );\n }\n }\n output.push(inputContent);\n }\n inputs[`inputs/${spinalcase(name)}.ts`] =\n [...imports, ...output].join('\\n') + '\\n';\n }\n\n const schemas = commonZod\n .entries()\n .reduce<string[][]>((acc, [name, schema]) => {\n const output = [`import { z } from 'zod';`];\n const content = `export const ${name} = ${schema};`;\n for (const schema of commonImports) {\n const preciseMatch = new RegExp(`\\\\b${schema}\\\\b`);\n if (preciseMatch.test(content) && schema !== name) {\n output.push(\n `import { ${schema} } from './${makeImport(spinalcase(schema))}';`,\n );\n }\n }\n\n output.push(content);\n return [\n [`inputs/schemas/${spinalcase(name)}.ts`, output.join('\\n')],\n ...acc,\n ];\n }, []);\n\n return {\n ...Object.fromEntries(schemas),\n ...inputs,\n };\n}\n\nexport function generateSDK(spec: Spec) {\n const emitter = new Emitter(spec.makeImport);\n const schemaEndpoint = new SchemaEndpoint(spec.makeImport);\n const errors: string[] = [];\n for (const [name, operations] of Object.entries(spec.operations)) {\n emitter.addImport(\n `import type * as ${camelcase(name)} from './inputs/${spec.makeImport(spinalcase(name))}';`,\n );\n schemaEndpoint.addImport(\n `import * as ${camelcase(name)} from './inputs/${spec.makeImport(spinalcase(name))}';`,\n );\n for (const operation of operations) {\n const schemaName = camelcase(`${operation.name} schema`);\n const schemaRef = `${camelcase(name)}.${schemaName}`;\n const output = operation.formatOutput();\n const inputHeaders: string[] = [];\n const inputQuery: string[] = [];\n const inputBody: string[] = [];\n const inputParams: string[] = [];\n for (const [name, prop] of Object.entries(operation.inputs)) {\n if (prop.in === 'headers' || prop.in === 'header') {\n inputHeaders.push(`\"${name}\"`);\n } else if (prop.in === 'query') {\n inputQuery.push(`\"${name}\"`);\n } else if (prop.in === 'body') {\n inputBody.push(`\"${name}\"`);\n } else if (prop.in === 'path') {\n inputParams.push(`\"${name}\"`);\n } else if (prop.in === 'internal') {\n // ignore internal sources\n continue;\n } else {\n throw new Error(\n `Unknown source ${prop.in} in ${name} ${JSON.stringify(\n prop,\n )} in ${operation.name}`,\n );\n }\n }\n emitter.addImport(\n `import type {${output.import}} from './outputs/${spec.makeImport(spinalcase(operation.name))}';`,\n );\n errors.push(...(operation.errors ?? []));\n\n const addTypeParser = Object.keys(operation.schemas).length > 1;\n for (const type in operation.schemas ?? {}) {\n let typePrefix = '';\n if (addTypeParser && type !== 'json') {\n typePrefix = `${type} `;\n }\n const input = `typeof ${schemaRef}${addTypeParser ? `.${type}` : ''}`;\n\n const endpoint = `${typePrefix}${operation.trigger.method.toUpperCase()} ${operation.trigger.path}`;\n emitter.addEndpoint(\n endpoint,\n `{input: z.infer<${input}>; output: ${output.use}; error: ${(operation.errors ?? ['ServerError']).concat(`ParseError<${input}>`).join('|')}}`,\n );\n schemaEndpoint.addEndpoint(\n endpoint,\n `{\n schema: ${schemaRef}${addTypeParser ? `.${type}` : ''},\n deserializer: ${operation.parser === 'chunked' ? 'chunked' : 'buffered'},\n toRequest(input: Endpoints['${endpoint}']['input']) {\n const endpoint = '${endpoint}';\n return toRequest(endpoint, ${operation.outgoingContentType || 'nobody'}(input, {\n inputHeaders: [${inputHeaders}],\n inputQuery: [${inputQuery}],\n inputBody: [${inputBody}],\n inputParams: [${inputParams}],\n }));\n },\n }`,\n );\n }\n }\n }\n\n emitter.addImport(\n `import type { ${removeDuplicates(errors, (it) => it).join(', ')} } from '${spec.makeImport('./http/response')}';`,\n );\n return {\n 'client.ts': backend(spec),\n 'schemas.ts': schemaEndpoint.complete(),\n 'endpoints.ts': emitter.complete(),\n };\n}\n", "import { toLitObject } from '@sdk-it/core';\n\nimport type { Spec } from './sdk.ts';\n\nexport default (spec: Spec) => {\n const optionsEntries = Object.entries(spec.options).map(\n ([key, value]) => [`'${key}'`, value] as const,\n );\n const defaultHeaders = `{${optionsEntries\n .filter(([, value]) => value.in === 'header')\n .map(\n ([key, value]) =>\n `${key}: this.options[${value.optionName ? `'${value.optionName}'` : key}]`,\n )\n .join(',\\n')}}`;\n const defaultInputs = `{${optionsEntries\n .filter(([, value]) => value.in === 'input')\n .map(\n ([key, value]) =>\n `${key}: this.options[${value.optionName ? `'${value.optionName}'` : key}]`,\n )\n .join(',\\n')}}`;\n const specOptions: Record<string, { schema: string }> = {\n ...Object.fromEntries(\n optionsEntries.map(([key, value]) => [value.optionName ?? key, value]),\n ),\n fetch: {\n schema: 'fetchType',\n },\n baseUrl: {\n schema: spec.servers.length\n ? `z.enum(servers).default(servers[0])`\n : 'z.string()',\n },\n };\n\n return `\nimport { fetchType, sendRequest } from './http/${spec.makeImport('send-request')}';\nimport z from 'zod';\nimport type { Endpoints } from './${spec.makeImport('endpoints')}';\nimport schemas from './${spec.makeImport('schemas')}';\nimport {\n createBaseUrlInterceptor,\n createHeadersInterceptor,\n} from './http/${spec.makeImport('interceptors')}';\n\n${spec.servers.length ? `export const servers = ${JSON.stringify(spec.servers, null, 2)} as const` : ''}\nconst optionsSchema = z.object(${toLitObject(specOptions, (x) => x.schema)});\n${spec.servers.length ? `export type Servers = typeof servers[number];` : ''}\n\ntype ${spec.name}Options = z.infer<typeof optionsSchema>;\n\nexport class ${spec.name} {\n public options: ${spec.name}Options\n constructor(options: ${spec.name}Options) {\n this.options = optionsSchema.parse(options);\n }\n\n async request<E extends keyof Endpoints>(\n endpoint: E,\n input: Endpoints[E]['input'],\n options?: { signal?: AbortSignal, headers?: HeadersInit },\n ): Promise<readonly [Endpoints[E]['output'], Endpoints[E]['error'] | null]> {\n const route = schemas[endpoint];\n return sendRequest(Object.assign(this.#defaultInputs, input), route, {\n fetch: this.options.fetch,\n interceptors: [\n createHeadersInterceptor(() => this.defaultHeaders, options?.headers ?? {}),\n createBaseUrlInterceptor(() => this.options.baseUrl),\n ],\n signal: options?.signal,\n });\n }\n\n get defaultHeaders() {\n return ${defaultHeaders}\n }\n\n get #defaultInputs() {\n return ${defaultInputs}\n }\n\n setOptions(options: Partial<${spec.name}Options>) {\n const validated = optionsSchema.partial().parse(options);\n\n for (const key of Object.keys(validated) as (keyof ${spec.name}Options)[]) {\n if (validated[key] !== undefined) {\n (this.options[key] as typeof validated[typeof key]) = validated[key]!;\n }\n }\n }\n}`;\n};\n", "import type {\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { cleanRef, followRef, isRef, parseRef } from '../utils.ts';\n\ntype OnRefCallback = (ref: string, interfaceContent: string) => void;\n\n/**\n * Convert an OpenAPI (JSON Schema style) object into TypeScript interfaces,\n */\nexport class TypeScriptDeserialzer {\n circularRefTracker = new Set<string>();\n #spec: OpenAPIObject;\n #onRef: OnRefCallback;\n\n constructor(spec: OpenAPIObject, onRef: OnRefCallback) {\n this.#spec = spec;\n this.#onRef = onRef;\n }\n #stringifyKey = (key: string): string => {\n // List of JavaScript keywords and special object properties that should be quoted\n const reservedWords = [\n 'constructor',\n 'prototype',\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'export',\n 'extends',\n 'false',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'new',\n 'null',\n 'return',\n 'super',\n 'switch',\n 'this',\n 'throw',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n ];\n\n // Check if key is a reserved word\n if (reservedWords.includes(key)) {\n return `'${key}'`;\n }\n\n // Check if key is empty or only whitespace\n if (key.trim() === '') {\n return `'${key}'`;\n }\n\n // Check if first character is valid for identifiers\n const firstChar = key.charAt(0);\n const validFirstChar =\n (firstChar >= 'a' && firstChar <= 'z') ||\n (firstChar >= 'A' && firstChar <= 'Z') ||\n firstChar === '_' ||\n firstChar === '$';\n\n if (!validFirstChar) {\n return `'${key.replace(/'/g, \"\\\\'\")}'`;\n }\n\n // Check if the rest of the characters are valid for identifiers\n for (let i = 1; i < key.length; i++) {\n const char = key.charAt(i);\n const validChar =\n (char >= 'a' && char <= 'z') ||\n (char >= 'A' && char <= 'Z') ||\n (char >= '0' && char <= '9') ||\n char === '_' ||\n char === '$';\n\n if (!validChar) {\n return `'${key.replace(/'/g, \"\\\\'\")}'`;\n }\n }\n\n return key;\n };\n #stringifyKeyV2 = (value: string): string => {\n return `'${value}'`;\n };\n\n /**\n * Handle objects (properties)\n */\n object(schema: SchemaObject, required = false): string {\n const properties = schema.properties || {};\n\n // Convert each property\n const propEntries = Object.entries(properties).map(([key, propSchema]) => {\n const isRequired = (schema.required ?? []).includes(key);\n const tsType = this.handle(propSchema, isRequired);\n // Add question mark for optional properties\n return `${this.#stringifyKeyV2(key)}: ${tsType}`;\n });\n\n // Handle additionalProperties\n if (schema.additionalProperties) {\n if (typeof schema.additionalProperties === 'object') {\n const indexType = this.handle(schema.additionalProperties, true);\n propEntries.push(`[key: string]: ${indexType}`);\n } else if (schema.additionalProperties === true) {\n propEntries.push('[key: string]: any');\n }\n }\n\n return `{ ${propEntries.join('; ')} }`;\n }\n\n /**\n * Handle arrays (items could be a single schema or a tuple)\n */\n array(schema: SchemaObject, required = false): string {\n const { items } = schema;\n if (!items) {\n // No items => any[]\n return 'any[]';\n }\n\n // If items is an array => tuple\n if (Array.isArray(items)) {\n const tupleItems = items.map((sub) => this.handle(sub, true));\n return `[${tupleItems.join(', ')}]`;\n }\n\n // If items is a single schema => standard array\n const itemsType = this.handle(items, true);\n return `${itemsType}[]`;\n }\n\n /**\n * Convert a basic type (string | number | boolean | object | array, etc.) to TypeScript\n */\n normal(type: string, schema: SchemaObject, required = false): string {\n switch (type) {\n case 'string':\n return this.string(schema, required);\n case 'number':\n case 'integer':\n return this.number(schema, required);\n case 'boolean':\n return appendOptional('boolean', required);\n case 'object':\n return this.object(schema, required);\n case 'array':\n return this.array(schema, required);\n case 'null':\n return 'null';\n default:\n // Unknown type -> fallback\n return appendOptional('any', required);\n }\n }\n\n ref($ref: string, required: boolean): string {\n const schemaName = cleanRef($ref).split('/').pop()!;\n\n if (this.circularRefTracker.has(schemaName)) {\n return schemaName;\n }\n\n this.circularRefTracker.add(schemaName);\n this.#onRef(schemaName, this.handle(followRef(this.#spec, $ref), true));\n this.circularRefTracker.delete(schemaName);\n\n return appendOptional(schemaName, required);\n }\n\n allOf(schemas: (SchemaObject | ReferenceObject)[]): string {\n // For TypeScript we use intersection types for allOf\n const allOfTypes = schemas.map((sub) => this.handle(sub, true));\n return allOfTypes.length > 1 ? `${allOfTypes.join(' & ')}` : allOfTypes[0];\n }\n\n anyOf(\n schemas: (SchemaObject | ReferenceObject)[],\n required: boolean,\n ): string {\n // For TypeScript we use union types for anyOf/oneOf\n const anyOfTypes = schemas.map((sub) => this.handle(sub, true));\n return appendOptional(\n anyOfTypes.length > 1 ? `${anyOfTypes.join(' | ')}` : anyOfTypes[0],\n required,\n );\n }\n\n oneOf(\n schemas: (SchemaObject | ReferenceObject)[],\n required: boolean,\n ): string {\n const oneOfTypes = schemas.map((sub) => {\n if (isRef(sub)) {\n const { model } = parseRef(sub.$ref);\n if (this.circularRefTracker.has(model)) {\n return model;\n }\n }\n return this.handle(sub, false);\n });\n return appendOptional(\n oneOfTypes.length > 1 ? `${oneOfTypes.join(' | ')}` : oneOfTypes[0],\n required,\n );\n }\n\n enum(values: any[], required: boolean): string {\n // For TypeScript enums as union of literals\n const enumValues = values\n .map((val) => (typeof val === 'string' ? `'${val}'` : `${val}`))\n .join(' | ');\n return appendOptional(enumValues, required);\n }\n\n /**\n * Handle string type with formats\n */\n string(schema: SchemaObject, required?: boolean): string {\n let type: string;\n\n switch (schema.format) {\n case 'date-time':\n case 'datetime':\n case 'date':\n type = 'Date';\n break;\n case 'binary':\n case 'byte':\n type = 'Blob';\n break;\n case 'int64':\n type = 'bigint';\n break;\n default:\n type = 'string';\n }\n\n return appendOptional(type, required);\n }\n\n /**\n * Handle number/integer types with formats\n */\n number(schema: SchemaObject, required?: boolean): string {\n const type = schema.format === 'int64' ? 'bigint' : 'number';\n return appendOptional(type, required);\n }\n\n handle(schema: SchemaObject | ReferenceObject, required: boolean): string {\n if (isRef(schema)) {\n return this.ref(schema.$ref, required);\n }\n\n // Handle allOf (intersection in TypeScript)\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.allOf(schema.allOf);\n }\n\n // anyOf (union in TypeScript)\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.anyOf(schema.anyOf, required);\n }\n\n // oneOf (union in TypeScript)\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return this.oneOf(schema.oneOf, required);\n }\n\n // enum\n if (schema.enum && Array.isArray(schema.enum)) {\n return this.enum(schema.enum, required);\n }\n\n // Handle types, in TypeScript we can have union types directly\n const types = Array.isArray(schema.type)\n ? schema.type\n : schema.type\n ? [schema.type]\n : [];\n\n // If no explicit \"type\", fallback to any\n if (!types.length) {\n // unless properties are defined then assume object\n if ('properties' in schema) {\n return this.object(schema, required);\n }\n return appendOptional('any', required);\n }\n\n // Handle union types (multiple types)\n if (types.length > 1) {\n const realTypes = types.filter((t) => t !== 'null');\n if (realTypes.length === 1 && types.includes('null')) {\n // Single real type + \"null\"\n const tsType = this.normal(realTypes[0], schema, false);\n return appendOptional(`${tsType} | null`, required);\n }\n\n // Multiple different types\n const typeResults = types.map((t) => this.normal(t, schema, false));\n return appendOptional(typeResults.join(' | '), required);\n }\n\n // Single type\n return this.normal(types[0], schema, required);\n }\n\n /**\n * Generate an interface declaration\n */\n generateInterface(\n name: string,\n schema: SchemaObject | ReferenceObject,\n ): string {\n const content = this.handle(schema, true);\n return `interface ${name} ${content}`;\n }\n}\n\n/**\n * Append \"| undefined\" if not required\n */\nfunction appendOptional(type: string, isRequired?: boolean): string {\n return isRequired ? type : `${type} | undefined`;\n}\n", "import type {\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { cleanRef, followRef, isRef, parseRef } from '../utils.ts';\n\ntype OnRefCallback = (ref: string, zod: string) => void;\n\n/**\n * Convert an OpenAPI (JSON Schema style) object into a Zod schema string,\n * adapted for OpenAPI 3.1 (fully aligned with JSON Schema 2020-12).\n */\nexport class ZodDeserialzer {\n circularRefTracker = new Set<string>();\n #spec: OpenAPIObject;\n #onRef?: OnRefCallback;\n\n constructor(spec: OpenAPIObject, onRef?: OnRefCallback) {\n this.#spec = spec;\n this.#onRef = onRef;\n }\n /**\n * Handle objects (properties, additionalProperties).\n */\n object(schema: SchemaObject, required = false): string {\n const properties = schema.properties || {};\n\n // Convert each property\n const propEntries = Object.entries(properties).map(([key, propSchema]) => {\n const isRequired = (schema.required ?? []).includes(key);\n const zodPart = this.handle(propSchema, isRequired);\n return `'${key}': ${zodPart}`;\n });\n\n // additionalProperties\n let additionalProps = '';\n if (schema.additionalProperties) {\n if (typeof schema.additionalProperties === 'object') {\n // e.g. z.record() if it\u2019s an object schema\n const addPropZod = this.handle(schema.additionalProperties, true);\n additionalProps = `.catchall(${addPropZod})`;\n } else if (schema.additionalProperties === true) {\n // free-form additional props\n additionalProps = `.catchall(z.unknown())`;\n }\n }\n\n const objectSchema = `z.object({${propEntries.join(', ')}})${additionalProps}`;\n return `${objectSchema}${appendOptional(required)}`;\n }\n\n /**\n * Handle arrays (items could be a single schema or a tuple (array of schemas)).\n * In JSON Schema 2020-12, `items` can be an array \u2192 tuple style.\n */\n array(schema: SchemaObject, required = false): string {\n const { items } = schema;\n if (!items) {\n // No items => z.array(z.unknown())\n return `z.array(z.unknown())${appendOptional(required)}`;\n }\n\n // If items is an array => tuple\n if (Array.isArray(items)) {\n // Build a Zod tuple\n const tupleItems = items.map((sub) => this.handle(sub, true));\n const base = `z.tuple([${tupleItems.join(', ')}])`;\n // // If we have additionalItems: false => that\u2019s a fixed length\n // // If additionalItems is a schema => rest(...)\n // if (schema.additionalItems) {\n // if (typeof schema.additionalItems === 'object') {\n // const restSchema = jsonSchemaToZod(spec, schema.additionalItems, true);\n // base += `.rest(${restSchema})`;\n // }\n // // If `additionalItems: false`, no rest is allowed => do nothing\n // }\n return `${base}${appendOptional(required)}`;\n }\n\n // If items is a single schema => standard z.array(...)\n const itemsSchema = this.handle(items, true);\n return `z.array(${itemsSchema})${appendOptional(required)}`;\n }\n // oneOf() {}\n // enum() {}\n\n #suffixes = (defaultValue: unknown, required: boolean, nullable: boolean) => {\n return `${nullable ? '.nullable()' : ''}${appendDefault(defaultValue)}${appendOptional(required)}`;\n };\n\n /**\n * Convert a basic type (string | number | boolean | object | array, etc.) to Zod.\n * We'll also handle .optional() if needed.\n */\n normal(\n type: string,\n schema: SchemaObject,\n required = false,\n nullable = false,\n ): string {\n switch (type) {\n case 'string':\n return `${this.string(schema)}${this.#suffixes(JSON.stringify(schema.default), required, nullable)}`;\n case 'number':\n case 'integer': {\n const { base, defaultValue } = this.number(schema);\n return `${base}${this.#suffixes(defaultValue, required, nullable)}`;\n }\n case 'boolean':\n return `z.boolean()${this.#suffixes(schema.default, required, nullable)}`;\n case 'object':\n return this.object(schema, true); // required always\n case 'array':\n return this.array(schema, required);\n case 'null':\n // If \"type\": \"null\" alone, this is basically z.null()\n return `z.null()${appendOptional(required)}`;\n default:\n // Unknown type -> fallback\n return `z.unknown()${appendOptional(required)}`;\n }\n }\n\n ref($ref: string, required: boolean) {\n const schemaName = cleanRef($ref).split('/').pop()!;\n\n if (this.circularRefTracker.has(schemaName)) {\n return schemaName;\n }\n\n this.circularRefTracker.add(schemaName);\n this.#onRef?.(\n schemaName,\n this.handle(followRef(this.#spec, $ref), required),\n );\n this.circularRefTracker.delete(schemaName);\n\n return schemaName;\n }\n allOf(schemas: (SchemaObject | ReferenceObject)[]) {\n const allOfSchemas = schemas.map((sub) => this.handle(sub, true));\n if (allOfSchemas.length === 0) {\n return `z.unknown()`;\n }\n if (allOfSchemas.length === 1) {\n return allOfSchemas[0];\n }\n return this.#toIntersection(allOfSchemas);\n }\n\n #toIntersection(schemas: string[]): string {\n const [left, ...right] = schemas;\n if (!right.length) {\n return left;\n }\n return `z.intersection(${left}, ${this.#toIntersection(right)})`;\n }\n\n anyOf(schemas: (SchemaObject | ReferenceObject)[], required: boolean) {\n const anyOfSchemas = schemas.map((sub) => this.handle(sub, false));\n if (anyOfSchemas.length === 1) {\n return anyOfSchemas[0];\n }\n return anyOfSchemas.length > 1\n ? `z.union([${anyOfSchemas.join(', ')}])${appendOptional(required)}`\n : // Handle an invalid anyOf with one schema\n anyOfSchemas[0];\n }\n\n oneOf(schemas: (SchemaObject | ReferenceObject)[], required: boolean) {\n const oneOfSchemas = schemas.map((sub) => {\n if (isRef(sub)) {\n const { model } = parseRef(sub.$ref);\n if (this.circularRefTracker.has(model)) {\n return model;\n }\n }\n return this.handle(sub, true);\n });\n if (oneOfSchemas.length === 1) {\n return oneOfSchemas[0];\n }\n return oneOfSchemas.length > 1\n ? `z.union([${oneOfSchemas.join(', ')}])${appendOptional(required)}`\n : // Handle an invalid oneOf with one schema\n oneOfSchemas[0];\n }\n\n enum(values: any[], required: boolean) {\n const enumVals = values.map((val) => JSON.stringify(val)).join(', ');\n return `z.enum([${enumVals}])${appendOptional(required)}`;\n }\n\n /**\n * Handle a `string` schema with possible format keywords (JSON Schema).\n */\n string(schema: SchemaObject): string {\n let base = 'z.string()';\n\n // 3.1 replaces `example` in the schema with `examples` (array).\n // We do not strictly need them for the Zod type, so they\u2019re optional\n // for validation. However, we could keep them as metadata if you want.\n\n switch (schema.format) {\n case 'date-time':\n case 'datetime':\n // parse to JS Date\n base = 'z.coerce.date()';\n break;\n case 'date':\n base =\n 'z.coerce.date() /* or z.string() if you want raw date strings */';\n break;\n case 'time':\n base =\n 'z.string() /* optionally add .regex(...) for HH:MM:SS format */';\n break;\n case 'email':\n base = 'z.string().email()';\n break;\n case 'uuid':\n base = 'z.string().uuid()';\n break;\n case 'url':\n case 'uri':\n base = 'z.string().url()';\n break;\n case 'ipv4':\n base = 'z.string().ip({version: \"v4\"})';\n break;\n case 'ipv6':\n base = 'z.string().ip({version: \"v6\"})';\n break;\n case 'phone':\n base = 'z.string() /* or add .regex(...) for phone formats */';\n break;\n case 'byte':\n case 'binary':\n base = 'z.instanceof(Blob) /* consider base64 check if needed */';\n break;\n case 'int64':\n // JS numbers can't reliably store int64, consider z.bigint() or keep as string\n base = 'z.string() /* or z.bigint() if your app can handle it */';\n break;\n default:\n // No special format\n break;\n }\n\n return base;\n }\n\n /**\n * Handle number/integer constraints from OpenAPI/JSON Schema.\n * In 3.1, exclusiveMinimum/Maximum hold the actual numeric threshold,\n * rather than a boolean toggling `minimum`/`maximum`.\n */\n number(schema: SchemaObject) {\n let defaultValue = schema.default;\n let base = 'z.number()';\n if (schema.format === 'int64') {\n base = 'z.bigint()';\n if (schema.default !== undefined) {\n defaultValue = `BigInt(${schema.default})`;\n }\n }\n\n if (schema.format === 'int32') {\n // 32-bit integer\n base += '.int()';\n }\n\n // If we see exclusiveMinimum as a number in 3.1:\n if (typeof schema.exclusiveMinimum === 'number') {\n // Zod doesn\u2019t have a direct \"exclusiveMinimum\" method, so we can do .gt()\n // If exclusiveMinimum=7 => .gt(7)\n base += `.gt(${schema.exclusiveMinimum})`;\n }\n // Similarly for exclusiveMaximum\n if (typeof schema.exclusiveMaximum === 'number') {\n // If exclusiveMaximum=10 => .lt(10)\n base += `.lt(${schema.exclusiveMaximum})`;\n }\n\n // If standard minimum/maximum\n if (typeof schema.minimum === 'number') {\n base +=\n schema.format === 'int64'\n ? `.min(BigInt(${schema.minimum}))`\n : `.min(${schema.minimum})`;\n }\n if (typeof schema.maximum === 'number') {\n base +=\n schema.format === 'int64'\n ? `.max(BigInt(${schema.maximum}))`\n : `.max(${schema.maximum})`;\n }\n\n // multipleOf\n if (typeof schema.multipleOf === 'number') {\n // There's no direct multipleOf in Zod. Some folks do a custom refine.\n // For example:\n base += `.refine((val) => Number.isInteger(val / ${schema.multipleOf}), \"Must be a multiple of ${schema.multipleOf}\")`;\n }\n\n return { base, defaultValue };\n }\n\n handle(schema: SchemaObject | ReferenceObject, required: boolean): string {\n if (isRef(schema)) {\n return this.ref(schema.$ref, required);\n }\n\n // Handle allOf \u2192 intersection\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.allOf(schema.allOf ?? []);\n }\n\n // anyOf \u2192 union\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.anyOf(schema.anyOf ?? [], required);\n }\n\n // oneOf \u2192 union\n if (schema.oneOf && Array.isArray(schema.oneOf) && schema.oneOf.length) {\n return this.oneOf(schema.oneOf ?? [], required);\n }\n\n // enum\n if (schema.enum && Array.isArray(schema.enum)) {\n return this.enum(schema.enum, required);\n }\n\n // 3.1 can have type: string or type: string[] (e.g. [\"string\",\"null\"])\n // Let's parse that carefully.\n const types = Array.isArray(schema.type)\n ? schema.type\n : schema.type\n ? [schema.type]\n : [];\n\n // If no explicit \"type\", fallback to unknown\n if (!types.length) {\n return `z.unknown()${appendOptional(required)}`;\n }\n\n // If it's a union type (like [\"string\", \"null\"]), we'll build a Zod union\n // or apply .nullable() if it's just \"type + null\".\n\n // backward compatibility with openapi 3.0\n if ('nullable' in schema && schema.nullable) {\n types.push('null');\n }\n\n if (types.length > 1) {\n // If it\u2019s exactly one real type plus \"null\", we can do e.g. `z.string().nullable()`\n const realTypes = types.filter((t) => t !== 'null');\n if (realTypes.length === 1 && types.includes('null')) {\n // Single real type + \"null\"\n return this.normal(realTypes[0], schema, required, true);\n }\n // If multiple different types, build a union\n const subSchemas = types.map((t) => this.normal(t, schema, false));\n return `z.union([${subSchemas.join(', ')}])${appendOptional(required)}`;\n }\n return this.normal(types[0], schema, required, false);\n }\n}\n\n/**\n * Append .optional() if not required\n */\nfunction appendOptional(isRequired?: boolean) {\n return isRequired ? '' : '.optional()';\n}\nfunction appendDefault(defaultValue?: any) {\n return defaultValue !== undefined ? `.default(${defaultValue})` : '';\n}\n\n// Todo: convert openapi 3.0 to 3.1 before proccesing\n", "export interface Interceptor {\n before?: (request: Request) => Promise<Request> | Request;\n after?: (response: Response) => Promise<Response> | Response;\n}\n\nexport const createHeadersInterceptor = (\n defaultHeaders: () => Record<string, string | undefined>,\n requestHeaders: HeadersInit,\n) => {\n return {\n before(request: Request) {\n // Priority Levels\n // 1. Headers Input\n // 2. Request Headers\n // 3. Default Headers\n const headers = defaultHeaders();\n\n for (const [key, value] of new Headers(requestHeaders)) {\n // Only set the header if it doesn't already exist and has a value\n // even though these headers are passed at operation level\n // still they are lower priority compared to the headers input\n if (value !== undefined && !request.headers.has(key)) {\n request.headers.set(key, value);\n }\n }\n\n for (const [key, value] of Object.entries(headers)) {\n // Only set the header if it doesn't already exist and has a value\n if (value !== undefined && !request.headers.has(key)) {\n request.headers.set(key, value);\n }\n }\n\n return request;\n },\n };\n};\n\nexport const createBaseUrlInterceptor = (getBaseUrl: () => string) => {\n return {\n before(request: Request) {\n const baseUrl = getBaseUrl();\n if (request.url.startsWith('local://')) {\n return new Request(request.url.replace('local://', baseUrl), request);\n }\n return request;\n },\n };\n};\n\nexport const logInterceptor = {\n before(request: Request) {\n console.log('Request', request);\n return request;\n },\n after(response: Response) {\n console.log('Response', response);\n return response;\n },\n};\n\n/**\n * Creates an interceptor that logs detailed information about requests and responses.\n * @param options Configuration options for the logger\n * @returns An interceptor object with before and after handlers\n */\nexport const createDetailedLogInterceptor = (options?: {\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n includeRequestBody?: boolean;\n includeResponseBody?: boolean;\n}) => {\n const logLevel = options?.logLevel || 'info';\n const includeRequestBody = options?.includeRequestBody || false;\n const includeResponseBody = options?.includeResponseBody || false;\n\n return {\n async before(request: Request) {\n const logData = {\n url: request.url,\n method: request.method,\n contentType: request.headers.get('Content-Type'),\n headers: Object.fromEntries([...request.headers.entries()]),\n };\n\n console[logLevel]('\uD83D\uDE80 Outgoing Request:', logData);\n\n if (includeRequestBody) {\n try {\n // Clone the request to avoid consuming the body stream\n const clonedRequest = request.clone();\n if (clonedRequest.headers.get('Content-Type')?.includes('application/json')) {\n const body = await clonedRequest.json().catch(() => null);\n console[logLevel]('Request Body:', body);\n } else {\n const body = await clonedRequest.text().catch(() => null);\n console[logLevel]('Request Body:', body);\n }\n } catch (error) {\n console.error('Could not log request body:', error);\n }\n }\n\n return request;\n },\n\n async after(response: Response) {\n const logData = {\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n headers: Object.fromEntries([...response.headers.entries()]),\n };\n\n console[logLevel]('\uD83D\uDCE5 Incoming Response:', logData);\n\n if (includeResponseBody && response.body) {\n try {\n // Clone the response to avoid consuming the body stream\n const clonedResponse = response.clone();\n if (clonedResponse.headers.get('Content-Type')?.includes('application/json')) {\n const body = await clonedResponse.json().catch(() => null);\n console[logLevel]('Response Body:', body);\n } else {\n const body = await clonedResponse.text().catch(() => null);\n if (body) {\n console[logLevel]('Response Body:', body.substring(0, 500) + (body.length > 500 ? '...' : ''));\n } else {\n console[logLevel]('No response body');\n }\n }\n } catch (error) {\n console.error('Could not log response body:', error);\n }\n }\n\n return response;\n },\n };\n};\n", "import { parse } from \"fast-content-type-parse\";\n\nexport async function handleError(response: Response) {\n\ttry {\n\t\tif (response.status >= 400 && response.status < 500) {\n\t\t\tconst body = (await response.json()) as Record<string, any>;\n\t\t\treturn {\n\t\t\t\tstatus: response.status,\n\t\t\t\tbody: body,\n\t\t\t};\n\t\t}\n\t\treturn new Error(\n\t\t\t`An error occurred while fetching the data. Status: ${response.status}`,\n\t\t);\n\t} catch (error) {\n\t\treturn error as any;\n\t}\n}\n\nasync function handleChunkedResponse(response: Response, contentType: string) {\n\tconst { type } = parse(contentType);\n\n\tswitch (type) {\n\t\tcase \"application/json\": {\n\t\t\tlet buffer = \"\";\n\t\t\tconst reader = response.body!.getReader();\n\t\t\tconst decoder = new TextDecoder();\n\t\t\twhile (true) {\n\t\t\t\tconst { value, done } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tbuffer += decoder.decode(value);\n\t\t\t}\n\t\t\treturn JSON.parse(buffer);\n\t\t}\n\t\tcase \"text/html\":\n\t\tcase \"text/plain\": {\n\t\t\tlet buffer = \"\";\n\t\t\tconst reader = response.body!.getReader();\n\t\t\tconst decoder = new TextDecoder();\n\t\t\twhile (true) {\n\t\t\t\tconst { value, done } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tbuffer += decoder.decode(value);\n\t\t\t}\n\t\t\treturn buffer;\n\t\t}\n\t\tdefault:\n\t\t\treturn response.body;\n\t}\n}\n\nexport function chunked(response: Response) {\n\treturn response.body;\n}\n\nexport async function buffered(response: Response) {\n\tconst contentType = response.headers.get(\"Content-Type\");\n\tif (!contentType) {\n\t\tthrow new Error(\"Content-Type header is missing\");\n\t}\n\n\tif (response.status === 204) {\n\t\treturn null;\n\t}\n\n\tconst { type } = parse(contentType);\n\tswitch (type) {\n\t\tcase \"application/json\":\n\t\t\treturn response.json();\n\t\tcase \"text/plain\":\n\t\t\treturn response.text();\n\t\tcase \"text/html\":\n\t\t\treturn response.text();\n\t\tcase \"text/xml\":\n\t\tcase \"application/xml\":\n\t\t\treturn response.text();\n\t\tcase \"application/x-www-form-urlencoded\": {\n\t\t\tconst text = await response.text();\n\t\t\treturn Object.fromEntries(new URLSearchParams(text));\n\t\t}\n\t\tcase \"multipart/form-data\":\n\t\t\treturn response.formData();\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported content type: ${contentType}`);\n\t}\n}\n", "import { z } from 'zod';\n\nexport type ParseError<T extends z.ZodType<any, any, any>> = {\n kind: 'parse';\n} & z.inferFlattenedErrors<T>;\n\nexport function parse<T extends z.ZodType>(\n schema: T,\n input: unknown,\n) {\n const result = schema.safeParse(input);\n if (!result.success) {\n const errors = result.error.flatten((issue) => issue);\n return [null, errors];\n }\n return [result.data as z.infer<T>, null];\n}\n", "export type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\nexport type ContentType = 'xml' | 'json' | 'urlencoded' | 'multipart' | 'formdata';\nexport type Endpoint =\n | `${ContentType} ${Method} ${string}`\n | `${Method} ${string}`;\n\nexport type BodyInit =\n | ArrayBuffer\n | Blob\n | FormData\n | URLSearchParams\n | null\n | string;\n\nexport function createUrl(path: string, query: URLSearchParams) {\n const url = new URL(path, `local://`);\n url.search = query.toString();\n return url;\n}\n\nfunction template(\n templateString: string,\n templateVariables: Record<string, any>,\n): string {\n const nargs = /{([0-9a-zA-Z_]+)}/g;\n return templateString.replace(nargs, (match, key: string, index: number) => {\n // Handle escaped double braces\n if (\n templateString[index - 1] === '{' &&\n templateString[index + match.length] === '}'\n ) {\n return key;\n }\n\n const result = key in templateVariables ? templateVariables[key] : null;\n return result === null || result === undefined ? '' : String(result);\n });\n}\n\ntype Input = Record<string, any>;\ntype Props = {\n inputHeaders: string[];\n inputQuery: string[];\n inputBody: string[];\n inputParams: string[];\n};\n\nabstract class Serializer {\n protected input: Input;\n protected props: Props;\n\n constructor(\n input: Input,\n props: Props,\n ) {\n this.input = input;\n this.props = props;\n }\n\n abstract getBody(): BodyInit | null;\n abstract getHeaders(): Record<string, string>;\n serialize(): Serialized {\n const headers = new Headers({});\n for (const header of this.props.inputHeaders) {\n headers.set(header, this.input[header]);\n }\n\n const query = new URLSearchParams();\n for (const key of this.props.inputQuery) {\n const value = this.input[key];\n if (value !== undefined) {\n query.set(key, String(value));\n }\n }\n\n const params = this.props.inputParams.reduce<Record<string, any>>(\n (acc, key) => {\n acc[key] = this.input[key];\n return acc;\n },\n {},\n );\n\n return {\n body: this.getBody(),\n query,\n params,\n headers: this.getHeaders(),\n };\n }\n}\n\ninterface Serialized {\n body: BodyInit | null;\n query: URLSearchParams;\n params: Record<string, any>;\n headers: Record<string, string>;\n}\n\nclass JsonSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body: Record<string, any> = {};\n for (const prop of this.props.inputBody) {\n body[prop] = this.input[prop];\n }\n return JSON.stringify(body);\n }\n getHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n }\n}\n\nclass UrlencodedSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new URLSearchParams();\n for (const prop of this.props.inputBody) {\n body.set(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass NoBodySerializer extends Serializer {\n getBody(): BodyInit | null {\n return null;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass FormDataSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new FormData();\n for (const prop of this.props.inputBody) {\n body.append(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nexport function json(input: Input, props: Props) {\n return new JsonSerializer(input, props).serialize();\n}\nexport function urlencoded(input: Input, props: Props) {\n return new UrlencodedSerializer(input, props).serialize();\n}\nexport function nobody(input: Input, props: Props) {\n return new NoBodySerializer(input, props).serialize();\n}\nexport function formdata(input: Input, props: Props) {\n return new FormDataSerializer(input, props).serialize();\n}\n\nexport function toRequest<T extends Endpoint>(\n endpoint: T,\n input: Serialized,\n): Request {\n const [method, path] = endpoint.split(' ');\n const pathVariable = template(path, input.params);\n\n const url = createUrl(pathVariable, input.query);\n return new Request(url, {\n method: method,\n headers: input.headers,\n body: method === 'GET' ? undefined : input.body,\n });\n}\n", "export interface ApiResponse<Status extends number, Body extends unknown> {\n kind: 'response';\n status: Status;\n body: Body;\n}\n\n// 4xx Client Errors\nexport type BadRequest = ApiResponse<400, { message: string }>;\nexport type Unauthorized = ApiResponse<401, { message: string }>;\nexport type PaymentRequired = ApiResponse<402, { message: string }>;\nexport type Forbidden = ApiResponse<403, { message: string }>;\nexport type NotFound = ApiResponse<404, { message: string }>;\nexport type MethodNotAllowed = ApiResponse<405, { message: string }>;\nexport type NotAcceptable = ApiResponse<406, { message: string }>;\nexport type Conflict = ApiResponse<409, { message: string }>;\nexport type Gone = ApiResponse<410, { message: string }>;\nexport type UnprocessableEntity = ApiResponse<422, { message: string; errors?: Record<string, string[]> }>;\nexport type TooManyRequests = ApiResponse<429, { message: string; retryAfter?: string }>;\nexport type PayloadTooLarge = ApiResponse<413, { message: string; }>;\nexport type UnsupportedMediaType = ApiResponse<415, { message: string; }>;\n\n// 5xx Server Errors\nexport type InternalServerError = ApiResponse<500, { message: string }>;\nexport type NotImplemented = ApiResponse<501, { message: string }>;\nexport type BadGateway = ApiResponse<502, { message: string }>;\nexport type ServiceUnavailable = ApiResponse<503, { message: string; retryAfter?: string }>;\nexport type GatewayTimeout = ApiResponse<504, { message: string }>;\n\nexport type ClientError =\n | BadRequest\n | Unauthorized\n | PaymentRequired\n | Forbidden\n | NotFound\n | MethodNotAllowed\n | NotAcceptable\n | Conflict\n | Gone\n | UnprocessableEntity\n | TooManyRequests;\n\nexport type ServerError =\n | InternalServerError\n | NotImplemented\n | BadGateway\n | ServiceUnavailable\n | GatewayTimeout;\n\nexport type ProblematicResponse = ClientError | ServerError;\n", "\nexport interface RequestSchema {\n schema: z.ZodType;\n toRequest: (input: any) => Request;\n deserializer: (response: Response) => Promise<unknown> | unknown;\n}\n\nexport const fetchType = z\n .function()\n .args(z.instanceof(Request))\n .returns(z.promise(z.instanceof(Response)))\n .optional();\n\nexport async function sendRequest(\n input: unknown,\n route: RequestSchema,\n options: {\n fetch?: z.infer<typeof fetchType>;\n interceptors?: Interceptor[];\n signal?: AbortSignal;\n },\n) {\n const { interceptors = [] } = options;\n const [parsedInput, parseError] = parse(route.schema, input);\n if (parseError) {\n return [null as never, { ...parseError, kind: 'parse' } as never] as const;\n }\n\n let request = route.toRequest(parsedInput as never);\n for (const interceptor of interceptors) {\n if (interceptor.before) {\n request = await interceptor.before(request);\n }\n }\n\n let response = await (options.fetch ?? fetch)(request, { signal: options.signal });\n\n for (let i = interceptors.length - 1; i >= 0; i--) {\n const interceptor = interceptors[i];\n if (interceptor.after) {\n response = await interceptor.after(response.clone());\n }\n }\n\n if (response.ok) {\n const data = await route.deserializer(response);\n return [data as never, null] as const;\n }\n const error = await handleError(response);\n return [null as never, { ...error, kind: 'response' }] as const;\n}\n", "import { watch as nodeWatch } from 'node:fs/promises';\nimport { debounceTime, from } from 'rxjs';\n\nexport function watch(path: string) {\n return from(\n nodeWatch(path, {\n persistent: true,\n recursive: true,\n }),\n ).pipe(debounceTime(400));\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["get", "camelcase", "spinalcase", "removeDuplicates", "removeDuplicates", "toLitObject", "toLitObject", "schema", "name", "security", "removeDuplicates", "it", "exclude", "appendOptional", "spinalcase", "camelcase", "methods", "security", "get", "removeDuplicates", "security"]
|
|
7
7
|
}
|
|
@@ -2,7 +2,6 @@ import type { OpenAPIObject, ReferenceObject, SchemaObject } from 'openapi3-ts/o
|
|
|
2
2
|
type OnRefCallback = (ref: string, interfaceContent: string) => void;
|
|
3
3
|
/**
|
|
4
4
|
* Convert an OpenAPI (JSON Schema style) object into TypeScript interfaces,
|
|
5
|
-
* following the same pattern as ZodDeserialzer for easy interchangeability.
|
|
6
5
|
*/
|
|
7
6
|
export declare class TypeScriptDeserialzer {
|
|
8
7
|
#private;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/lib/emitters/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,mBAAmB,CAAC;AAI3B,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;AAErE
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/lib/emitters/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,mBAAmB,CAAC;AAI3B,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;AAErE;;GAEG;AACH,qBAAa,qBAAqB;;IAChC,kBAAkB,cAAqB;gBAI3B,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa;IA0FrD;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAwBtD;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAkBrD;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAqBpE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;IAc5C,KAAK,CAAC,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,GAAG,MAAM;IAM1D,KAAK,CACH,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,EAC3C,QAAQ,EAAE,OAAO,GAChB,MAAM;IAST,KAAK,CACH,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,EAC3C,QAAQ,EAAE,OAAO,GAChB,MAAM;IAgBT,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;IAQ9C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IAuBxD;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IAKxD,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;IA2DzE;;OAEG;IACH,iBAAiB,CACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,GAAG,eAAe,GACrC,MAAM;CAIV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/lib/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqCvD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE;IACR,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;KACvC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/lib/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqCvD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE;IACR,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;KACvC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,iBA+IF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/lib/generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,aAAa,EACb,eAAe,EAMhB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/lib/generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,aAAa,EACb,eAAe,EAMhB,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,UAAU,CAAC;AAGlB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AACD,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAsBD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,WAAW,CAAC,EAAE,CACZ,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,KACX,MAAM,CAAC;IACZ,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CACxC;AAED,eAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAC/C,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAShD,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB;;;;;EA+OrD"}
|
package/dist/lib/utils.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export declare function parseRef(ref: string): {
|
|
|
7
7
|
path: string;
|
|
8
8
|
};
|
|
9
9
|
export declare function followRef(spec: OpenAPIObject, ref: string): SchemaObject;
|
|
10
|
-
export declare function securityToOptions(security: SecurityRequirementObject[],
|
|
10
|
+
export declare function securityToOptions(security: SecurityRequirementObject[], securitySchemes: ComponentsObject['securitySchemes'], staticIn?: string): Options;
|
|
11
11
|
export declare function mergeImports(imports: Import[]): Import[];
|
|
12
12
|
export interface Import {
|
|
13
13
|
isTypeOnly: boolean;
|
package/dist/lib/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,yBAAyB,EAC1B,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,eAAe,CAEtD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,UAEnC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM;;;EAInC;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAOxE;AACD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,yBAAyB,EAAE,EACrC,eAAe,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,EACpD,QAAQ,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,yBAAyB,EAC1B,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,eAAe,CAEtD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,UAEnC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM;;;EAInC;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAOxE;AACD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,yBAAyB,EAAE,EACrC,eAAe,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,EACpD,QAAQ,CAAC,EAAE,MAAM,WAsClB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAgB7C;AACD,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AACD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,YAenD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAEvD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAe5D;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sdk-it/typescript",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"!**/*.tsbuildinfo"
|
|
22
22
|
],
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@sdk-it/core": "0.14.
|
|
24
|
+
"@sdk-it/core": "0.14.3",
|
|
25
25
|
"openapi3-ts": "^4.4.0",
|
|
26
26
|
"stringcase": "^4.3.1",
|
|
27
27
|
"lodash-es": "^4.17.21",
|