'use strict';

/* globals module */
module.exports = {
  'plugins': [],
  'env': {
    'browser': true,
    'jquery': true,
    'es6': true
  },

  /**
   * Default globals.
   *
   * These will get ignored automatically.
   *
   * @since  1.1
   */
  'globals': {
    '_': false,
    'ajaxurl': false,
    'Backbone': false,
    'jQuery': false,
    'JSON': false,
    'wp': false,
    'PriorityNavScroller': false,
    'transitionHiddenElement': false,
    'mpAnalyticsTrackingEvent': false,
    'user_account_management_rest': false,
    'tlite': false,
    'ga': false,
    'minnpost_membership_data': false,
    'FontFaceObserver': false
  },

  /**
   * Make sure you have eslint-config-wordpress installed.
   *
   * Install using:
   *
   *     npm install -g eslint-config-wordpress
   *
   * @@since 1.1
   */
  'extends': 'wordpress',

  /**
   * WDS & WordPress Coding Standards for JavaScript.
   *
   * These are the official WDS and WordPress coding standards
   * for JavaScript.
   *
   * The @standard tag tells you which one's are straight from
   * WordPress Core, and which one's are WDS's own.
   *
   * @since  1.1
   * @see    https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/
   */
  'rules': {

    /**
     * Enforce spacing inside array brackets.
     *
     * @standard WDS
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#spacing
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'array-bracket-spacing': [ 'error', 'always' ],

    /**
     * Enforce one true brace style.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#blocks-and-curly-braces
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'brace-style': 'error',

    /**
     * Require camel case names.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#naming-conventions
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'camelcase': [ 'error', {
      properties: 'always'
    } ],

    /**
     * Disallow or enforce trailing commas.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#objects
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'comma-dangle': [ 'error', 'never' ],

    /**
     * Enforce spacing before and after comma.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#objects
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'comma-spacing': 'error',

    /**
     * Enforce one true comma style.
     *
     * @standard WP
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'comma-style': [ 'error', 'last' ],

    /**
     * Encourages use of dot notation whenever possible.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#objects
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'dot-notation': [ 'error', {
      allowKeywords: true,
      allowPattern: '^[a-z]+(_[a-z]+)+$'
    } ],

    /**
     * Enforce newline at the end of file, with no multiple empty lines.
     *
     * @standard WP
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'eol-last': 'error',

    /**
     * Require or disallow spacing between function identifiers and their invocations.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#spacing
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'func-call-spacing': 'off',

    /**
     * Enforces spacing between keys and values in object literal properties.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#spacing
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'key-spacing': [ 'error', {
      beforeColon: false,
      afterColon: true
    } ],

    /**
     * Enforce spacing before and after keywords.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#spacing
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'keyword-spacing': 'error',

    /**
     * Disallow mixed "LF" and "CRLF" as linebreaks.
     *
     * @standard WP
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'linebreak-style': [ 'error', 'unix' ],

    /**
     * Enforces empty lines around comments.
     *
     * @standard WP
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'lines-around-comment': [ 'error', {
      beforeLineComment: true
    } ],

    /**
     * Disallow mixed spaces and tabs for indentation.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#spacing
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'no-mixed-spaces-and-tabs': 'error',

    /**
     * Disallow use of multiline strings.
     *
     * @standard WP
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'no-multi-str': 'error',

    /**
     * Disallow multiple empty lines.
     *
     * @standard WP
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'no-multiple-empty-lines': 'error',

    /**
     * Disallow use of the with statement.
     *
     * @standard WP
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'no-with': 'error',

    /**
     * Require or disallow an newline around variable declarations.
     *
     * @standard WDS
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'one-var-declaration-per-line': [ 'error', 'initializations' ],

    /**
     * Enforce operators to be placed before or after line breaks.
     *
     * @standard WP
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'operator-linebreak': [ 'error', 'after' ],

    /**
     * Require or disallow use of semicolons instead of ASI.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#semicolons
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'semi': [ 'error', 'always' ],

    /**
     * Require or disallow space before blocks.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#spacing
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'space-before-blocks': [ 'error', 'always' ],

    /**
     * Require or disallow space before function opening parenthesis.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#spacing
     *
     * @author Aubrey Portwood
     * @since 1.0
     */
    'space-before-function-paren': [ 'error', 'never' ],

    /**
     * Require or disallow space before blocks.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#spacing
     *
     * @author Aubrey Portwood
     * @since  1.1
     */
    'space-in-parens': [ 'error', 'always' ],

    /**
     * Require spaces around operators.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#spacing
     *
     * @author Aubrey Portwood
     * @since 1.1
     */
    'space-infix-ops': 'error',

    /**
     * Require or disallow spaces before/after unary operators (words on by default, nonwords),
     *
     * @standard WP
     *
     * @author Aubrey Portwood
     * @since  1.1
     */
    'space-unary-ops': [ 'error', {
      overrides: { '!': true }
    } ],

    /**
     * Don't force vars to be on top.
     *
     * In contradiction to WP Coding Standards,
     * we do not require this.
     *
     * @standard WDS
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#declaring-variables-with-var
     *
     * @since  1.1
     * @author Aubrey Portwood
     */
    'vars-on-top': 'off',

    /**
     * Require or disallow Yoda conditions.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#yoda-conditions
     *
     * @since  1.0
     * @author Aubrey Portwood
     */
    'yoda': [ 'error', 'always' ],

    /**
     * Always show an error when a variable is created that is never used.
     *
     * @standard WP
     *
     * @author Aubrey Portwood
     * @since  1.1
     */
    'no-unused-vars': 'error',

    /**
     * No use of console.
     *
     * Use of console can be done safely with checking
     * window.console and running it from there.
     *
     * @standard WDS
     *
     * @author Aubrey Portwood
     * @since  1.1
     */
    'no-console': 'error',

    /**
     * No use of debugger.
     *
     * This is because we often can leave it in the code,
     * this draws a nice red line around it.
     *
     * @standard WDS
     *
     * @since  1.1
     * @author Aubrey Portwood
     */
    'no-debugger': 'error',

    /**
     * Require valid jsdoc blocks.
     *
     * @standard WDS
     *
     * @since  1.1
     * @author Aubrey Portwood
     */
    'valid-jsdoc': [ 'error', {

      // If and only if the function or method has a return statement (this option value does apply to constructors)
      'requireReturn': false
    } ],

    /**
     * Require docblocks.
     *
     * @standard WDS
     *
     * @since  1.1
     * @author Aubrey Portwood
     */
    'require-jsdoc': 0,

    /**
     * Require that typeof tests use proper strings.
     *
     * @standard WDS
     *
     * e.g. undefined === typeof var will fail,
     * while 'undefined' === typeof var will pass.
     *
     * @since  1.1
     * @author Aubrey Portwood
     */
    'valid-typeof': 'warn',

    /**
     * Enforce declarations not expressions.
     *
     * @standard WDS
     *
     * @since  1.1
     * @author Aubrey Portwood
     */
    'func-style': [ 'error', 'declaration' ],

    /**
     * Require == and !== where necessary.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#equality
     *
     * @author Aubrey Portwood
     * @since  1.1
     */
    'eqeqeq': 'error',

    /**
     * Require that braces be used.
     *
     * @standard WP
     *
     * E.g.
     *
     *     if ( foo ) return;
     *
     * would be bad, but
     *
     *     if ( foo ) {
     *         return;
     *     }
     *
     * would pass.
     *
     * @author Aubrey Portwood
     * @since  1.1
     */
    'curly': 'error',

    /**
     * Disallow null comparisons without type-checking operators.
     *
     * @standard WP
     *
     * @since  1.1
     * @author Aubrey Portwood
     */
    'no-eq-null': 'error',

    /**
     * Must use radix in parseInt.
     *
     * @standard WDS
     *
     * e.g.
     *
     *     var a = 1.22;
     *     var b = parseInt( a, 10 ); // Radix used here
     *
     * @author Aubrey Portwood
     * @since  1.1
     */
    'radix': 'error',

    /**
     * Force undefined variables to be in globals.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#globals
     *
     * E.g.
     *
     *     function a() {
     *
     *         // Below jQuery is undefined as it's included as a library.
     *         return jQuery( '#id' );
     *     }
     *
     * To fix:
     *
     *     // globals jQuery;
     *
     *     function a() {
     *
     *         // Below jQuery is undefined as it's included as a library.
     *         return jQuery( '#id' );
     *     }
     *
     * @author Aubrey Portwood
     * @since 1.1
     */
    'no-undef': 'error',

    /**
     * camelCaseAllTheThings.
     *
     * @standard WP
     * @see      https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/#naming-conventions
     *
     * @author Aubrey Portwood
     * @since  1.1
     */
    'camelcase': 'error'
  }
};
