UNPKG

3.45 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4// istanbul ignore next
5
6function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
7
8var _lineNumbers = require("line-numbers");
9
10var _lineNumbers2 = _interopRequireDefault(_lineNumbers);
11
12var _repeating = require("repeating");
13
14var _repeating2 = _interopRequireDefault(_repeating);
15
16var _jsTokens = require("js-tokens");
17
18var _jsTokens2 = _interopRequireDefault(_jsTokens);
19
20var _esutils = require("esutils");
21
22var _esutils2 = _interopRequireDefault(_esutils);
23
24var _chalk = require("chalk");
25
26var _chalk2 = _interopRequireDefault(_chalk);
27
28/**
29 * Chalk styles for token types.
30 */
31
32var defs = {
33 string: _chalk2["default"].red,
34 punctuator: _chalk2["default"].bold,
35 curly: _chalk2["default"].green,
36 parens: _chalk2["default"].blue.bold,
37 square: _chalk2["default"].yellow,
38 keyword: _chalk2["default"].cyan,
39 number: _chalk2["default"].magenta,
40 regex: _chalk2["default"].magenta,
41 comment: _chalk2["default"].grey,
42 invalid: _chalk2["default"].inverse
43};
44
45/**
46 * RegExp to test for newlines in terminal.
47 */
48
49var NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
50
51/**
52 * Get the type of token, specifying punctuator type.
53 */
54
55function getTokenType(match) {
56 var token = _jsTokens2["default"].matchToToken(match);
57 if (token.type === "name" && _esutils2["default"].keyword.isReservedWordES6(token.value)) {
58 return "keyword";
59 }
60
61 if (token.type === "punctuator") {
62 switch (token.value) {
63 case "{":
64 case "}":
65 return "curly";
66 case "(":
67 case ")":
68 return "parens";
69 case "[":
70 case "]":
71 return "square";
72 }
73 }
74
75 return token.type;
76}
77
78/**
79 * Highlight `text`.
80 */
81
82function highlight(text) {
83 return text.replace(_jsTokens2["default"], function () {
84 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
85 args[_key] = arguments[_key];
86 }
87
88 var type = getTokenType(args);
89 var colorize = defs[type];
90 if (colorize) {
91 return args[0].split(NEWLINE).map(function (str) {
92 return colorize(str);
93 }).join("\n");
94 } else {
95 return args[0];
96 }
97 });
98}
99
100/**
101 * Create a code frame, adding line numbers, code highlighting, and pointing to a given position.
102 */
103
104exports["default"] = function (lines, lineNumber, colNumber) {
105 var opts = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
106
107 colNumber = Math.max(colNumber, 0);
108
109 var highlighted = opts.highlightCode && _chalk2["default"].supportsColor;
110 if (highlighted) lines = highlight(lines);
111
112 lines = lines.split(NEWLINE);
113
114 var start = Math.max(lineNumber - 3, 0);
115 var end = Math.min(lines.length, lineNumber + 3);
116
117 if (!lineNumber && !colNumber) {
118 start = 0;
119 end = lines.length;
120 }
121
122 var frame = _lineNumbers2["default"](lines.slice(start, end), {
123 start: start + 1,
124 before: " ",
125 after: " | ",
126 transform: function transform(params) {
127 if (params.number !== lineNumber) {
128 return;
129 }
130
131 if (colNumber) {
132 params.line += "\n" + params.before + _repeating2["default"](" ", params.width) + params.after + _repeating2["default"](" ", colNumber - 1) + "^";
133 }
134
135 params.before = params.before.replace(/^./, ">");
136 }
137 }).join("\n");
138
139 if (highlighted) {
140 return _chalk2["default"].reset(frame);
141 } else {
142 return frame;
143 }
144};
145
146module.exports = exports["default"];
\No newline at end of file