From 21be9d1bbfe5886791845ea6b3543804c9798109 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Mon, 8 Aug 2022 23:10:31 +0200 Subject: [PATCH] Registry: resolve dev packages Also resolve @sap packages, but forward non-cds packages to default registry --- .registry/server.js | 60 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/.registry/server.js b/.registry/server.js index d3489325..5a56298d 100644 --- a/.registry/server.js +++ b/.registry/server.js @@ -1,27 +1,34 @@ -const { exec } = require ('child_process') +const { exec, execSync } = require ('child_process') const isWin = process.platform === 'win32' const express = require ('express') const fs = require ('fs') +const { dirname, relative } = require('path') +const axios = require('axios') const app = express() -const { PORT=4444 } = process.env -const [,,port=PORT,scope='@capire'] = process.argv const cwd = __dirname +const port=process.env.PORT || 4444 +let scopes = process.argv.filter(a => a.startsWith('@')) +if (!scopes.length) scopes = ['@capire'] // clean up on start (exit handler might not complete on Windows) exec(isWin ? 'del *.tgz' : 'rm *.tgz', {cwd}) -app.use('/-/:tarball', (req,res,next) => { +app.use('/-/:tarball', async (req,res,next) => { console.debug ('GET', req.params) try { const { tarball } = req.params const pkgFull = tarball.substring(0, tarball.lastIndexOf('-')) - const [, pkg ] = /^\w+-(.+)/.exec(pkgFull) + const scope = '@'+pkgFull.substring(0, pkgFull.indexOf('-')) + const pkg = pkgFull.substring(pkgFull.indexOf('-')+1) fs.lstat(tarball,(err => { - if (err) console.debug (`npm pack ../${pkg}`) - if (err) exec(`npm pack ../${pkg}`,{cwd},next) - else next() + if (err) { // no tgz yet + const loc = dirname(require.resolve(`${scope}/${pkg}/package.json`)) + console.debug (`npm pack ${relative(cwd, loc)}`) + exec(`npm pack ${loc}`,{cwd},next) + } + else next() //> express.static below })) } catch (e) { console.error(e) @@ -31,14 +38,20 @@ app.use('/-/:tarball', (req,res,next) => { app.use('/-', express.static(__dirname)) -app.get('/*', (req,res)=>{ +app.get('/*', async (req,res)=>{ const urlRegex = /^\/(@[\w-]+)\/(.+)/ const url = decodeURIComponent(req.url) console.debug ('GET',url) try { if (!urlRegex.test(url)) return res.sendStatus(404) const [, scpe, pkg ] = urlRegex.exec(url) - const package = require (`${scpe}/${pkg}/package.json`) + const packageName = `${scpe}/${pkg}` + + // delegate to default registry for @sap/non-cds packages + if (scpe === ('@sap') && !packageName.startsWith('@sap/cds')) { + return forward(req, res) + } + const package = require (`${packageName}/package.json`) const tarball = `${scpe.slice(1)}-${pkg}-${package.version}.tgz` // https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md res.json({ @@ -53,6 +66,8 @@ app.get('/*', (req,res)=>{ "dist": { "tarball": `${server.url}/-/${tarball}` }, + dependencies: package.dependencies, + devDependencies: package.devDependencies } }, }) @@ -64,15 +79,32 @@ app.get('/*', (req,res)=>{ const server = app.listen(port, ()=>{ const url = server.url = `http://localhost:${server.address().port}` - console.log (`npm set ${scope}:registry=${url}`) - exec(`npm set ${scope}:registry=${url}`) - console.log (`${scope} registry listening on ${url}`) + + for (const scope of scopes) { + console.log (`npm set ${scope}:registry=${url}`) + execSync(`npm set ${scope}:registry=${url}`) + } + console.log (`registry listening on ${url}`) }) const _exit = ()=>{ server.close() - exec(`npm conf rm "${scope}:registry"`, ()=> { process.exit() }) + for (const scope of scopes) { + execSync(`npm conf rm "${scope}:registry"`) + } + process.exit() +} + +async function forward(req, res) { + try { + const url = `https://registry.npmjs.org${req.url}` + const resAxios = await axios.get(url) + console.debug('->', decodeURI(url), resAxios.status) + return res.json(resAxios.data) + } catch (e) { + return res.sendStatus(e.response.status) + } } process.on ('SIGTERM',_exit)