npm-release.mjs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { mkdirSync, writeFileSync } from 'node:fs'
  2. import { join } from 'node:path'
  3. import { createHash } from 'node:crypto'
  4. export function writeNpmFixture(root, version, broken = false) {
  5. const release = { schemaVersion: 1, releaseVersion: version, webVersion: version, gitTag: `v${version}` }
  6. const files = {
  7. 'package.json': JSON.stringify({ name: '@lsamien/yaoyao', version, type: 'module', engines: { node: '>=24' }, fixtureBroken: broken }),
  8. 'release.json': JSON.stringify(release),
  9. 'build-info.json': JSON.stringify({ commit: createHash('sha256').update(version).digest('hex').slice(0, 40), buildNumber: 1, dirty: false }),
  10. 'dist/index.html': '<html>npm fixture</html>',
  11. 'bin/hermes-yaoyao.mjs': '// fixture launcher\n',
  12. 'bin/hermes-yaoyao-updater.mjs': '// fixture updater\n',
  13. 'dist-server/server/index.js': `
  14. import {createServer} from 'node:http';
  15. import {DatabaseSync} from 'node:sqlite';
  16. import {createHash,randomUUID} from 'node:crypto';
  17. import {readFileSync,writeFileSync,realpathSync} from 'node:fs';
  18. import {join} from 'node:path';
  19. const root=process.cwd(),home=realpathSync(process.env.HERMES_YAOYAO_HOME),port=Number(process.env.HERMES_YAOYAO_PORT);
  20. const release=JSON.parse(readFileSync(join(root,'release.json'))),build=JSON.parse(readFileSync(join(root,'build-info.json'))),pkg=JSON.parse(readFileSync(join(root,'package.json')));
  21. const db=new DatabaseSync(join(home,'workspace.sqlite3'));db.exec('CREATE TABLE IF NOT EXISTS fixture_data (value TEXT)');
  22. if(pkg.fixtureBroken){db.exec("INSERT INTO fixture_data VALUES ('failed update')");writeFileSync(join(home,'user.txt'),'failed update');}
  23. const identity={protocol:1,pid:process.pid,instanceId:randomUUID(),dataKey:createHash('sha256').update(home).digest('hex'),version:release.webVersion,build,url:'http://127.0.0.1:'+port,maintenanceProtocol:1};
  24. writeFileSync(join(home,'service-instance.json'),JSON.stringify(identity));let quiesced=false;
  25. const server=createServer((req,res)=>{res.setHeader('Content-Type','application/json');
  26. if(req.url==='/desktop/service')res.end(JSON.stringify({...identity,quiesced}));
  27. else if(req.url==='/desktop/service/quiesce'){quiesced=req.method==='POST';res.end(JSON.stringify({quiesced}));}
  28. else if(req.url==='/healthz')res.end(JSON.stringify({ok:!pkg.fixtureBroken}));
  29. else if(req.url==='/api/status')res.end(JSON.stringify({server_kind:'yaoyao-web',version:release.webVersion}));
  30. else{res.statusCode=404;res.end('{}');}});
  31. server.listen(port,'127.0.0.1');process.on('SIGTERM',()=>server.close(()=>{db.close();process.exit(0)}));
  32. `,
  33. }
  34. for (const [file, contents] of Object.entries(files)) {
  35. const path = join(root, file)
  36. mkdirSync(join(path, '..'), { recursive: true })
  37. writeFileSync(path, contents)
  38. }
  39. return release
  40. }