ts-node-client
Version:
npm / node module to transfer dependency information to TrustSource server.
123 lines (111 loc) • 4.57 kB
JavaScript
/* eslint-disable */
/**********************************************************
* Copyright (c) 2017. Enterprise Architecture Group, EACG
*
* SPDX-License-Identifier: Apache-2.0
*********************************************************/
/* eslint-enable */
const debuglog = (require('debuglog'))('ts-node-client');
const fs = require('fs');
const Convertor = require('./convertor');
const stdlog = console.log;
const MODULE_NAME = 'ts-node-client:cli';
module.exports = scan;
const NpmScanner = promisify(require('./npm-scanner').Scanner);
const MeteorScanner = promisify(require('./meteor-scanner').Scanner);
function scan(options, scanDone) {
if (typeof (scanDone) !== 'function') {
throw new Error('Please provide a callback function as 2nd argument.');
}
if (options.url.endsWith('/')) {
options.url = options.url.slice(0, -1);
}
debuglog(`${MODULE_NAME}.scan() reorganized options:`, options);
const npmScanner = new NpmScanner(options);
const meteorScanner = new MeteorScanner(options);
npmScanner.scan().then((scanResult) => {
if (options.scanMeteor) {
debuglog(`${MODULE_NAME}.scan() scanMeteor set: scanning meteor dependencies`);
return meteorScanner.scan(scanResult.module).then((meteorScanResult) => {
// remove dependency introduced by local package.json (this will never be released)
const npmDependencies = scanResult.dependencies.length === 1
? scanResult.dependencies[0].dependencies : scanResult.dependencies;
Array.prototype.push.apply(meteorScanResult.dependencies, npmDependencies);
return meteorScanResult;
});
}
return scanResult;
}).then((scanResult) => {
if (options.simulate) {
stdlog(`${MODULE_NAME}.scan():${npmScanner.name} simulating, nothing transferred:`);
return undefined;
}
return scanResult;
}).then((scanResult) => {
if (options.saveAs) {
const date = new Date();
let printData = JSON.stringify(scanResult, 0, 2);
let printExt = 'scan';
if (options.saveAsFormat) {
const allowedTypes = ['scan', 'spdx', 'cydx'];
if (allowedTypes.indexOf(options.saveAsFormat) > 0) {
printData = JSON.stringify(Convertor.scanTo(options.saveAsFormat, scanResult), 0, 2);
printExt = options.saveAsFormat;
}
}
const formatedDate = date.toISOString().substr(0, 19).split(':').join('-').split('T').join('-');
fs.writeFileSync(`${options.saveAs || 'ts-scan'}-${formatedDate}-${options.saveAsFormat ? printExt : 'scan'}.json`, printData);
}
return scanResult;
}).then((scanResult) => {
if (scanResult) {
return npmScanner.transfer(scanResult);
}
return undefined;
}).then(
(transferResult) => {
if (transferResult) {
stdlog(`${MODULE_NAME}.scan():${npmScanner.name} successfully transferred scan to server:${
JSON.stringify(transferResult)}`);
}
debuglog(`${MODULE_NAME}scan(): finished`, transferResult);
scanDone(true);
},
(error) => {
stdlog(`${MODULE_NAME}.scan():${npmScanner.name} error transferring scan:${JSON.stringify(error)}`);
return Promise.reject();
}
)
.catch((error) => {
if (error) stdlog(`${MODULE_NAME}scan(): error`, error);
scanDone(false);
});
}
/* eslint-disable func-names, prefer-rest-params */
function promisifyFunc(func) {
if (typeof (func) === 'function') {
return function () {
const args = Array.from(arguments);
const self = this;
return new Promise((resolve, reject) => {
args.push((error, data) => {
if (error) {
reject(error);
} else {
resolve(data);
}
});
func.apply(self, args);
});
};
}
return func;
}
/* eslint-enable func-names, prefer-rest-params */
function promisify(scanner) {
if (scanner && scanner.prototype) {
scanner.prototype.scan = promisifyFunc(scanner.prototype.scan);
scanner.prototype.transfer = promisifyFunc(scanner.prototype.transfer);
}
return scanner;
}