UNPKG

bloom-layout

Version:
92 lines (75 loc) 2.25 kB
/** * @fileoverview Restrict file extensions that may contain JSX * @author Joe Lencioni */ 'use strict'; const path = require('path'); const docsUrl = require('../util/docsUrl'); // ------------------------------------------------------------------------------ // Constants // ------------------------------------------------------------------------------ const DEFAULTS = { extensions: ['.jsx'] }; // ------------------------------------------------------------------------------ // Rule Definition // ------------------------------------------------------------------------------ module.exports = { meta: { docs: { description: 'Restrict file extensions that may contain JSX', category: 'Stylistic Issues', recommended: false, url: docsUrl('jsx-filename-extension') }, schema: [{ type: 'object', properties: { extensions: { type: 'array', items: { type: 'string' } } }, additionalProperties: false }] }, create: function(context) { function getExtensionsConfig() { return context.options[0] && context.options[0].extensions || DEFAULTS.extensions; } let invalidExtension; let invalidNode; // -------------------------------------------------------------------------- // Public // -------------------------------------------------------------------------- return { JSXElement: function(node) { const filename = context.getFilename(); if (filename === '<text>') { return; } if (invalidNode) { return; } const allowedExtensions = getExtensionsConfig(); const isAllowedExtension = allowedExtensions.some(extension => filename.slice(-extension.length) === extension); if (isAllowedExtension) { return; } invalidNode = node; invalidExtension = path.extname(filename); }, 'Program:exit': function() { if (!invalidNode) { return; } context.report({ node: invalidNode, message: `JSX not allowed in files with extension '${invalidExtension}'` }); } }; } };