You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.5 KiB
57 lines
1.5 KiB
'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) |
|
};
|
|
|