| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | /** * @fileoverview Prevent multiple component definition per file * @author Yannick Croissant */'use strict';const values = require('object.values');const Components = require('../util/Components');const docsUrl = require('../util/docsUrl');const report = require('../util/report');// ------------------------------------------------------------------------------// Rule Definition// ------------------------------------------------------------------------------const messages = {  onlyOneComponent: 'Declare only one React component per file',};module.exports = {  meta: {    docs: {      description: 'Disallow multiple component definition per file',      category: 'Stylistic Issues',      recommended: false,      url: docsUrl('no-multi-comp'),    },    messages,    schema: [{      type: 'object',      properties: {        ignoreStateless: {          default: false,          type: 'boolean',        },      },      additionalProperties: false,    }],  },  create: Components.detect((context, components, utils) => {    const configuration = context.options[0] || {};    const ignoreStateless = configuration.ignoreStateless || false;    /**     * Checks if the component is ignored     * @param {Object} component The component being checked.     * @returns {Boolean} True if the component is ignored, false if not.     */    function isIgnored(component) {      return (        ignoreStateless && (          /Function/.test(component.node.type)          || utils.isPragmaComponentWrapper(component.node)        )      );    }    return {      'Program:exit'() {        if (components.length() <= 1) {          return;        }        values(components.list())          .filter((component) => !isIgnored(component))          .slice(1)          .forEach((component) => {            report(context, messages.onlyOneComponent, 'onlyOneComponent', {              node: component.node,            });          });      },    };  }),};
 |