sanscript-scan
Version:
Integrated dependency risk awareness
108 lines (92 loc) • 3.8 kB
JavaScript
const fs = require('fs');
const path = require('path');
const axios = require('axios');
const chalk = require('chalk');
const API_ENDPOINT = 'https://sanscript.veryserious.systems/analyse';
async function validatePackageJson(packageJson) {
if (!packageJson.name) {
throw new Error('Package.json must contain a name field');
}
if (!packageJson.version) {
throw new Error('Package.json must contain a version field');
}
if (!packageJson.dependencies && !packageJson.devDependencies && !packageJson.peerDependencies && !packageJson.optionalDependencies) {
throw new Error('No dependencies found to analyze');
}
return true;
}
async function main() {
try {
const packagePath = path.join(process.cwd(), 'package.json');
if (!fs.existsSync(packagePath)) {
console.error(chalk.red('Error: No package.json found in current directory'));
process.exit(1);
}
let packageJson;
try {
packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
} catch (error) {
console.error(chalk.red('Error: Invalid package.json format'));
process.exit(1);
}
try {
await validatePackageJson(packageJson);
} catch (error) {
console.error(chalk.red('Validation Error:', error.message));
process.exit(1);
}
console.log(chalk.blue('Analyzing package.json...'));
const packageToSend = {
...packageJson,
dependencies: packageJson.dependencies || {}
};
try {
const response = await axios.post(API_ENDPOINT, packageToSend, {
headers: {
'Content-Type': 'application/json'
},
validateStatus: false
});
if (response.status !== 200) {
console.error(chalk.red(`API Error (${response.status}):`));
if (response.status === 400) {
console.error('Invalid package.json format or content');
} else if (response.status === 413) {
console.error('Package.json file is too large');
} else if (response.status === 429) {
console.error('Too many requests. Please try again later');
} else if (response.status >= 500) {
console.error('Server error. Please try again later');
}
process.exit(1);
}
if (response.data && response.data.uuid) {
const resultUrl = `https://sanscript.veryserious.systems/scan/${response.data.uuid}`;
console.log(chalk.green('\nAnalysis complete! View your results at:'));
console.log(chalk.cyan(resultUrl));
} else {
throw new Error('Invalid API response format');
}
} catch (error) {
if (error.response) {
const safeResponse = {
status: error.response.status,
statusText: error.response.statusText,
data: error.response.data,
headers: error.response.headers
};
console.error('Response:', JSON.stringify(safeResponse));
} else if (error.request) {
console.error(chalk.red('No response from server. Please check your internet connection.'));
} else {
console.error(chalk.red('Error:', error.message));
}
process.exit(1);
}
} catch (error) {
console.error(chalk.red('Unexpected Error:', error.message));
process.exit(1);
}
}
main();