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