diff --git a/.eslintignore b/.eslintignore
index 8da4651306..6b3786a50f 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -2,4 +2,7 @@
**/build/**
**/dist/**
testApp/**
+packages/strapi-plugin-users-permissions/admin/**
+packages/strapi-plugin-upload/admin/**
+packages/strapi-generate-plugin/files/admin/src/**
.eslintrc.js
diff --git a/.eslintrc.js b/.eslintrc.js
index c31e0466f0..48ff3dbae8 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -4,10 +4,9 @@ module.exports = {
'eslint:recommended',
'plugin:react/recommended',
'plugin:redux-saga/recommended',
-
'prettier',
],
- plugins: ['react', 'redux-saga', 'react-hooks', 'import'],
+ plugins: ['react', 'redux-saga', 'react-hooks', 'import', 'jsx-a11y'],
env: {
browser: true,
commonjs: true,
@@ -54,9 +53,87 @@ module.exports = {
overrides: [
{
files: ['packages/**/admin/src/**/**/*.js'],
+ extends: ['airbnb'],
rules: {
- 'no-nested-ternary': ['error'],
+ 'arrow-body-style': 0,
+ 'arrow-parens': 0,
+ camelcase: 0,
+ 'comma-dangle': 0,
+ 'consistent-return': [
+ 2,
+ {
+ treatUndefinedAsUnspecified: true,
+ },
+ ],
+ indent: [
+ 2,
+ 2,
+ {
+ flatTernaryExpressions: false,
+ SwitchCase: 1,
+ ignoredNodes: [
+ 'ConditionalExpression',
+ "VariableDeclarator[kind='const']",
+ ],
+ },
+ ],
+ 'func-names': ['error', 'never'],
+ 'function-paren-newline': 0,
+ 'implicit-arrow-linebreak': 0,
+ 'import/no-extraneous-dependencies': 0,
+ 'import/no-named-as-default': 0,
'import/order': 2,
+ 'jsx-a11y/click-events-have-key-events': 1,
+ 'max-len': [
+ 2,
+ {
+ code: 120,
+ ignoreComments: true,
+ ignoreUrls: true,
+ ignoreTrailingComments: true,
+ ignoreStrings: true,
+ ignoreTemplateLiterals: true,
+ },
+ ],
+ 'newline-before-return': 2,
+ 'no-confusing-arrow': 0,
+ 'no-else-return': 1,
+ 'no-nested-ternary': ['error'],
+ 'no-return-assign': 0,
+ 'no-param-reassign': 0,
+ 'no-shadow': 0,
+ 'no-underscore-dangle': 0,
+ 'no-use-before-define': [
+ 'error',
+ { functions: false, classes: false, variables: false },
+ ],
+ 'object-curly-newline': [2, { multiline: true, consistent: true }],
+ 'operator-linebreak': 0,
+ 'padding-line-between-statements': [
+ 'error',
+ { blankLine: 'always', prev: '*', next: 'if' },
+ { blankLine: 'any', prev: 'block-like', next: 'if' },
+ ],
+ 'prefer-arrow-callback': 0,
+ 'prefer-const': 0,
+ 'prefer-destructuring': 0,
+ 'prefer-object-spread': 0,
+ 'prefer-spread': 0,
+ 'space-before-function-paren': [
+ 'error',
+ {
+ anonymous: 'never',
+ named: 'never',
+ asyncArrow: 'always',
+ },
+ ],
+ 'react/destructuring-assignment': 0,
+ 'react/jsx-filename-extension': [1, { extensions: ['.js', '.jsx'] }],
+ 'react/forbid-prop-types': 0,
+ 'react/jsx-props-no-spreading': 0,
+ 'react/jsx-one-expression-per-line': 0,
+ 'react/state-in-constructor': 0,
+ 'react/static-property-placement': 0,
},
},
],
diff --git a/codecov.yml b/codecov.yml
index e88701a0a6..332f82cc63 100644
--- a/codecov.yml
+++ b/codecov.yml
@@ -1,2 +1,4 @@
comment:
- branch: master
+ branches:
+ - master
+ - develop
diff --git a/examples/getstarted/api/restaurant/models/Restaurant.settings.json b/examples/getstarted/api/restaurant/models/Restaurant.settings.json
index b4f027a6cf..84e2144f5e 100755
--- a/examples/getstarted/api/restaurant/models/Restaurant.settings.json
+++ b/examples/getstarted/api/restaurant/models/Restaurant.settings.json
@@ -81,10 +81,10 @@
"dz": {
"type": "dynamiczone",
"components": [
- "default.closingperiod",
- "default.dish",
"default.openingtimes",
- "default.restaurantservice"
+ "default.restaurantservice",
+ "default.closingperiod",
+ "default.dish"
]
}
}
diff --git a/package.json b/package.json
index 4fbf56343a..9730062a54 100644
--- a/package.json
+++ b/package.json
@@ -11,8 +11,11 @@
"enzyme": "^3.9.0",
"enzyme-adapter-react-16": "^1.12.1",
"eslint": "^6.3.0",
+ "eslint-config-airbnb": "^18.0.1",
+ "eslint-config-airbnb-base": "^14.0.0",
"eslint-config-prettier": "^6.2.0",
"eslint-plugin-import": "^2.19.1",
+ "eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.14.0",
"eslint-plugin-react-hooks": "^2.0.0",
"eslint-plugin-redux-saga": "^1.1.0",
@@ -38,6 +41,7 @@
"build": "lerna run --stream build --no-private",
"lint": "npm-run-all -p lint:code",
"lint:code": "eslint .",
+ "lint:fix": "eslint --fix .",
"lint:other": "npm run prettier:other -- --check",
"format": "npm-run-all -p format:*",
"format:code": "npm run prettier:code -- --write",
diff --git a/packages/strapi-admin/admin/src/app.js b/packages/strapi-admin/admin/src/app.js
index f4184a17fd..ffd6a5d61e 100644
--- a/packages/strapi-admin/admin/src/app.js
+++ b/packages/strapi-admin/admin/src/app.js
@@ -5,6 +5,8 @@
// * Entry point of the application
// */
+/* eslint-disable */
+
import '@babel/polyfill';
import 'sanitize.css/sanitize.css';
diff --git a/packages/strapi-admin/admin/src/components/EmptyList/index.js b/packages/strapi-admin/admin/src/components/EmptyList/index.js
index 4aa4174aa2..c4b5093f5e 100644
--- a/packages/strapi-admin/admin/src/components/EmptyList/index.js
+++ b/packages/strapi-admin/admin/src/components/EmptyList/index.js
@@ -11,16 +11,17 @@ import Wrapper from './Wrapper';
function EmptyList() {
const { formatMessage } = useGlobalContext();
+
return (
{formatMessage({ id: `Settings.webhooks.list.empty.title` })} {formatMessage({ id: `Settings.webhooks.list.empty.description` })} {formatMessage({ id: 'Settings.webhooks.list.empty.title' })} {formatMessage({ id: 'Settings.webhooks.list.empty.description' })}
| + | {headersName.map(header => { return ( |
@@ -89,15 +92,12 @@ const EventInput = ({ onChange, name: inputName, value: inputValue }) => {
);
};
-EventInput.defaultProps = {
- onBlur: () => {},
-};
+EventInput.defaultProps = {};
EventInput.propTypes = {
name: PropTypes.string.isRequired,
- onBlur: PropTypes.func,
onChange: PropTypes.func.isRequired,
- value: PropTypes.array,
+ value: PropTypes.array.isRequired,
};
export default EventInput;
diff --git a/packages/strapi-admin/admin/src/components/HeadersInput/index.js b/packages/strapi-admin/admin/src/components/HeadersInput/index.js
index 6478860619..af117dd574 100644
--- a/packages/strapi-admin/admin/src/components/HeadersInput/index.js
+++ b/packages/strapi-admin/admin/src/components/HeadersInput/index.js
@@ -11,8 +11,10 @@ import getBorderColor from './utils/getBorderColor';
import keys from './keys';
import Wrapper from './Wrapper';
+/* eslint-disable react/no-array-index-key */
+
const HeadersInput = ({ errors, name, onClick, onChange, onRemove, value }) => {
- const formatOption = value => ({ value: value, label: value });
+ const formatOption = value => ({ value, label: value });
const options = keys.map(key => formatOption(key));
const handleChangeKey = (selected, name) => {
diff --git a/packages/strapi-admin/admin/src/components/HeadersInput/utils/getBorderColor.js b/packages/strapi-admin/admin/src/components/HeadersInput/utils/getBorderColor.js
index 501c24e682..b032e59a04 100644
--- a/packages/strapi-admin/admin/src/components/HeadersInput/utils/getBorderColor.js
+++ b/packages/strapi-admin/admin/src/components/HeadersInput/utils/getBorderColor.js
@@ -5,6 +5,7 @@ const getBorderColor = ({ isFocused = false, hasError = false }) => {
if (hasError) {
return '#F64D0A';
}
+
return '#E3E9F3';
};
diff --git a/packages/strapi-admin/admin/src/components/LeftMenuFooter/index.js b/packages/strapi-admin/admin/src/components/LeftMenuFooter/index.js
index 004148090d..48d653fb98 100644
--- a/packages/strapi-admin/admin/src/components/LeftMenuFooter/index.js
+++ b/packages/strapi-admin/admin/src/components/LeftMenuFooter/index.js
@@ -7,12 +7,10 @@
import React from 'react';
import { defineMessages, FormattedMessage } from 'react-intl';
import { PropTypes } from 'prop-types';
-
import LeftMenuLink from '../LeftMenuLink';
-
import Wrapper from './Wrapper';
-
import messages from './messages.json';
+
defineMessages(messages);
function LeftMenuFooter({ version, ...rest }) {
diff --git a/packages/strapi-admin/admin/src/components/LeftMenuLink/index.js b/packages/strapi-admin/admin/src/components/LeftMenuLink/index.js
index 2e3d3ec320..93e2c086d0 100644
--- a/packages/strapi-admin/admin/src/components/LeftMenuLink/index.js
+++ b/packages/strapi-admin/admin/src/components/LeftMenuLink/index.js
@@ -13,6 +13,8 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import en from '../../translations/en.json';
import Li from './Li';
+/* eslint-disable */
+
function LeftMenuLink(props) {
const isLinkActive = startsWith(
props.location.pathname.replace('/admin', '').concat('/'),
diff --git a/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/index.js b/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/index.js
index b49328a2e9..c19cbcc2a4 100644
--- a/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/index.js
+++ b/packages/strapi-admin/admin/src/components/LeftMenuLinkContainer/index.js
@@ -8,11 +8,12 @@ import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
import { get, snakeCase, isEmpty, map, sortBy } from 'lodash';
-
import LeftMenuLink from '../LeftMenuLink';
import Wrapper from './Wrapper';
import messages from './messages.json';
+/* eslint-disable */
+
function LeftMenuLinkContainer({ plugins, ...rest }) {
// Generate the list of sections
const pluginsSections = Object.keys(plugins).reduce((acc, current) => {
diff --git a/packages/strapi-admin/admin/src/components/ListPlugins/index.js b/packages/strapi-admin/admin/src/components/ListPlugins/index.js
index 4c2a14a705..1ada5aef60 100644
--- a/packages/strapi-admin/admin/src/components/ListPlugins/index.js
+++ b/packages/strapi-admin/admin/src/components/ListPlugins/index.js
@@ -15,6 +15,8 @@ import { Button } from 'strapi-helper-plugin';
import Row from '../Row';
import Wrapper from './Wrapper';
+/* eslint-disable react/prefer-stateless-function */
+
class ListPlugins extends React.Component {
render() {
const listSize = size(this.props.plugins);
diff --git a/packages/strapi-admin/admin/src/components/ListRow/index.js b/packages/strapi-admin/admin/src/components/ListRow/index.js
index a0f56f48e9..5422f47a9a 100644
--- a/packages/strapi-admin/admin/src/components/ListRow/index.js
+++ b/packages/strapi-admin/admin/src/components/ListRow/index.js
@@ -55,12 +55,16 @@ function ListRow({
{url} |
- e.stopPropagation()}>
+ e.stopPropagation()}
+ role="button"
+ aria-hidden="true"
+ >
|
diff --git a/packages/strapi-admin/admin/src/components/Notification/index.js b/packages/strapi-admin/admin/src/components/Notification/index.js
index 36c00e7cd5..43a89d7075 100644
--- a/packages/strapi-admin/admin/src/components/Notification/index.js
+++ b/packages/strapi-admin/admin/src/components/Notification/index.js
@@ -3,7 +3,7 @@
* Notification
*
*/
-
+/* eslint-disable */
import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
diff --git a/packages/strapi-admin/admin/src/components/NotificationsContainer/index.js b/packages/strapi-admin/admin/src/components/NotificationsContainer/index.js
index 83cdb4fd85..48bbe62241 100644
--- a/packages/strapi-admin/admin/src/components/NotificationsContainer/index.js
+++ b/packages/strapi-admin/admin/src/components/NotificationsContainer/index.js
@@ -11,6 +11,8 @@ import { CSSTransition } from 'react-transition-group';
import Notification from '../Notification';
import Wrapper from './Wrapper';
+/* eslint-disable */
+
const NotificationsContainer = ({ notifications, onHideNotification }) => {
if (notifications.length === 0) {
return false;
diff --git a/packages/strapi-admin/admin/src/components/OnboardingVideo/index.js b/packages/strapi-admin/admin/src/components/OnboardingVideo/index.js
index 5865ff3770..ddbf89da97 100644
--- a/packages/strapi-admin/admin/src/components/OnboardingVideo/index.js
+++ b/packages/strapi-admin/admin/src/components/OnboardingVideo/index.js
@@ -13,6 +13,8 @@ import { Player } from 'video-react';
import 'video-react/dist/video-react.css';
import Li from './Li';
+/* eslint-disable */
+
class OnboardingVideo extends React.Component {
componentDidMount() {
this.hiddenPlayer.current.subscribeToStateChange(this.handleChangeState);
diff --git a/packages/strapi-admin/admin/src/components/Row/index.js b/packages/strapi-admin/admin/src/components/Row/index.js
index aee786026e..4db6d43cde 100644
--- a/packages/strapi-admin/admin/src/components/Row/index.js
+++ b/packages/strapi-admin/admin/src/components/Row/index.js
@@ -22,6 +22,8 @@ import Content from './Content';
const PLUGINS_WITH_CONFIG = ['email', 'upload'];
+/* eslint-disable */
+
class Row extends React.Component {
static contextType = GlobalContext;
state = { showModal: false };
diff --git a/packages/strapi-admin/admin/src/components/Switch/index.js b/packages/strapi-admin/admin/src/components/Switch/index.js
index 9b64df599f..b819e2464f 100644
--- a/packages/strapi-admin/admin/src/components/Switch/index.js
+++ b/packages/strapi-admin/admin/src/components/Switch/index.js
@@ -20,12 +20,11 @@ function Switch({ name, value, onChange }) {
checked={value}
name={name}
onChange={({ target: { checked } }) =>
- onChange({ target: { name, value: checked } })
- }
+ onChange({ target: { name, value: checked } })}
/>
-
-
+
+
{value
diff --git a/packages/strapi-admin/admin/src/containers/Admin/index.js b/packages/strapi-admin/admin/src/containers/Admin/index.js
index 52488cec69..49e79040a4 100644
--- a/packages/strapi-admin/admin/src/containers/Admin/index.js
+++ b/packages/strapi-admin/admin/src/containers/Admin/index.js
@@ -52,6 +52,14 @@ import Content from './Content';
export class Admin extends React.Component {
// eslint-disable-line react/prefer-stateless-function
+ helpers = {
+ updatePlugin: this.props.updatePlugin,
+ };
+
+ componentDidMount() {
+ this.props.emitEvent('didAccessAuthenticatedAdministration');
+ }
+
shouldComponentUpdate(prevProps) {
return !isEmpty(difference(prevProps, this.props));
}
@@ -70,10 +78,6 @@ export class Admin extends React.Component {
this.props.setAppError();
}
- componentDidMount() {
- this.props.emitEvent('didAccessAuthenticatedAdministration');
- }
-
hasApluginNotReady = props => {
const {
global: { plugins },
@@ -84,10 +88,6 @@ export class Admin extends React.Component {
);
};
- helpers = {
- updatePlugin: this.props.updatePlugin,
- };
-
/**
* Display the app loader until the app is ready
* @returns {Boolean}
@@ -135,10 +135,10 @@ export class Admin extends React.Component {
// We need the admin data in order to make the initializers work
if (this.showLoader()) {
return (
- |
);
diff --git a/packages/strapi-plugin-content-manager/admin/src/components/CustomTable/TableHeader.js b/packages/strapi-plugin-content-manager/admin/src/components/CustomTable/TableHeader.js
index c8c911d43d..e54e7aa06e 100644
--- a/packages/strapi-plugin-content-manager/admin/src/components/CustomTable/TableHeader.js
+++ b/packages/strapi-plugin-content-manager/admin/src/components/CustomTable/TableHeader.js
@@ -5,6 +5,8 @@ import useListView from '../../hooks/useListView';
import CustomInputCheckbox from '../CustomInputCheckbox';
import { Arrow, Thead } from './styledComponents';
+/* eslint-disable jsx-a11y/control-has-associated-label */
+
function TableHeader({ headers, isBulkable }) {
const {
data,
@@ -67,7 +69,7 @@ function TableHeader({ headers, isBulkable }) {
);
})}
- + |
|---|