| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | const query = process.argv[2]const fs = require('fs')const childProcess = require('child_process')const SYSTEM_PATHS = [  '/lib',  '/usr/lib',  '/usr/lib64',  '/usr/local/lib',  '/opt/local/lib',  '/opt/homebrew/lib',  '/usr/lib/x86_64-linux-gnu',  '/usr/lib/i386-linux-gnu',  '/usr/lib/arm-linux-gnueabihf',  '/usr/lib/arm-linux-gnueabi',  '/usr/lib/aarch64-linux-gnu']/** * Checks for lib using ldconfig if present, or searching SYSTEM_PATHS * otherwise. * @param {string} lib - library name, e.g. 'jpeg' in 'libjpeg64.so' (see first line) * @return {boolean} exists */function hasSystemLib (lib) {  const libName = 'lib' + lib + '.+(so|dylib)'  const libNameRegex = new RegExp(libName)  // Try using ldconfig on linux systems  if (hasLdconfig()) {    try {      if (childProcess.execSync('ldconfig -p 2>/dev/null | grep -E "' + libName + '"').length) {        return true      }    } catch (err) {      // noop -- proceed to other search methods    }  }  // Try checking common library locations  return SYSTEM_PATHS.some(function (systemPath) {    try {      const dirListing = fs.readdirSync(systemPath)      return dirListing.some(function (file) {        return libNameRegex.test(file)      })    } catch (err) {      return false    }  })}/** * Checks for ldconfig on the path and /sbin * @return {boolean} exists */function hasLdconfig () {  try {    // Add /sbin to path as ldconfig is located there on some systems -- e.g.    // Debian (and it can still be used by unprivileged users):    childProcess.execSync('export PATH="$PATH:/sbin"')    process.env.PATH = '...'    // execSync throws on nonzero exit    childProcess.execSync('hash ldconfig 2>/dev/null')    return true  } catch (err) {    return false  }}/** * Checks for freetype2 with --cflags-only-I * @return Boolean exists */function hasFreetype () {  try {    if (childProcess.execSync('pkg-config cairo --cflags-only-I 2>/dev/null | grep freetype2').length) {      return true    }  } catch (err) {    // noop  }  return false}/** * Checks for lib using pkg-config. * @param {string} lib - library name * @return {boolean} exists */function hasPkgconfigLib (lib) {  try {    // execSync throws on nonzero exit    childProcess.execSync('pkg-config --exists "' + lib + '" 2>/dev/null')    return true  } catch (err) {    return false  }}function main (query) {  switch (query) {    case 'gif':    case 'cairo':      return hasSystemLib(query)    case 'pango':      return hasPkgconfigLib(query)    case 'freetype':      return hasFreetype()    case 'jpeg':      return hasPkgconfigLib('libjpeg')    case 'rsvg':      return hasPkgconfigLib('librsvg-2.0')    default:      throw new Error('Unknown library: ' + query)  }}process.stdout.write(main(query).toString())
 |