'use strict'; const path = require('path'); const execa = require('execa'); const xsel = 'xsel'; const xselFallback = path.join(__dirname, '../fallbacks/linux/xsel'); const copyArguments = ['--clipboard', '--input']; const pasteArguments = ['--clipboard', '--output']; const makeError = (xselError, fallbackError) => { let error; if (xselError.code === 'ENOENT') { error = new Error('Couldn\'t find the `xsel` binary and fallback didn\'t work. On Debian/Ubuntu you can install xsel with: sudo apt install xsel'); } else { error = new Error('Both xsel and fallback failed'); error.xselError = xselError; } error.fallbackError = fallbackError; return error; }; const xselWithFallback = async (argumentList, options) => { try { return await execa.stdout(xsel, argumentList, options); } catch (xselError) { try { return await execa.stdout(xselFallback, argumentList, options); } catch (fallbackError) { throw makeError(xselError, fallbackError); } } }; const xselWithFallbackSync = (argumentList, options) => { try { return execa.sync(xsel, argumentList, options); } catch (xselError) { try { return execa.sync(xselFallback, argumentList, options); } catch (fallbackError) { throw makeError(xselError, fallbackError); } } }; module.exports = { copy: async options => { await xselWithFallback(copyArguments, options); }, copySync: options => { xselWithFallbackSync(copyArguments, options); }, paste: options => xselWithFallback(pasteArguments, options), pasteSync: options => xselWithFallbackSync(pasteArguments, options) };