fixture-registry.mjs 1.8 KB

1234567891011121314151617181920212223242526272829303132
  1. /** Local first-publication fixture: serve exact release bytes; proxy other public packages. */
  2. import fs from 'node:fs'
  3. import path from 'node:path'
  4. import { createServer } from 'node:http'
  5. import { createHash } from 'node:crypto'
  6. import { packageFiles } from './tar.mjs'
  7. const packages = process.argv.slice(2).map(filename => {
  8. const manifest = JSON.parse(packageFiles(filename).get('package.json'))
  9. const bytes = fs.readFileSync(filename)
  10. return { manifest, bytes, file: path.basename(filename), integrity: `sha512-${createHash('sha512').update(bytes).digest('base64')}` }
  11. })
  12. const publishedAt = new Date().toISOString()
  13. const server = createServer((request, response) => {
  14. if (!['GET', 'HEAD'].includes(request.method)) { response.writeHead(405); response.end(); return }
  15. const url = new URL(request.url, 'http://localhost')
  16. const name = decodeURIComponent(url.pathname.slice(1))
  17. const tarball = packages.find(item => name === `tarballs/${item.file}`)
  18. if (tarball) { response.writeHead(200, { 'content-type': 'application/octet-stream' }); response.end(tarball.bytes); return }
  19. const pkg = packages.find(item => name === item.manifest.name)
  20. if (!pkg) {
  21. response.writeHead(307, { location: `https://registry.npmjs.org${url.pathname}${url.search}` })
  22. response.end()
  23. return
  24. }
  25. const origin = `http://127.0.0.1:${server.address().port}`
  26. response.writeHead(200, { 'content-type': 'application/json' })
  27. response.end(JSON.stringify({ name, 'dist-tags': { preview: pkg.manifest.version },
  28. time: { created: publishedAt, modified: publishedAt, [pkg.manifest.version]: publishedAt },
  29. versions: { [pkg.manifest.version]: { ...pkg.manifest, dist: { tarball: `${origin}/tarballs/${pkg.file}`, integrity: pkg.integrity } } } }))
  30. })
  31. server.listen(0, '127.0.0.1', () => console.log(`http://127.0.0.1:${server.address().port}/`))