From 102b15c3cd8a785c8514108bb64b90af79290876 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Tue, 26 Oct 2021 18:48:54 +0200 Subject: [PATCH] NPM registry: more robust, work on Windows - Run `npm rm` in correct dir - Encode args in `npm conf rm` command for Powershell - Don't cleanup in exit handler, this might not complete. Instead, do it on startup. - Different cleanup command for Windows and Linux - Explicitly close server, instead of relying on process.exit() - Make scope configurable --- .registry/server.js | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/.registry/server.js b/.registry/server.js index 2696d948..2a9b8161 100644 --- a/.registry/server.js +++ b/.registry/server.js @@ -1,17 +1,22 @@ const { exec } = require ('child_process') +const isWin = process.platform === 'win32' const express = require ('express') const fs = require ('fs') const app = express() const { PORT=4444 } = process.env -const [,,port=PORT] = process.argv +const [,,port=PORT,scope='@capire'] = process.argv const cwd = __dirname +// clean up on start (exit handler might not complete on Windows) +exec(isWin ? 'del *.tgz' : 'rm *.tgz', {cwd}) + + app.use('/-/:tarball', (req,res,next) => { console.debug ('GET', req.params) try { const { tarball } = req.params - const [, pkg ] = /^capire-(\w+)/.exec(tarball) + const [, pkg ] = /^\w+-(\w+)/.exec(tarball) fs.lstat(tarball,(err => { if (err) exec(`npm pack ../${pkg}`,{cwd},next) else next() @@ -28,9 +33,9 @@ app.get('/*', (req,res)=>{ const url = decodeURIComponent(req.url) console.debug ('GET',url) try { - const [, capire, pkg ] = /^\/(@capire)\/(\w+)/.exec(url) - const package = require (`${capire}/${pkg}/package.json`) - const tarball = `capire-${pkg}-${package.version}.tgz` + const [, scpe, pkg ] = /^\/(@\w+)\/(\w+)/.exec(url) + const package = require (`${scpe}/${pkg}/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({ "name": package.name, @@ -53,18 +58,18 @@ app.get('/*', (req,res)=>{ } }) -app.listen(port, ()=>{ - console.log (`npm set @capire:registry=http://localhost:${port}`) - console.log (`@capire registry listening on http://localhost:${port}`) - exec(`npm set @capire:registry=http://localhost:${port}`) +const server = app.listen(port, ()=>{ + const url = `http://localhost:${port}` + console.log (`npm set ${scope}:registry=${url}`) + exec(`npm set ${scope}:registry=${url}`) + console.log (`${scope} registry listening on ${url}`) }) const _exit = ()=>{ - console.log ('\nnpm conf rm @capire:registry') - exec('npm conf rm @capire:registry') - exec('rm *.tgz') - process.exit() + server.close() + exec(`npm conf rm "${scope}:registry"`, ()=> { process.exit() }) } + process.on ('SIGTERM',_exit) process.on ('SIGHUP',_exit) process.on ('SIGINT',_exit)