UNPKG

3.58 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
8
9var _lodash = require('lodash');
10
11var _lodash2 = _interopRequireDefault(_lodash);
12
13function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
15exports.default = function (context) {
16 var option = context.options[0] || 'never';
17 var sourceCode = context.getSourceCode();
18
19 var reporter = function reporter(node, message, fix) {
20 return function () {
21 context.report({
22 fix: fix,
23 message: message,
24 node: node
25 });
26 };
27 };
28
29 var makeReporters = function makeReporters(node, tokenToFix) {
30 return {
31 dangle: reporter(node, 'Unexpected trailing delimiter', function (fixer) {
32 return fixer.replaceText(tokenToFix, '');
33 }),
34 noDangle: reporter(node, 'Missing trailing delimiter', function (fixer) {
35 return fixer.insertTextAfter(tokenToFix, ',');
36 })
37 };
38 };
39
40 var evaluate = function evaluate(node, lastChildNode) {
41 if (!lastChildNode) {
42 return;
43 }
44
45 var _sourceCode$getLastTo = sourceCode.getLastTokens(node, 2);
46
47 var _sourceCode$getLastTo2 = _slicedToArray(_sourceCode$getLastTo, 2);
48
49 var penultimateToken = _sourceCode$getLastTo2[0];
50 var lastToken = _sourceCode$getLastTo2[1];
51
52
53 var isDangling = [';', ','].indexOf(penultimateToken.value) > -1;
54 var isMultiLine = penultimateToken.loc.start.line !== lastToken.loc.start.line;
55
56 var report = makeReporters(lastChildNode, penultimateToken);
57
58 if (option === 'always' && !isDangling) {
59 report.noDangle();
60
61 return;
62 }
63
64 if (option === 'never' && isDangling) {
65 report.dangle();
66
67 return;
68 }
69
70 if (option === 'always-multiline' && !isDangling && isMultiLine) {
71 report.noDangle();
72
73 return;
74 }
75
76 if (option === 'always-multiline' && isDangling && !isMultiLine) {
77 report.dangle();
78
79 return;
80 }
81
82 if (option === 'only-multiline' && isDangling && !isMultiLine) {
83 report.dangle();
84
85 return;
86 }
87 };
88
89 // required for reporting the correct position
90 var getLast = function getLast(property, indexer) {
91 if (!property) {
92 return indexer;
93 }
94
95 if (!indexer) {
96 return property;
97 }
98
99 if (property.loc.end.line > indexer.loc.end.line) {
100 return property;
101 }
102
103 if (indexer.loc.end.line > property.loc.end.line) {
104 return indexer;
105 }
106
107 if (property.loc.end.column > indexer.loc.end.column) {
108 return property;
109 }
110
111 return indexer;
112 };
113
114 return {
115 ObjectTypeAnnotation: function ObjectTypeAnnotation(node) {
116 evaluate(node, getLast(_lodash2.default.last(node.properties), _lodash2.default.last(node.indexers)));
117 },
118 TupleTypeAnnotation: function TupleTypeAnnotation(node) {
119 evaluate(node, _lodash2.default.last(node.types));
120 }
121 };
122};
123
124module.exports = exports['default'];
\No newline at end of file