Blame view
node_modules/eslint-plugin-react/lib/rules/require-extension.js
1.98 KB
c39994410
|
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 }]; |