UNPKG

2.38 kBJavaScriptView Raw
1/**
2 * @fileoverview Prevent usage of setState
3 * @author Mark Dalgleish
4 */
5
6'use strict';
7
8const Components = require('../util/Components');
9const docsUrl = require('../util/docsUrl');
10
11// ------------------------------------------------------------------------------
12// Rule Definition
13// ------------------------------------------------------------------------------
14
15module.exports = {
16 meta: {
17 docs: {
18 description: 'Prevent usage of setState',
19 category: 'Stylistic Issues',
20 recommended: false,
21 url: docsUrl('no-set-state')
22 },
23 schema: []
24 },
25
26 create: Components.detect((context, components, utils) => {
27 /**
28 * Checks if the component is valid
29 * @param {Object} component The component to process
30 * @returns {Boolean} True if the component is valid, false if not.
31 */
32 function isValid(component) {
33 return Boolean(component && !component.useSetState);
34 }
35
36 /**
37 * Reports usages of setState for a given component
38 * @param {Object} component The component to process
39 */
40 function reportSetStateUsages(component) {
41 let setStateUsage;
42 for (let i = 0, j = component.setStateUsages.length; i < j; i++) {
43 setStateUsage = component.setStateUsages[i];
44 context.report({
45 node: setStateUsage,
46 message: 'Do not use setState'
47 });
48 }
49 }
50
51 // --------------------------------------------------------------------------
52 // Public
53 // --------------------------------------------------------------------------
54
55 return {
56
57 CallExpression(node) {
58 const callee = node.callee;
59 if (
60 callee.type !== 'MemberExpression'
61 || callee.object.type !== 'ThisExpression'
62 || callee.property.name !== 'setState'
63 ) {
64 return;
65 }
66 const component = components.get(utils.getParentComponent());
67 const setStateUsages = component && component.setStateUsages || [];
68 setStateUsages.push(callee);
69 components.set(node, {
70 useSetState: true,
71 setStateUsages
72 });
73 },
74
75 'Program:exit'() {
76 const list = components.list();
77 Object.keys(list).filter((component) => !isValid(list[component])).forEach((component) => {
78 reportSetStateUsages(list[component]);
79 });
80 }
81 };
82 })
83};