elysia-openapi-codegen 0.1.3 → 0.1.4
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/dist/index.d.ts +0 -1
- package/dist/index.js +250 -251
- package/dist/types.d.ts +70 -0
- package/package.json +22 -27
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,279 +1,278 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import https from 'https';
|
|
9
|
-
import http from 'http';
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import https from "https";
|
|
7
|
+
import http from "http";
|
|
10
8
|
async function fetchSpec(source) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
res.on('error', reject);
|
|
26
|
-
});
|
|
9
|
+
if (source.startsWith("http://") || source.startsWith("https://")) {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const client = source.startsWith("https://") ? https : http;
|
|
12
|
+
client.get(source, (res) => {
|
|
13
|
+
let data = "";
|
|
14
|
+
res.on("data", (chunk) => data += chunk.toString());
|
|
15
|
+
res.on("end", () => {
|
|
16
|
+
try {
|
|
17
|
+
resolve(JSON.parse(data));
|
|
18
|
+
} catch (e) {
|
|
19
|
+
reject(new Error(`Failed to parse OpenAPI spec: ${e.message}`));
|
|
20
|
+
}
|
|
27
21
|
});
|
|
28
|
-
|
|
29
|
-
|
|
22
|
+
res.on("error", reject);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return JSON.parse(fs.readFileSync(source, "utf8"));
|
|
30
27
|
}
|
|
31
28
|
function resolveType(schema) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
29
|
+
if (!schema)
|
|
30
|
+
return "any";
|
|
31
|
+
if (schema.$ref) {
|
|
32
|
+
return schema.$ref.split("/").pop() || "any";
|
|
33
|
+
}
|
|
34
|
+
if (schema.type === "array" && schema.items) {
|
|
35
|
+
return `Array<${resolveType(schema.items)}>`;
|
|
36
|
+
}
|
|
37
|
+
if (schema.type === "object") {
|
|
38
|
+
if (!schema.properties)
|
|
39
|
+
return "Record<string, any>";
|
|
40
|
+
const props = Object.entries(schema.properties).map(([key, prop]) => {
|
|
41
|
+
const isRequired = schema.required?.includes(key);
|
|
42
|
+
const optional = isRequired ? "" : "?";
|
|
43
|
+
return ` ${key}${optional}: ${resolveType(prop)};`;
|
|
44
|
+
});
|
|
45
|
+
return `{
|
|
46
|
+
${props.join(`
|
|
47
|
+
`)}
|
|
48
|
+
}`;
|
|
49
|
+
}
|
|
50
|
+
if (schema.anyOf || schema.oneOf) {
|
|
51
|
+
return (schema.anyOf || schema.oneOf || []).map(resolveType).join(" | ");
|
|
52
|
+
}
|
|
53
|
+
if (schema.allOf) {
|
|
54
|
+
return schema.allOf.map(resolveType).join(" & ");
|
|
55
|
+
}
|
|
56
|
+
if (schema.nullable) {
|
|
57
|
+
return `${resolveType({ ...schema, nullable: false })} | null`;
|
|
58
|
+
}
|
|
59
|
+
const typeMap = {
|
|
60
|
+
string: "string",
|
|
61
|
+
number: "number",
|
|
62
|
+
integer: "number",
|
|
63
|
+
boolean: "boolean",
|
|
64
|
+
null: "null"
|
|
65
|
+
};
|
|
66
|
+
return schema.type && typeMap[schema.type] || "any";
|
|
67
67
|
}
|
|
68
68
|
function generateTypes(spec) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
69
|
+
const definitions = [];
|
|
70
|
+
if (spec.components?.schemas) {
|
|
71
|
+
for (const [name, schema] of Object.entries(spec.components.schemas)) {
|
|
72
|
+
definitions.push(`export type ${name} = ${resolveType(schema)};`);
|
|
74
73
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
74
|
+
}
|
|
75
|
+
for (const [pathUrl, pathItem] of Object.entries(spec.paths)) {
|
|
76
|
+
for (const [method, operation] of Object.entries(pathItem)) {
|
|
77
|
+
if (!["get", "post", "put", "patch", "delete"].includes(method))
|
|
78
|
+
continue;
|
|
79
|
+
const op = operation;
|
|
80
|
+
const opId = op.operationId || `${method}${pathUrl.replace(/[^a-zA-Z0-9]/g, "")}`;
|
|
81
|
+
const response = op.responses?.["200"];
|
|
82
|
+
if (response?.content?.["application/json"]?.schema) {
|
|
83
|
+
const responseType = resolveType(response.content["application/json"].schema);
|
|
84
|
+
definitions.push(`export type ${capitalize(opId)}Response = ${responseType};`);
|
|
85
|
+
}
|
|
86
|
+
const params = op.parameters || [];
|
|
87
|
+
if (params.length > 0) {
|
|
88
|
+
const paramProps = params.map((param) => {
|
|
89
|
+
const required = param.required ? "" : "?";
|
|
90
|
+
return ` ${param.name}${required}: ${resolveType(param.schema)};`;
|
|
91
|
+
});
|
|
92
|
+
definitions.push(`export type ${capitalize(opId)}Params = {
|
|
93
|
+
${paramProps.join(`
|
|
94
|
+
`)}
|
|
95
|
+
};`);
|
|
96
|
+
}
|
|
97
|
+
if (op.requestBody?.content?.["application/json"]?.schema) {
|
|
98
|
+
const bodyType = resolveType(op.requestBody.content["application/json"].schema);
|
|
99
|
+
definitions.push(`export type ${capitalize(opId)}Body = ${bodyType};`);
|
|
100
|
+
}
|
|
99
101
|
}
|
|
100
|
-
|
|
102
|
+
}
|
|
103
|
+
return definitions.join(`
|
|
104
|
+
|
|
105
|
+
`);
|
|
101
106
|
}
|
|
102
107
|
function generateHooks(spec) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
...options,
|
|
136
|
-
});
|
|
137
|
-
};`);
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
let inputType = 'void';
|
|
141
|
-
let inputArg = '';
|
|
142
|
-
if (hasBody) {
|
|
143
|
-
inputType = bodyType;
|
|
144
|
-
inputArg = 'body';
|
|
145
|
-
}
|
|
146
|
-
else if (hasParams) {
|
|
147
|
-
inputType = paramsType;
|
|
148
|
-
inputArg = 'params';
|
|
149
|
-
}
|
|
150
|
-
const hasInput = inputType !== 'void';
|
|
151
|
-
hooks.push(`
|
|
152
|
-
export const use${capitalize(opId)} = (
|
|
153
|
-
options?: UseMutationOptions<${responseType}, Error, ${inputType}>
|
|
154
|
-
) => {
|
|
155
|
-
return useMutation<${responseType}, Error, ${inputType}>({
|
|
156
|
-
mutationFn: async (${hasInput ? inputArg : ''}) => {
|
|
157
|
-
const res = await fetch(\`\${baseUrl}${pathUrl}\`, {
|
|
158
|
-
method: '${method.toUpperCase()}',
|
|
159
|
-
headers: { 'Content-Type': 'application/json' },
|
|
160
|
-
body: JSON.stringify(${hasInput ? inputArg : '{}'}),
|
|
161
|
-
});
|
|
162
|
-
if (!res.ok) throw new Error('API Error');
|
|
163
|
-
return res.json();
|
|
164
|
-
},
|
|
165
|
-
...options,
|
|
166
|
-
});
|
|
108
|
+
const hooks = [];
|
|
109
|
+
const baseUrl = spec.servers?.[0]?.url || "";
|
|
110
|
+
for (const [pathUrl, pathItem] of Object.entries(spec.paths)) {
|
|
111
|
+
for (const [method, operation] of Object.entries(pathItem)) {
|
|
112
|
+
if (!["get", "post", "put", "patch", "delete"].includes(method))
|
|
113
|
+
continue;
|
|
114
|
+
const op = operation;
|
|
115
|
+
const opId = op.operationId || `${method}${pathUrl.replace(/[^a-zA-Z0-9]/g, "")}`;
|
|
116
|
+
const hasResponse = !!op.responses?.["200"]?.content?.["application/json"]?.schema;
|
|
117
|
+
const responseType = hasResponse ? `${capitalize(opId)}Response` : "any";
|
|
118
|
+
const params = op.parameters || [];
|
|
119
|
+
const hasParams = params.length > 0;
|
|
120
|
+
const paramsType = hasParams ? `${capitalize(opId)}Params` : "void";
|
|
121
|
+
const hasBody = !!op.requestBody?.content?.["application/json"]?.schema;
|
|
122
|
+
const bodyType = hasBody ? `${capitalize(opId)}Body` : "void";
|
|
123
|
+
if (method === "get") {
|
|
124
|
+
const queryParams = params.map((p) => p.name);
|
|
125
|
+
const queryString = queryParams.length > 0 ? `?${queryParams.map((p) => `\${params?.${p} !== undefined ? '${p}=' + params.${p} : ''}`).join("&")}` : "";
|
|
126
|
+
hooks.push(`
|
|
127
|
+
export const use${capitalize(opId)} = (
|
|
128
|
+
params${hasParams ? "" : "?"}: ${paramsType},
|
|
129
|
+
options?: Omit<UseQueryOptions<${responseType}>, 'queryKey' | 'queryFn'>
|
|
130
|
+
) => {
|
|
131
|
+
return useQuery<${responseType}>({
|
|
132
|
+
queryKey: ['${opId}', params],
|
|
133
|
+
queryFn: async () => {
|
|
134
|
+
const res = await fetch(\`\${baseUrl}${pathUrl}${queryString}\`);
|
|
135
|
+
if (!res.ok) throw new Error('API Error');
|
|
136
|
+
return res.json();
|
|
137
|
+
},
|
|
138
|
+
...options,
|
|
139
|
+
});
|
|
167
140
|
};`);
|
|
168
|
-
|
|
141
|
+
} else {
|
|
142
|
+
let inputType = "void";
|
|
143
|
+
let inputArg = "";
|
|
144
|
+
if (hasBody) {
|
|
145
|
+
inputType = bodyType;
|
|
146
|
+
inputArg = "body";
|
|
147
|
+
} else if (hasParams) {
|
|
148
|
+
inputType = paramsType;
|
|
149
|
+
inputArg = "params";
|
|
169
150
|
}
|
|
151
|
+
const hasInput = inputType !== "void";
|
|
152
|
+
hooks.push(`
|
|
153
|
+
export const use${capitalize(opId)} = (
|
|
154
|
+
options?: UseMutationOptions<${responseType}, Error, ${inputType}>
|
|
155
|
+
) => {
|
|
156
|
+
return useMutation<${responseType}, Error, ${inputType}>({
|
|
157
|
+
mutationFn: async (${hasInput ? inputArg : ""}) => {
|
|
158
|
+
const res = await fetch(\`\${baseUrl}${pathUrl}\`, {
|
|
159
|
+
method: '${method.toUpperCase()}',
|
|
160
|
+
headers: { 'Content-Type': 'application/json' },
|
|
161
|
+
body: JSON.stringify(${hasInput ? inputArg : "{}"}),
|
|
162
|
+
});
|
|
163
|
+
if (!res.ok) throw new Error('API Error');
|
|
164
|
+
return res.json();
|
|
165
|
+
},
|
|
166
|
+
...options,
|
|
167
|
+
});
|
|
168
|
+
};`);
|
|
169
|
+
}
|
|
170
170
|
}
|
|
171
|
-
|
|
171
|
+
}
|
|
172
|
+
return hooks.join(`
|
|
173
|
+
`);
|
|
172
174
|
}
|
|
173
175
|
function capitalize(str) {
|
|
174
|
-
|
|
176
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
175
177
|
}
|
|
176
178
|
async function parseArgs() {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
else if (!config.output)
|
|
206
|
-
config.output = arg;
|
|
207
|
-
}
|
|
179
|
+
const args = process.argv.slice(2);
|
|
180
|
+
const config = {
|
|
181
|
+
input: "",
|
|
182
|
+
output: ""
|
|
183
|
+
};
|
|
184
|
+
for (let i = 0;i < args.length; i++) {
|
|
185
|
+
const arg = args[i];
|
|
186
|
+
if (!arg)
|
|
187
|
+
continue;
|
|
188
|
+
if (arg === "-i" || arg === "--input") {
|
|
189
|
+
const value = args[++i];
|
|
190
|
+
if (!value) {
|
|
191
|
+
console.error(`Error: ${arg} flag requires a value`);
|
|
192
|
+
process.exit(1);
|
|
193
|
+
}
|
|
194
|
+
config.input = value;
|
|
195
|
+
} else if (arg === "-o" || arg === "--output") {
|
|
196
|
+
const value = args[++i];
|
|
197
|
+
if (!value) {
|
|
198
|
+
console.error(`Error: ${arg} flag requires a value`);
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
config.output = value;
|
|
202
|
+
} else if (!arg.startsWith("-")) {
|
|
203
|
+
if (!config.input)
|
|
204
|
+
config.input = arg;
|
|
205
|
+
else if (!config.output)
|
|
206
|
+
config.output = arg;
|
|
208
207
|
}
|
|
209
|
-
|
|
208
|
+
}
|
|
209
|
+
return config;
|
|
210
210
|
}
|
|
211
211
|
function showHelp() {
|
|
212
|
-
|
|
213
|
-
Elysia OpenAPI Code Generator
|
|
214
|
-
Generate React Query hooks and TypeScript types from OpenAPI specifications.
|
|
215
|
-
|
|
216
|
-
Usage:
|
|
217
|
-
elysia-codegen -i <source> -o <output>
|
|
218
|
-
elysia-codegen --input <source> --output <output>
|
|
219
|
-
elysia-codegen <source> <output>
|
|
220
|
-
|
|
221
|
-
Arguments:
|
|
222
|
-
-i, --input <source> OpenAPI spec source (URL or file path)
|
|
223
|
-
-o, --output <output> Output directory for generated files
|
|
224
|
-
|
|
225
|
-
Examples:
|
|
226
|
-
# Using flags
|
|
227
|
-
elysia-codegen -i https://api.example.com/openapi.json -o ./src/api
|
|
228
|
-
elysia-codegen --input ./openapi.json --output ./generated
|
|
229
|
-
|
|
230
|
-
# Using positional arguments
|
|
231
|
-
elysia-codegen https://api.example.com/openapi.json ./src/api
|
|
232
|
-
elysia-codegen ./openapi.json ./generated
|
|
212
|
+
console.log(`
|
|
213
|
+
Elysia OpenAPI Code Generator
|
|
214
|
+
Generate React Query hooks and TypeScript types from OpenAPI specifications.
|
|
215
|
+
|
|
216
|
+
Usage:
|
|
217
|
+
elysia-codegen -i <source> -o <output>
|
|
218
|
+
elysia-codegen --input <source> --output <output>
|
|
219
|
+
elysia-codegen <source> <output>
|
|
220
|
+
|
|
221
|
+
Arguments:
|
|
222
|
+
-i, --input <source> OpenAPI spec source (URL or file path)
|
|
223
|
+
-o, --output <output> Output directory for generated files
|
|
224
|
+
|
|
225
|
+
Examples:
|
|
226
|
+
# Using flags
|
|
227
|
+
elysia-codegen -i https://api.example.com/openapi.json -o ./src/api
|
|
228
|
+
elysia-codegen --input ./openapi.json --output ./generated
|
|
229
|
+
|
|
230
|
+
# Using positional arguments
|
|
231
|
+
elysia-codegen https://api.example.com/openapi.json ./src/api
|
|
232
|
+
elysia-codegen ./openapi.json ./generated
|
|
233
233
|
`);
|
|
234
234
|
}
|
|
235
235
|
async function main() {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
236
|
+
const args = process.argv.slice(2);
|
|
237
|
+
if (args.includes("-h") || args.includes("--help") || args.length === 0) {
|
|
238
|
+
showHelp();
|
|
239
|
+
process.exit(0);
|
|
240
|
+
}
|
|
241
|
+
const { input, output } = await parseArgs();
|
|
242
|
+
if (!input || !output) {
|
|
243
|
+
console.error(`Error: Both input source and output directory are required.
|
|
244
|
+
`);
|
|
245
|
+
showHelp();
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
248
|
+
console.log("Fetching OpenAPI spec...");
|
|
249
|
+
try {
|
|
250
|
+
const spec = await fetchSpec(input);
|
|
251
|
+
const types = generateTypes(spec);
|
|
252
|
+
const hooks = generateHooks(spec);
|
|
253
|
+
const baseUrl = spec.servers?.[0]?.url || "";
|
|
254
|
+
const fileContent = `/* eslint-disable */
|
|
255
|
+
/**
|
|
256
|
+
* Auto-generated by Elysia OpenAPI Codegen
|
|
257
|
+
*/
|
|
258
|
+
|
|
259
|
+
import { useQuery, useMutation, UseQueryOptions, UseMutationOptions } from '@tanstack/react-query';
|
|
260
|
+
|
|
261
|
+
const baseUrl = '${baseUrl}';
|
|
262
|
+
|
|
263
|
+
${types}
|
|
264
|
+
|
|
265
|
+
${hooks}
|
|
265
266
|
`;
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
const outputPath = path.join(output, 'generated.ts');
|
|
270
|
-
fs.writeFileSync(outputPath, fileContent);
|
|
271
|
-
console.log(`Successfully generated hooks at ${outputPath}`);
|
|
272
|
-
}
|
|
273
|
-
catch (err) {
|
|
274
|
-
console.error('Generation failed:', err instanceof Error ? err.message : String(err));
|
|
275
|
-
process.exit(1);
|
|
267
|
+
if (!fs.existsSync(output)) {
|
|
268
|
+
fs.mkdirSync(output, { recursive: true });
|
|
276
269
|
}
|
|
270
|
+
const outputPath = path.join(output, "generated.ts");
|
|
271
|
+
fs.writeFileSync(outputPath, fileContent);
|
|
272
|
+
console.log(`Successfully generated hooks at ${outputPath}`);
|
|
273
|
+
} catch (err) {
|
|
274
|
+
console.error("Generation failed:", err instanceof Error ? err.message : String(err));
|
|
275
|
+
process.exit(1);
|
|
276
|
+
}
|
|
277
277
|
}
|
|
278
278
|
main().catch(console.error);
|
|
279
|
-
//# sourceMappingURL=index.js.map
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export interface OpenAPISpec {
|
|
2
|
+
openapi: string;
|
|
3
|
+
info: {
|
|
4
|
+
title: string;
|
|
5
|
+
version: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
};
|
|
8
|
+
servers?: Array<{
|
|
9
|
+
url: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
}>;
|
|
12
|
+
paths: Record<string, OpenAPIPathItem>;
|
|
13
|
+
components?: {
|
|
14
|
+
schemas?: Record<string, OpenAPISchema>;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
};
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface OpenAPIPathItem {
|
|
20
|
+
get?: OpenAPIOperation;
|
|
21
|
+
post?: OpenAPIOperation;
|
|
22
|
+
put?: OpenAPIOperation;
|
|
23
|
+
delete?: OpenAPIOperation;
|
|
24
|
+
patch?: OpenAPIOperation;
|
|
25
|
+
[key: string]: unknown;
|
|
26
|
+
}
|
|
27
|
+
export interface OpenAPIOperation {
|
|
28
|
+
operationId?: string;
|
|
29
|
+
summary?: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
parameters?: OpenAPIParameter[];
|
|
32
|
+
responses?: Record<string, OpenAPIResponse>;
|
|
33
|
+
requestBody?: {
|
|
34
|
+
content: {
|
|
35
|
+
[contentType: string]: {
|
|
36
|
+
schema: OpenAPISchema;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
[key: string]: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface OpenAPIParameter {
|
|
43
|
+
name: string;
|
|
44
|
+
in: 'query' | 'header' | 'path' | 'cookie';
|
|
45
|
+
description?: string;
|
|
46
|
+
required?: boolean;
|
|
47
|
+
schema?: OpenAPISchema;
|
|
48
|
+
[key: string]: unknown;
|
|
49
|
+
}
|
|
50
|
+
export interface OpenAPIResponse {
|
|
51
|
+
description: string;
|
|
52
|
+
content?: {
|
|
53
|
+
[contentType: string]: {
|
|
54
|
+
schema: OpenAPISchema;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
[key: string]: unknown;
|
|
58
|
+
}
|
|
59
|
+
export interface OpenAPISchema {
|
|
60
|
+
type?: string;
|
|
61
|
+
items?: OpenAPISchema;
|
|
62
|
+
properties?: Record<string, OpenAPISchema>;
|
|
63
|
+
required?: string[];
|
|
64
|
+
$ref?: string;
|
|
65
|
+
nullable?: boolean;
|
|
66
|
+
anyOf?: OpenAPISchema[];
|
|
67
|
+
oneOf?: OpenAPISchema[];
|
|
68
|
+
allOf?: OpenAPISchema[];
|
|
69
|
+
[key: string]: unknown;
|
|
70
|
+
}
|
package/package.json
CHANGED
|
@@ -1,32 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "elysia-openapi-codegen",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"module": "./dist/index.js",
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
3
|
+
"module": "index.ts",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"types": "dist/index.d.ts",
|
|
8
6
|
"type": "module",
|
|
9
|
-
"
|
|
10
|
-
|
|
11
|
-
},
|
|
12
|
-
"files": [
|
|
13
|
-
"dist",
|
|
14
|
-
"README.md"
|
|
15
|
-
],
|
|
7
|
+
"version": "0.1.4",
|
|
8
|
+
"description": "Generate React Query hooks and fully typed TypeScript interfaces from Elysia OpenAPI specs.",
|
|
16
9
|
"scripts": {
|
|
17
|
-
"build": "
|
|
18
|
-
"
|
|
10
|
+
"build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration",
|
|
11
|
+
"build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json",
|
|
12
|
+
"postbuild": "rimraf tsconfig.types.tsbuildinfo"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@types/bun": "latest",
|
|
16
|
+
"typescript": "^5"
|
|
17
|
+
},
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"typescript": "^5"
|
|
19
20
|
},
|
|
20
|
-
"author": "Khantamir mkhantamir77@gmail.com",
|
|
21
|
-
"license": "MIT",
|
|
22
21
|
"repository": {
|
|
23
22
|
"type": "git",
|
|
24
23
|
"url": "https://github.com/mkhantamir/elysia-openapi-codegen.git"
|
|
25
24
|
},
|
|
26
|
-
"bugs": {
|
|
27
|
-
"url": "https://github.com/mkhantamir/elysia-openapi-codegen/issues"
|
|
28
|
-
},
|
|
29
|
-
"homepage": "https://github.com/mkhantamir/elysia-openapi-codegen#readme",
|
|
30
25
|
"keywords": [
|
|
31
26
|
"elysia",
|
|
32
27
|
"openapi",
|
|
@@ -35,11 +30,11 @@
|
|
|
35
30
|
"react-query",
|
|
36
31
|
"tanstack-query"
|
|
37
32
|
],
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
33
|
+
"author": "Khantamir",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"files": [
|
|
36
|
+
"dist/*.js",
|
|
37
|
+
"dist/*.d.ts"
|
|
38
|
+
],
|
|
39
|
+
"homepage": "https://github.com/mkhantamir/elysia-openapi-codegen#readme"
|
|
45
40
|
}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|