/
run.js
87 lines (68 loc) · 2.77 KB
/
run.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import * as fs from "fs/promises";
import { execSync } from "child_process";
import { pascalCase } from "pascal-case";
import { inspect } from "util";
import { Parser, TypeStringGenerator } from "../dist/main.js";
const parser = new Parser();
const { operations, schemas } = await parser.parse(
"./example/openapi/api.yaml"
);
console.log(inspect(operations, false, Infinity, true));
console.log(
inspect(Object.fromEntries(schemas.entries()), false, Infinity, false)
);
await fs.mkdir(new URL("out", import.meta.url), { recursive: true });
await (async function generateSchemas() {
const file = await fs.open("./example/out/schemas.generated.ts", "w");
const st = file.createWriteStream();
st.write("/* eslint-disable */\n");
const gen = new TypeStringGenerator();
for (const [, { name, schema }] of schemas.entries()) {
const type = gen.generate(schema, { schemas });
const typeName = pascalCase(name);
st.write(`export type ${typeName} = ${type};\n`);
}
await file.close();
})();
await (async function generateOperations() {
const file = await fs.open("./example/out/operations.generated.ts", "w");
const st = file.createWriteStream();
st.write("/* eslint-disable */\n");
st.write('import * as schemas from "./schemas.generated.js";\n\n');
const gen = new TypeStringGenerator({ namedSchemaPrefix: "schemas." });
for (const op of operations) {
const namespace = pascalCase(
op.operationId ?? op.method + "-" + op.path.replace(/[^\w\d]/gi, "-")
);
const pathParametersType = op.parameters.path
? gen.generate(op.parameters.path, { schemas })
: "void";
const queryParamteresType = op.parameters.query
? gen.generate(op.parameters.query, { schemas })
: "void";
const requestTypesType =
op.requestTypes
.map(({ mediaType, schema }) => {
const type = gen.generate(schema, { schemas });
return `{ ${JSON.stringify(mediaType)}: ${type}; }`;
})
.join(" & ") || "void";
const responseTypesType =
op.responseTypes
.map(({ status, schema }) => {
const type = gen.generate(schema, { schemas });
return `{ ${status}: ${type}; }`;
})
.join(" & ") || "void";
st.write(`export namespace ${namespace} {\n`);
st.write(` export const method = "${op.method}";\n`);
st.write(` export const path = "${op.path}";\n`);
st.write(` export type PathParameters = ${pathParametersType};\n`);
st.write(` export type QueryParameters = ${queryParamteresType};\n`);
st.write(` export type RequestTypes = ${requestTypesType}\n`);
st.write(` export type ResponseTypes = ${responseTypesType}\n`);
st.write(`}\n\n`);
}
await file.close();
})();
execSync("prettier --write ./example/out/", { stdio: "inherit" });