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.
		
		
		
		
			
				
					58 lines
				
				1.5 KiB
			
		
		
			
		
	
	
					58 lines
				
				1.5 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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)
							 | 
						||
| 
								 | 
							
								};
							 |