UNPKG

5.66 kBJavaScriptView Raw
1'use strict';
2
3var _docsUrl = require('../docsUrl');
4
5var _docsUrl2 = _interopRequireDefault(_docsUrl);
6
7function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
9module.exports = {
10 meta: {
11 docs: {
12 url: (0, _docsUrl2.default)('no-mutable-exports')
13 }
14 },
15
16 create: function (context) {
17 function checkDeclaration(node) {
18 const kind = node.kind;
19
20 if (kind === 'var' || kind === 'let') {
21 context.report(node, `Exporting mutable '${kind}' binding, use 'const' instead.`);
22 }
23 }
24
25 function checkDeclarationsInScope(_ref, name) {
26 let variables = _ref.variables;
27
28 for (let variable of variables) {
29 if (variable.name === name) {
30 for (let def of variable.defs) {
31 if (def.type === 'Variable' && def.parent) {
32 checkDeclaration(def.parent);
33 }
34 }
35 }
36 }
37 }
38
39 function handleExportDefault(node) {
40 const scope = context.getScope();
41
42 if (node.declaration.name) {
43 checkDeclarationsInScope(scope, node.declaration.name);
44 }
45 }
46
47 function handleExportNamed(node) {
48 const scope = context.getScope();
49
50 if (node.declaration) {
51 checkDeclaration(node.declaration);
52 } else if (!node.source) {
53 for (let specifier of node.specifiers) {
54 checkDeclarationsInScope(scope, specifier.local.name);
55 }
56 }
57 }
58
59 return {
60 'ExportDefaultDeclaration': handleExportDefault,
61 'ExportNamedDeclaration': handleExportNamed
62 };
63 }
64};
65//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJ1bGVzL25vLW11dGFibGUtZXhwb3J0cy5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJjcmVhdGUiLCJjb250ZXh0IiwiY2hlY2tEZWNsYXJhdGlvbiIsIm5vZGUiLCJraW5kIiwicmVwb3J0IiwiY2hlY2tEZWNsYXJhdGlvbnNJblNjb3BlIiwibmFtZSIsInZhcmlhYmxlcyIsInZhcmlhYmxlIiwiZGVmIiwiZGVmcyIsInR5cGUiLCJwYXJlbnQiLCJoYW5kbGVFeHBvcnREZWZhdWx0Iiwic2NvcGUiLCJnZXRTY29wZSIsImRlY2xhcmF0aW9uIiwiaGFuZGxlRXhwb3J0TmFtZWQiLCJzb3VyY2UiLCJzcGVjaWZpZXIiLCJzcGVjaWZpZXJzIiwibG9jYWwiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLG9CQUFSO0FBREQ7QUFERixHQURTOztBQU9mQyxVQUFRLFVBQVVDLE9BQVYsRUFBbUI7QUFDekIsYUFBU0MsZ0JBQVQsQ0FBMEJDLElBQTFCLEVBQWdDO0FBQUEsWUFDdkJDLElBRHVCLEdBQ2ZELElBRGUsQ0FDdkJDLElBRHVCOztBQUU5QixVQUFJQSxTQUFTLEtBQVQsSUFBa0JBLFNBQVMsS0FBL0IsRUFBc0M7QUFDcENILGdCQUFRSSxNQUFSLENBQWVGLElBQWYsRUFBc0Isc0JBQXFCQyxJQUFLLGlDQUFoRDtBQUNEO0FBQ0Y7O0FBRUQsYUFBU0Usd0JBQVQsT0FBK0NDLElBQS9DLEVBQXFEO0FBQUEsVUFBbEJDLFNBQWtCLFFBQWxCQSxTQUFrQjs7QUFDbkQsV0FBSyxJQUFJQyxRQUFULElBQXFCRCxTQUFyQixFQUFnQztBQUM5QixZQUFJQyxTQUFTRixJQUFULEtBQWtCQSxJQUF0QixFQUE0QjtBQUMxQixlQUFLLElBQUlHLEdBQVQsSUFBZ0JELFNBQVNFLElBQXpCLEVBQStCO0FBQzdCLGdCQUFJRCxJQUFJRSxJQUFKLEtBQWEsVUFBYixJQUEyQkYsSUFBSUcsTUFBbkMsRUFBMkM7QUFDekNYLCtCQUFpQlEsSUFBSUcsTUFBckI7QUFDRDtBQUNGO0FBQ0Y7QUFDRjtBQUNGOztBQUVELGFBQVNDLG1CQUFULENBQTZCWCxJQUE3QixFQUFtQztBQUNqQyxZQUFNWSxRQUFRZCxRQUFRZSxRQUFSLEVBQWQ7O0FBRUEsVUFBSWIsS0FBS2MsV0FBTCxDQUFpQlYsSUFBckIsRUFBMkI7QUFDekJELGlDQUF5QlMsS0FBekIsRUFBZ0NaLEtBQUtjLFdBQUwsQ0FBaUJWLElBQWpEO0FBQ0Q7QUFDRjs7QUFFRCxhQUFTVyxpQkFBVCxDQUEyQmYsSUFBM0IsRUFBaUM7QUFDL0IsWUFBTVksUUFBUWQsUUFBUWUsUUFBUixFQUFkOztBQUVBLFVBQUliLEtBQUtjLFdBQVQsRUFBdUI7QUFDckJmLHlCQUFpQkMsS0FBS2MsV0FBdEI7QUFDRCxPQUZELE1BRU8sSUFBSSxDQUFDZCxLQUFLZ0IsTUFBVixFQUFrQjtBQUN2QixhQUFLLElBQUlDLFNBQVQsSUFBc0JqQixLQUFLa0IsVUFBM0IsRUFBdUM7QUFDckNmLG1DQUF5QlMsS0FBekIsRUFBZ0NLLFVBQVVFLEtBQVYsQ0FBZ0JmLElBQWhEO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFdBQU87QUFDTCxrQ0FBNEJPLG1CQUR2QjtBQUVMLGdDQUEwQkk7QUFGckIsS0FBUDtBQUlEO0FBbkRjLENBQWpCIiwiZmlsZSI6InJ1bGVzL25vLW11dGFibGUtZXhwb3J0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1tdXRhYmxlLWV4cG9ydHMnKSxcbiAgICB9LFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBmdW5jdGlvbiBjaGVja0RlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgIGNvbnN0IHtraW5kfSA9IG5vZGVcbiAgICAgIGlmIChraW5kID09PSAndmFyJyB8fCBraW5kID09PSAnbGV0Jykge1xuICAgICAgICBjb250ZXh0LnJlcG9ydChub2RlLCBgRXhwb3J0aW5nIG11dGFibGUgJyR7a2luZH0nIGJpbmRpbmcsIHVzZSAnY29uc3QnIGluc3RlYWQuYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0RlY2xhcmF0aW9uc0luU2NvcGUoe3ZhcmlhYmxlc30sIG5hbWUpIHtcbiAgICAgIGZvciAobGV0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgICBpZiAodmFyaWFibGUubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIGZvciAobGV0IGRlZiBvZiB2YXJpYWJsZS5kZWZzKSB7XG4gICAgICAgICAgICBpZiAoZGVmLnR5cGUgPT09ICdWYXJpYWJsZScgJiYgZGVmLnBhcmVudCkge1xuICAgICAgICAgICAgICBjaGVja0RlY2xhcmF0aW9uKGRlZi5wYXJlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlRXhwb3J0RGVmYXVsdChub2RlKSB7XG4gICAgICBjb25zdCBzY29wZSA9IGNvbnRleHQuZ2V0U2NvcGUoKVxuXG4gICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbi5uYW1lKSB7XG4gICAgICAgIGNoZWNrRGVjbGFyYXRpb25zSW5TY29wZShzY29wZSwgbm9kZS5kZWNsYXJhdGlvbi5uYW1lKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUV4cG9ydE5hbWVkKG5vZGUpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gY29udGV4dC5nZXRTY29wZSgpXG5cbiAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uKSAge1xuICAgICAgICBjaGVja0RlY2xhcmF0aW9uKG5vZGUuZGVjbGFyYXRpb24pXG4gICAgICB9IGVsc2UgaWYgKCFub2RlLnNvdXJjZSkge1xuICAgICAgICBmb3IgKGxldCBzcGVjaWZpZXIgb2Ygbm9kZS5zcGVjaWZpZXJzKSB7XG4gICAgICAgICAgY2hlY2tEZWNsYXJhdGlvbnNJblNjb3BlKHNjb3BlLCBzcGVjaWZpZXIubG9jYWwubmFtZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJzogaGFuZGxlRXhwb3J0RGVmYXVsdCxcbiAgICAgICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJzogaGFuZGxlRXhwb3J0TmFtZWQsXG4gICAgfVxuICB9LFxufVxuIl19
\No newline at end of file