in npm/src/main.ts [303:405]
export async function run(options: Options): Promise<void> {
if (options.help) {
return;
}
if (options.version) {
console.log(require('../package.json').version);
return;
}
let packageFile: string | undefined = options.package;
if (packageFile === undefined) {
packageFile = 'package.json';
}
packageFile = paths.makeAbsolute(packageFile);
const packageJson: PackageJson | undefined = PackageJson.read(packageFile);
let projectRoot = options.projectRoot;
if (projectRoot === undefined && packageFile !== undefined) {
projectRoot = path.posix.dirname(packageFile);
if (!path.isAbsolute(projectRoot)) {
projectRoot = paths.makeAbsolute(projectRoot);
}
}
if (projectRoot === undefined) {
console.error(`No project root specified.`);
process.exitCode = -1;
return;
}
if (!options.stdin && options.in === undefined) {
console.error(`Either a input file using --in or --stdin must be specified`);
process.exitCode = -1;
return;
}
if (!options.stdout && options.out === undefined) {
console.error(`Either a output file using --out or --stdout must be specified.`);
process.exitCode = -1;
return;
}
if (options.in !== undefined && options.out !== undefined && paths.makeAbsolute(options.in) === paths.makeAbsolute(options.out)) {
console.error(`Input and output file can't be the same.`);
process.exitCode = -1;
return;
}
let writer: Writer = new StdoutWriter();
function emit(value: string | Edge | Vertex): void {
if (typeof value === 'string') {
writer.writeln(value);
} else {
writer.writeln(JSON.stringify(value, undefined, 0));
}
}
const queue: AttachQueue = new AttachQueue(emit);
const sourceInfo: SourceInfo = new SourceInfo();
let exportLinker: ExportLinker | undefined;
if (packageJson !== undefined) {
exportLinker = new ExportLinker(sourceInfo, packageJson, queue);
}
const importLinker: ImportLinker = new ImportLinker(sourceInfo, queue);
let input: NodeJS.ReadStream | fs.ReadStream = process.stdin;
if (options.in !== undefined && fs.existsSync(options.in)) {
input = fs.createReadStream(options.in, { encoding: 'utf8'});
}
if (options.out !== undefined) {
writer = new FileWriter(fs.openSync(options.out, 'w'));
}
let needsInitialization: boolean = true;
let lastId: Id | undefined;
const rd = readline.createInterface(input);
rd.on('line', (line) => {
emit(line);
let element: Edge | Vertex = JSON.parse(line);
lastId = element.id;
if (needsInitialization) {
queue.initialize(element.id);
needsInitialization = false;
}
if (element.type === ElementTypes.vertex) {
switch (element.label) {
case VertexLabels.moniker:
if (exportLinker !== undefined) {
exportLinker.handleMoniker(element);
}
importLinker.handleMoniker(element);
break;
case VertexLabels.source:
sourceInfo.handleSource(element);
break;
}
}
});
rd.on('close', () => {
if (lastId !== undefined) {
queue.flush(lastId);
}
});
}