depyth/index.js

73 lines
2.0 KiB
JavaScript

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(/^(?<name>[a-zA-Z_][a-zA-Z_0-9]*)(?<operator>.=)(?<version>[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)