summary refs log tree commit diff
path: root/scripts/generate_schema.js
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/generate_schema.js')
-rw-r--r--scripts/generate_schema.js95
1 files changed, 95 insertions, 0 deletions
diff --git a/scripts/generate_schema.js b/scripts/generate_schema.js
new file mode 100644
index 00000000..6925df5d
--- /dev/null
+++ b/scripts/generate_schema.js
@@ -0,0 +1,95 @@
+// https://mermade.github.io/openapi-gui/#
+// https://editor.swagger.io/
+const path = require("path");
+const fs = require("fs");
+const TJS = require("typescript-json-schema");
+require("missing-native-js-functions");
+const schemaPath = path.join(__dirname, "..", "assets", "schemas.json");
+
+const settings = {
+	required: true,
+	ignoreErrors: true,
+	excludePrivate: true,
+	defaultNumberType: "integer",
+	noExtraProps: true,
+	defaultProps: false
+};
+const compilerOptions = {
+	strictNullChecks: true
+};
+const Excluded = [
+	"DefaultSchema",
+	"Schema",
+	"EntitySchema",
+	"ServerResponse",
+	"Http2ServerResponse",
+	"global.Express.Response",
+	"Response",
+	"e.Response",
+	"request.Response",
+	"supertest.Response",
+
+	// TODO: Figure out how to exclude schemas from node_modules?
+	"SomeJSONSchema",
+	"UncheckedPartialSchema",
+	"PartialSchema",
+	"UncheckedPropertiesSchema",
+	"PropertiesSchema",
+	"AsyncSchema",
+	"AnySchema",
+];
+
+function modify(obj) {
+	for (let k in obj) {
+		if (typeof obj[k] === "object" && obj[k] !== null) {
+			modify(obj[k]);
+		}
+	}
+}
+
+function main() {
+	const files = [
+		...walk(path.join(__dirname, "..", "src", "util", "schemas")),
+	];
+	const program = TJS.getProgramFromFiles(
+		files,
+		compilerOptions
+	);
+	const generator = TJS.buildGenerator(program, settings);
+	if (!generator || !program) return;
+
+	let schemas = generator.getUserSymbols().filter((x) => (x.endsWith("Schema") || x.endsWith("Response")) && !Excluded.includes(x));
+	console.log(schemas);
+
+	let definitions = {};
+
+	for (const name of schemas) {
+		const part = TJS.generateSchema(program, name, settings, [], generator);
+		if (!part) continue;
+
+		definitions = { ...definitions, [name]: { ...part } };
+	}
+
+	modify(definitions);
+
+	fs.writeFileSync(schemaPath, JSON.stringify(definitions, null, 4));
+}
+
+main();
+
+function walk(dir) {
+	let results = [];
+	let list = fs.readdirSync(dir);
+	list.forEach(function (file) {
+		file = dir + "/" + file;
+		let 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;
+}