Blame view

node_modules/eslint-plugin-react/lib/rules/require-extension.js 1.98 KB
c39994410   Ryan Glover   wip converting to...
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
  /**
   * @fileoverview Restrict file extensions that may be required
   * @author Scott Andrews
   */
  'use strict';
  
  var path = require('path');
  
  // ------------------------------------------------------------------------------
  // Constants
  // ------------------------------------------------------------------------------
  
  var DEFAULTS = {
    extentions: ['.jsx']
  };
  
  var PKG_REGEX = /^[^\.]((?!\/).)*$/;
  
  // ------------------------------------------------------------------------------
  // Rule Definition
  // ------------------------------------------------------------------------------
  
  module.exports = function(context) {
  
    function isPackage(id) {
      return PKG_REGEX.test(id);
    }
  
    function isRequire(expression) {
      return expression.callee.name === 'require';
    }
  
    function getId(expression) {
      return expression.arguments[0] && expression.arguments[0].value;
    }
  
    function getExtension(id) {
      return path.extname(id || '');
    }
  
    function getExtentionsConfig() {
      return context.options[0] && context.options[0].extensions || DEFAULTS.extentions;
    }
  
    var forbiddenExtensions = getExtentionsConfig().reduce(function (extensions, extension) {
      extensions[extension] = true;
      return extensions;
    }, Object.create(null));
  
    function isForbiddenExtension(ext) {
      return ext in forbiddenExtensions;
    }
  
    // --------------------------------------------------------------------------
    // Public
    // --------------------------------------------------------------------------
  
    return {
  
      CallExpression: function(node) {
        if (isRequire(node)) {
          var id = getId(node);
          var ext = getExtension(id);
          if (!isPackage(id) && isForbiddenExtension(ext)) {
            context.report(node, 'Unable to require module with extension \'' + ext + '\'');
          }
        }
      }
  
    };
  
  };
  
  module.exports.schema = [{
    type: 'object',
    properties: {
      extensions: {
        type: 'array',
        items: {
          type: 'string'
        }
      }
    },
    additionalProperties: false
  }];