39 lines
842 B
JavaScript
39 lines
842 B
JavaScript
|
'use strict';
|
||
|
|
||
|
const tabsToSpaces = require('convert-to-spaces');
|
||
|
|
||
|
const generateLineNumbers = (line, around) => {
|
||
|
const lineNumbers = [];
|
||
|
|
||
|
const min = line - around;
|
||
|
const max = line + around;
|
||
|
|
||
|
for (let lineNumber = min; lineNumber <= max; lineNumber++) {
|
||
|
lineNumbers.push(lineNumber);
|
||
|
}
|
||
|
|
||
|
return lineNumbers;
|
||
|
};
|
||
|
|
||
|
module.exports = (source, line, options) => {
|
||
|
if (typeof source !== 'string') {
|
||
|
throw new TypeError('Source code is missing.');
|
||
|
}
|
||
|
|
||
|
if (!line || line < 1) {
|
||
|
throw new TypeError('Line number must start from `1`.');
|
||
|
}
|
||
|
|
||
|
source = tabsToSpaces(source).split('\n');
|
||
|
|
||
|
if (line > source.length) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
options = Object.assign({around: 3}, options);
|
||
|
|
||
|
return generateLineNumbers(line, options.around)
|
||
|
.filter(line => source[line - 1] !== undefined)
|
||
|
.map(line => ({line, value: source[line - 1]}));
|
||
|
};
|