current-env.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. const process = require('node:process')
  2. const nodeOs = require('node:os')
  3. const fs = require('node:fs')
  4. function isMusl (file) {
  5. return file.includes('libc.musl-') || file.includes('ld-musl-')
  6. }
  7. function os () {
  8. return process.platform
  9. }
  10. function cpu () {
  11. return process.arch
  12. }
  13. const LDD_PATH = '/usr/bin/ldd'
  14. function getFamilyFromFilesystem () {
  15. try {
  16. const content = fs.readFileSync(LDD_PATH, 'utf-8')
  17. if (content.includes('musl')) {
  18. return 'musl'
  19. }
  20. if (content.includes('GNU C Library')) {
  21. return 'glibc'
  22. }
  23. return null
  24. } catch {
  25. return undefined
  26. }
  27. }
  28. function getFamilyFromReport () {
  29. const originalExclude = process.report.excludeNetwork
  30. process.report.excludeNetwork = true
  31. const report = process.report.getReport()
  32. process.report.excludeNetwork = originalExclude
  33. if (report.header?.glibcVersionRuntime) {
  34. family = 'glibc'
  35. } else if (Array.isArray(report.sharedObjects) && report.sharedObjects.some(isMusl)) {
  36. family = 'musl'
  37. } else {
  38. family = null
  39. }
  40. return family
  41. }
  42. let family
  43. function libc (osName) {
  44. if (osName !== 'linux') {
  45. return undefined
  46. }
  47. if (family === undefined) {
  48. family = getFamilyFromFilesystem()
  49. if (family === undefined) {
  50. family = getFamilyFromReport()
  51. }
  52. }
  53. return family
  54. }
  55. function devEngines (env = {}) {
  56. const osName = env.os || os()
  57. return {
  58. cpu: {
  59. name: env.cpu || cpu(),
  60. },
  61. libc: {
  62. name: env.libc || libc(osName),
  63. },
  64. os: {
  65. name: osName,
  66. version: env.osVersion || nodeOs.release(),
  67. },
  68. packageManager: {
  69. name: 'npm',
  70. version: env.npmVersion,
  71. },
  72. runtime: {
  73. name: 'node',
  74. version: env.nodeVersion || process.version,
  75. },
  76. }
  77. }
  78. module.exports = {
  79. cpu,
  80. libc,
  81. os,
  82. devEngines,
  83. }