Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | const debug = require('debug')('tabtab:installer');
const fs = require('fs');
const path = require('path');
const untildify = require('untildify');
const { promisify } = require('util');
const readFile = promisify(fs.readFile);
const writeFile = promisify(fs.writeFile);
const { BASH_LOCATION, FISH_LOCATION, ZSH_LOCATION } = require('./constants');
const shellExtension = location => {
if (location === BASH_LOCATION) return 'bash';
if (location === FISH_LOCATION) return 'fish';
if (location === ZSH_LOCATION) return 'zsh';
};
const scriptFromLocation = location => {
if (location === BASH_LOCATION) {
return path.join(__dirname, '../scripts/bash.sh');
}
if (location === FISH_LOCATION) {
return path.join(__dirname, '../scripts/fish.sh');
}
if (location === ZSH_LOCATION) {
return path.join(__dirname, '../scripts/zsh.sh');
}
};
const writeToShellConfig = ({ name, location }) => {
debug(`Adding tabtab script to ${location}`);
const filename = path.join(
__dirname,
'../.completions',
`${name}.${shellExtension(location)}`
);
debug('Which filename', filename);
return new Promise((resolve, reject) => {
const stream = fs.createWriteStream(untildify(location), { flags: 'a' });
stream.on('error', reject);
stream.on('finish', () => resolve());
debug('Writing to shell configuration file (%s)', location);
stream.write(`\n# tabtab source for ${name} package`);
stream.write('\n# uninstall by removing these lines');
if (location === BASH_LOCATION) {
stream.write(`\n[ -f ${filename} ] && . ${filename} || true`);
} else if (location === FISH_LOCATION) {
debug('Addding fish line');
stream.write(`\n[ -f ${filename} ]; and . ${filename}; or true`);
} else if (location === ZSH_LOCATION) {
debug('Addding zsh line');
stream.write(`\n[[ -f ${filename} ]] && . ${filename} || true`);
}
stream.end('\n');
});
};
const writeToCompletionScript = ({ name, completer, location }) => {
const filename = path.join(
__dirname,
'../.completions',
`${name}.${shellExtension(location)}`
);
const script = scriptFromLocation(location);
debug('Writing completion script to', filename);
debug('with', script);
return readFile(script, 'utf8')
.then(filecontent =>
filecontent
.replace(/\{pkgname\}/g, name)
.replace(/{completer}/g, completer)
// on Bash on windows, we need to make sure to remove any \r
.replace(/\r?\n/g, '\n')
)
.then(filecontent => writeFile(filename, filecontent));
};
const installer = {
install(options = { name: '', completer: '', location: '' }) {
debug('Install with options', options);
if (!options.name) {
throw new TypeError('options.name is required');
}
if (!options.completer) {
throw new TypeError('options.completer is required');
}
if (!options.location) {
throw new TypeError('options.location is required');
}
return Promise.all([
writeToShellConfig(options),
writeToCompletionScript(options)
]);
},
uninstall(options = { name: '' }) {
debug('Uninstall with options', options);
throw new Error('Not yet implemented');
},
writeToShellConfig,
writeToCompletionScript
};
module.exports = installer;
|