summary refs log tree commit diff
path: root/api/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'api/scripts')
-rw-r--r--api/scripts/generate_body_schema.ts59
1 files changed, 59 insertions, 0 deletions
diff --git a/api/scripts/generate_body_schema.ts b/api/scripts/generate_body_schema.ts
new file mode 100644
index 00000000..69e62085
--- /dev/null
+++ b/api/scripts/generate_body_schema.ts
@@ -0,0 +1,59 @@
+// https://mermade.github.io/openapi-gui/#
+// https://editor.swagger.io/
+import path from "path";
+import fs from "fs";
+import * as TJS from "typescript-json-schema";
+import "missing-native-js-functions";
+const schemaPath = path.join(__dirname, "..", "assets", "schemas.json");
+
+const settings: TJS.PartialArgs = {
+	required: true,
+	ignoreErrors: true,
+	excludePrivate: true,
+	defaultNumberType: "integer",
+	noExtraProps: true,
+	defaultProps: false
+};
+const compilerOptions: TJS.CompilerOptions = {
+	strictNullChecks: false
+};
+const ExcludedSchemas = ["DefaultSchema", "Schema", "EntitySchema"];
+
+function main() {
+	const program = TJS.getProgramFromFiles(walk(path.join(__dirname, "..", "src", "routes")), compilerOptions);
+	const generator = TJS.buildGenerator(program, settings);
+	if (!generator || !program) return;
+
+	const schemas = generator.getUserSymbols().filter((x) => x.endsWith("Schema") && !ExcludedSchemas.includes(x));
+	console.log(schemas);
+
+	var definitions: any = {};
+
+	for (const name of schemas) {
+		const part = TJS.generateSchema(program, name, settings, [], generator as TJS.JsonSchemaGenerator);
+		if (!part) continue;
+
+		definitions = { ...definitions, ...part.definitions, [name]: { ...part, definitions: undefined } };
+	}
+
+	fs.writeFileSync(schemaPath, JSON.stringify(definitions, null, 4));
+}
+
+main();
+
+function walk(dir: string) {
+	var results = [] as string[];
+	var list = fs.readdirSync(dir);
+	list.forEach(function (file) {
+		file = dir + "/" + file;
+		var stat = fs.statSync(file);
+		if (stat && stat.isDirectory()) {
+			/* Recurse into a subdirectory */
+			results = results.concat(walk(file));
+		} else {
+			if (!file.endsWith(".ts")) return;
+			results.push(file);
+		}
+	});
+	return results;
+}