@tamgl/colyseus-schema
Version:
Binary state serializer with delta encoding for games
68 lines (54 loc) • 2.03 kB
text/typescript
import * as fs from "fs";
import * as path from "path";
import { File } from "./types";
import { parseFiles } from "./parser";
export interface GenerateOptions {
files: string[],
output: string;
decorator?: string;
namespace?: string;
using?: string;
}
export function generate(targetId: string, options: GenerateOptions) {
let generator: Function;
try {
generator = require('./languages/' + targetId).generate;
} catch (e) {
throw new Error("You must provide a valid generator as argument, such as: --csharp, --haxe or --cpp");
}
if (!fs.existsSync(options.output)) {
console.log("Creating", options.output, "directory");
fs.mkdirSync(options.output);
}
/**
* Default `@type()` decorator name
*/
if (!options.decorator) { options.decorator = "type"; }
// resolve wildcard files
options.files = options.files.reduce((acc, cur) => {
if (cur.endsWith("*")) {
acc.push(...recursiveFiles(cur.slice(0, -1)).filter(filename => /\.(js|ts|mjs)$/.test(filename)));
} else {
acc.push(cur)
}
return acc;
}, [])
const structures = parseFiles(options.files, options.decorator);
// Post-process classes before generating
structures.classes.forEach(klass => klass.postProcessing());
const files = generator(structures, options);
files.forEach((file: File) => {
const outputPath = path.resolve(options.output, file.name);
fs.writeFileSync(outputPath, file.content);
console.log("generated:", file.name);
});
}
function recursiveFiles(dir: string): string[] {
const files = fs.readdirSync(dir, { withFileTypes: true });
let collect = [];
files.forEach(file => {
const filename = path.resolve(dir, file.name);
file.isDirectory() ? collect.push(...recursiveFiles(filename)) : collect.push(filename);
})
return collect;
}