99 lines
3.0 KiB
TypeScript
99 lines
3.0 KiB
TypeScript
import {readFileSync, writeFileSync, mkdir} from "fs";
|
|
import {isArray, isString} from "util";
|
|
import * as ts from "typescript";
|
|
import * as decl from "./declarator";
|
|
import * as glob from "glob";
|
|
import * as path from "path";
|
|
import * as mkdirp from "mkdirp";
|
|
|
|
let source_files: string[] = [];
|
|
let exclude_files: string[] = [];
|
|
let target_file: string = "out.d.ts";
|
|
let verbose: boolean = false;
|
|
let config_file: string = undefined;
|
|
let base_path = process.cwd();
|
|
|
|
let args = process.argv.slice(2);
|
|
while(args.length > 0) {
|
|
if(args[0] == "--file") {
|
|
source_files.push(args[1]);
|
|
args = args.slice(2);
|
|
} else if(args[0] == "--exclude") {
|
|
exclude_files.push(args[1]);
|
|
args = args.slice(2);
|
|
} else if(args[0] == "--destination") {
|
|
target_file = args[1];
|
|
args = args.slice(2);
|
|
} else if(args[0] == "-v" || args[0] == "--verbose") {
|
|
verbose = true;
|
|
args = args.slice(1);
|
|
} else if(args[0] == "-c" || args[0] == "--config") {
|
|
config_file = args[1];
|
|
base_path = path.normalize(path.dirname(config_file));
|
|
args = args.slice(2);
|
|
} else if(args[0] == "-b" || args[0] == "--base") {
|
|
base_path = args[1];
|
|
base_path = path.normalize(base_path);
|
|
args = args.slice(2);
|
|
} else {
|
|
console.error("Invalid command line option %s", args[0]);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
if(config_file) {
|
|
console.log("Loading config file");
|
|
const json = JSON.parse(readFileSync(config_file).toString());
|
|
if(!json) {
|
|
console.error("Failed to parse config!");
|
|
process.exit(1);
|
|
}
|
|
|
|
if(isArray(json["source_files"]))
|
|
source_files.push(...json["source_files"]);
|
|
if(isArray(json["exclude"]))
|
|
exclude_files.push(...json["exclude"]);
|
|
if(isString(json["target_file"]))
|
|
target_file = json["target_file"];
|
|
}
|
|
|
|
if(verbose) {
|
|
console.log("Base path: " + base_path);
|
|
console.log("Input files:");
|
|
for(const file of source_files)
|
|
console.log(" - " + file);
|
|
console.log("Target file: " + target_file);
|
|
}
|
|
|
|
const negate_files: string[] = [].concat.apply([], exclude_files.map(file => glob.sync(base_path + "/" + file))).map(file => path.normalize(file));
|
|
|
|
let result = "";
|
|
source_files.forEach(file => {
|
|
glob.sync(base_path + "/" + file).forEach(_file => {
|
|
_file = path.normalize(_file);
|
|
for(const n_file of negate_files) {
|
|
if(n_file == _file) {
|
|
console.log("Skipping %s", _file);
|
|
return;
|
|
}
|
|
}
|
|
|
|
let source = ts.createSourceFile(
|
|
_file,
|
|
readFileSync(_file).toString(),
|
|
ts.ScriptTarget.ES2015,
|
|
true
|
|
);
|
|
|
|
console.log("Compile " + _file);
|
|
result += "\n/* File: " + _file + " */\n" + decl.print(source, decl.generate(source, {
|
|
remove_private: false
|
|
}));
|
|
});
|
|
});
|
|
|
|
mkdirp(path.normalize(path.dirname(base_path + "/" + target_file)), error => {
|
|
if(error)
|
|
throw error;
|
|
writeFileSync(base_path + "/" + target_file, result);
|
|
}); |