UNPKG

sanscript-scan

Version:

Integrated dependency risk awareness

108 lines (92 loc) 3.8 kB
#!/usr/bin/env node 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();