import express from "express"; import {Liquid} from 'liquidjs'; import path from "path"; const liquidEngine = new Liquid({root: path.resolve(__dirname, 'views/'), jsTruthy: true}); const app = express(); app.use(express.json()); // to support JSON-encoded bodies app.use(express.urlencoded()); // to support URL-encoded bodies app.engine('liquid', liquidEngine.express()); app.set('views', [path.join(__dirname, 'views')]); app.set('view engine', 'liquid'); app.use('/static', express.static('static')); app.get('/', (req, res) => { res.render('index'); }) function extractInfoFromPythonDepString(depstring) { const info = { name: "", version_operator: "", version: "", } const parts = depstring.split(';'); const namever = parts[0]; // https://stackoverflow.com/questions/24470567/what-are-the-requirements-for-naming-python-modules const match = namever.match(/^(?[a-zA-Z_][a-zA-Z_0-9]*)(?.=)(?[0-9.])/); if(match !== null && match.groups !== undefined) { info.name = match.groups['name']; info.operator = match.groups['operator']; info.version = match.groups['version']; } return info; } app.post('/api/dependency', async (req, res) => { const packagename = req.body.package; console.log(packagename) const pypires = await fetch(`https://pypi.org/pypi/${packagename}/json`); const json = await pypires.json(); const name = json.info.name; const summary = json.info.summary; const deps = json.info.requires_dist.map( e => extractInfoFromPythonDepString(e) ); const versions = json.releases; const latestVersionNumber = Object.entries(versions).sort( ([k1, v1], [k2, v2]) => k2 - v2 )[0]; const latestVersion = versions[latestVersionNumber]; const size = latestVersion.sort((a, b) => b.size - a.size )[0].size; res.render('dependency', { name: name, summary: summary, weight: size, dependencies: deps }) }); app.listen(8080)