var ini = require('ini'); var glob = require('glob'); var path = require('path'); var fs = require('fs'); // Constants var ICON_REALPATH_REGEX = /\..+$/; exports.loadAllDesktopFiles = function(rootDirs) { return exports.findAllDesktopFiles(rootDirs) .then(function(filePaths) { var promises = filePaths.map(function(path) { return exports.loadDesktopFile(path); }); return Promise.all(promises) .then(function(contents) { return contents.map(function(content, i) { return { content: content, path: filePaths[i] }; }); }) ; }) ; }; exports.findAllDesktopFiles = function(rootDirs) { if(!Array.isArray(rootDirs)) { rootDirs = [rootDirs]; } var promises = rootDirs.map(function(rootDir) { var globPath = path.join(rootDir, '**/*.desktop'); return new Promise(function(resolve, reject) { glob(globPath, function(err, files) { if(err) return reject(err); return resolve(files); }); }); }); return Promise.all(promises) .then(function(apps) { return uniq(flatten(apps)); }) ; }; exports.loadDesktopFile = function(filePath) { return new Promise(function(resolve, reject) { fs.readFile(filePath, 'utf8', function(err, content) { if(err) return reject(err); try { var decoded = ini.decode(content); return resolve(decoded); } catch(err) { return reject(err); } }); }); }; exports.findIcon = function(iconPath) { return new Promise(function(resolve, reject) { if( ICON_REALPATH_REGEX.test(iconPath) ) { return resolve(iconPath); } }); }; // Array helpers function flatten(arr) { return arr.reduce(function(result, item) { result = result.concat.apply(result, Array.isArray(item) ? flatten(item) : [item]); return result; }, []); } function uniq(arr) { return arr.reduce(function(result, item) { if(result.indexOf(item) === -1) { result.push(item); } return result; }, []); }